Tenho um script que espera arquivos como argumentos, e para cada um executa um conjunto de instruções. Como devo escrevê-lo para poder canalizá-lo find
? No exemplo abaixo, eu não usei find
como tal. Suponho que sua saída tenha a mesma estrutura que printf "%s\n..."
(não é?)
my-script.sh
:
# !/bin/bash
help()
{
echo "help"
echo
}
while [[ $# -gt 0 ]]
do
case $1 in
*)
echo "$1"
shift # past argument
;;
esac
done
Multar:
$ cat foo; echo; cat bar
foo
bar
$ ./my-script.sh foo bar
foo
bar
Mas então:
$ printf "%s\n%s\n" "./foo" "./bar" | xargs -n 1 ./my-script.sh
./my-script.sh: 9: ./my-script.sh: [[: not found
./my-script.sh: 9: ./my-script.sh: [[: not found
Seu shebang
é inválido (parece apenas um comentário). Espaços em branco são permitidos após o
#!
, mas não entre o#
e o!
.Por causa disso, o script executado via
xargs
está sendo interpretado por/bin/sh
- que não suporta a[[ ... ]]
sintaxe de teste estendida (originalmente deksh
).Quando você executa o script diretamente de seu shell interativo em vez de via
xargs
, é provável que ele seja interpretado por um shell filho bash. Consulte Qual interpretador de shell executa um script sem shebang?