zsh
não expande globbings em variáveis, a menos que seja informado com a sintaxe $~PATTERN
.
Eu escreveria:
#! /bin/sh -
head -n -- "$1"
cat -- "$@"
E use-o como:
my-script /some/path/*.csv > output.csv
Dessa forma, você ainda pode pós-processar a saída do seu script, e o globbing é feito no shell do usuário. Agora, se você quer que o globbing seja feito pelo script, por exemplo, para superar o limite de "muitos args" ou porque você quer um zsh globbing independentemente do shell dos usuários, e se você quer que o script escreva o arquivo de saída (por exemplo, para impedir que surja como um arquivo de entrada ou não criá-lo, se não houver arquivo de entrada), você precisaria escrevê-lo:
#! /bin/zsh -
files=(${~1?}) output=${2?}
head -n 1 -- $files[1]
printf '%s#! /bin/zsh -
files=(${~1?}) output=${2?}
head -n 1 -- $files[1]
autoload zargs
zargs --eof= -- $files '' cat -- > $output
' $files | xargs -r0 cat -- > $output
Ou com zsh
' zargs
:
#! /bin/zsh -
setopt extendedglob
files=(${~1?}) output=${2?}
cat < $files[1]
autoload zargs
zargs --eof= -- $files[2,-1] '' tail -qn +2 -- > $output
Agora, não tenho certeza de que seja realmente o que você quer, pois isso significa que o "cabeçalho" será exibido duas vezes. Observe também que arquivos chamados -
podem ser um problema.
Talvez você realmente queira (com a cauda do GNU):
#! /bin/sh -
head -n -- "$1"
cat -- "$@"
(aqui usando o extendedglob para que você se beneficie do zsh globbing completo).