
Sou realmente novo no Unix e atualmente preciso criar um alias que verifique se um arquivo é regular e legível. Se for irregular, preciso retornar 1 como código de saída e não testar se está legível. Se estiver ilegível, preciso retornar 2 como código de saída.
alias test="if [ ! -f filename ] ; then echo 'Irregular file'; exit 1 ; fi; if [ ! -r filename ]; then echo 'Unreadable file'; exit 2; fi;
O problema é que agora, quando eu executá-lo, a saída fechará todo o meu cliente. Alguma forma de contornar isso?
Responder1
Como este é o primeiro link ao fazer uma pesquisa no Google:
Se você colocar a saída entre colchetes
(exit 2)
então ele definirá um código de retorno saindo do subshell entre colchetes e não sairá do shell atual. Você pode então testar esse código usando $? normalmente
alias mytest="if [ ! -f filename ] ; then echo 'Irregular file'; (exit 1) ; elif [ ! -r filename ]; then echo 'Unreadable file'; (exit 2); fi"
Responder2
Uma função shell deve ser capaz de obter return
um valor que você goste:
checktype() {
if [ ! -f "$1" ] ; then
echo 'Irregular file'
return 1
fi
if [ ! -r "$1" ]; then
echo 'Unreadable file'
return 2
fi
return 0
}
$ checktype /dev/stdin ; echo $?
Irregular file
1
Além disso, test
é um nome horrível para um alias ou função, já que é um utilitário padrão (integrado).
Sei que o alias é uma escolha terrível, mas atualmente está sendo exigido por um professor.
Ok, isso muda um pouco as coisas. Minha sugestão seria mostrar ao professor uma solução mais adequada e explicar por que a simples não funciona.
Mas caso isso não funcione, e você realmentedeveuse um alias, considere que o valor de retorno é, na verdade, apenas o valor de retorno do último comando que foi executado. Você deve ser capaz de montar algo que retorne o valor que você deseja ...
(Se for lição de casa, não acho que seria justo fornecer uma solução completa imediatamente. Spoilers abaixo.)
Dica: você já usou um comando que retorna um valor arbitrário.
Responder3
alias
é uma má escolha aqui. Coloque essas linhas em um arquivo de script bash.
#!/bin/bash
if [ ! -f filename ];
then echo 'Irregular file'; exit 1 ;
fi;
if [ ! -r filename ];
then echo 'Unreadable file'; exit 2;
fi;
Funcionará conforme planejado.