Você não precisa executar outro shell para fazer isso. Para lidar com todos os arquivos que correspondem à expressão glob, basta usar o glob na linha de comando do programa que você deseja executar no final:
convert *.png -whatever /some/output/path
Se você precisar acessar apenas parte dos arquivos, armazene-os em uma matriz e divida-os ou indexe-os:
files=(*.png)
convert "${files[0]}" "${files[@]:1}" -evaluate-sequence "$var1" ../out2/"${files[0]}"
( "${files[0]}"
é o primeiro nome do arquivo, "${files[@]:1}"
se expande para todos os outros)
De lá, podemos processar os arquivos cem por vez:
for (( i=0; i < "${#files[@]}" ; i+=100 )); do
convert "${files[@]:i:100}" -evaluate-sequence "$var1" ../out2/"${files[i]}"
done
Isto é, se eu interpretei o comando xargs
corretamente. Parece passar o primeiro nome de arquivo como o argumento zeroth para sh -c
(geralmente como o nome do shell).
Mas, para responder à pergunta que você pediu, você pode export
da variável para torná-la visível para o shell interno ou colocá-la entre aspas duplas para que ela seja expandida pelo shell externo. Por exemplo.
var=foo
export var
echo bar | xargs sh -c 'echo "$var" "$1"' sh
ou
var=foo
echo bar | xargs sh -c "echo '$var' "'"$1"' sh
Ambas as saídas foo bar
. Passar pelo ambiente é melhor porque a sintaxe é mais limpa (observe os diferentes tipos de aspas em torno de $var
e $1
no último), e quaisquer citações no valor da variável não causarão problemas, como no segundo caso.