Chcete zlepšit tuto otázku? Aktualizujte otázku, aby na ni bylo možné odpovědět pomocí faktů a citací úpravou tohoto příspěvku.
Zavřeno před 7 lety.
Vylepšete tuto otázku
Předpokládejme, že máte následující problém:
V závislosti na tom, zda je skript spuštěn v kanálu nebo ne, chcete připojit -print0
parametr find
.
Napadají mě alespoň dva způsoby, jak to udělat:
[[ -p '/dev/stdin' ]] && local null_terminated='-print0'
find -mindepth 1 -maxdepth 1 ! ( "${args[@]}" ) "$null_terminated"
Nebo
if [[ -p '/dev/stdin' ]]; then
find -mindepth 1 -maxdepth 1 ! ( "${args[@]}" ) -print0
else
find -mindepth 1 -maxdepth 1 ! ( "${args[@]}" )
fi
Existuje nějaký lepší způsob, jak to udělat? Otázka je pro bash
, ale řešení pro jiné shelly nebo přenosné/standardní sh
řešení by byla také vítána.
Přijatá odpověď:
První nebude fungovat jako $null_terminated
je prázdný nebo není nastaven, find
bude si stěžovat na ten prázdný argument navíc.
find -mindepth 1 -maxdepth 1 ! ( "${args[@]}" ) $null_terminated
Fungovalo by to, ale pouze pokud by $null_terminated
neobsahuje žádné zástupné znaky ani znaky z IFS.
Dělám to:
if [[ -p '/dev/stdin' ]]; then
extra_args=(-print0)
else
extra_args=()
fi
find -mindepth 1 -maxdepth 1 ! ( "${args[@]}" ) "${extra_args[@]}"
nebude mít problém.
Bourne/POSIXly, můžete udělat:
set -- najít . ! -název . - prořezávat! ( "[e-mail chráněný]" )[ -p /dev/stdin ] &&set -- "[e-mail chráněný]" -exec printf '%s