Eu estou tentando escrever uma função simples do bash que usa, como argumentos, vários arquivos e / ou diretórios. Deveria:
- Qualifique totalmente os nomes de arquivos.
- Classifique-os.
- Remova duplicatas.
- Imprima tudo o que realmente existe.
- Retorne o número de arquivos inexistentes.
Eu tenho um script que quase faz o que eu quero, mas cai na classificação. O valor de retorno do script como está está correto, mas a saída não é (não classificada e duplicada). Se eu descomentar a | sort -u
instrução conforme indicado, a saída está correta, mas o valor de retorno é sempre 0
.
NB Soluções mais simples para resolver o problema são bem-vindas, mas a questão é realmente sobre por que isso está ocorrendo no código que tenho. Ou seja, por que adicionar o pipe aparentemente interrompe o script que incrementa a variável r
?
Aqui está o script:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
parafor arg
. "Se 'em PALAVRAS ...;' não está presente, então 'in "$ @"' é assumido. " - help forRespostas:
Esta é uma armadilha conhecida do bash, devido a este recurso :
para que as variáveis modificadas sejam locais no subshell e não sejam visíveis novamente no pai.
Para evitar isso, reformule seu código para evitar o pipeline, com uma substituição de processo:
fonte
>(..command..)
construção. Eu acho que eu sei como ele funciona, mas sinto que eu deveria fazer alguma leitura adicional.As
| sort -u
forças do bit anterior (assim que o todo for loop) para executar em um sub-processo (bash precisa de um 'STDOUT' para redirecionar para osort
'stdin'. (Internet parece pensarksh
ebash
lidar com este caso de forma ligeiramente diferente .. primeira ou a última comando na sequência de pipe é colocado em um subshell?)Este tópico aborda um problema semelhante e tem uma solução interessante no final: http://ubuntuforums.org/showthread.php?t=312017
excertofonte