
Soy realmente nuevo en Unix y actualmente necesito crear un alias que verifique si un archivo es regular y legible. Si es irregular, entonces necesito devolver 1 como código de salida y no probar si es legible. Si es ilegible, necesito devolver 2 como código de salida.
alias test="if [ ! -f filename ] ; then echo 'Irregular file'; exit 1 ; fi; if [ ! -r filename ]; then echo 'Unreadable file'; exit 2; fi;
El problema ahora es que cuando lo ejecuto, la salida cerrará todo mi cliente. ¿Alguna forma de solucionar esto?
Respuesta1
Como este es el primer enlace al hacer una búsqueda en Google:
Si envuelve la salida entre paréntesis
(exit 2)
luego establecerá un código de retorno al salir del subshell entre corchetes y no saldrá de su shell actual. Luego puedes probar ese código usando $? como normal
alias mytest="if [ ! -f filename ] ; then echo 'Irregular file'; (exit 1) ; elif [ ! -r filename ]; then echo 'Unreadable file'; (exit 2); fi"
Respuesta2
Una función de Shell debería poder tener return
un valor que desee:
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
Además, test
es un nombre horrible para un alias o una función, ya que es una utilidad estándar (integrada).
Me doy cuenta de que ese alias es una elección terrible, pero actualmente un profesor lo exige.
Bien, esto cambia un poco las cosas. Mi sugerencia sería mostrarle al profesor una solución más adecuada y explicarle por qué la simple no funciona.
Pero en caso de que eso no funcione, y realmentedebeuse un alias, considere que el valor de retorno es en realidad solo el valor de retorno del último comando que se ejecutó. Deberías poder configurar algo que devuelva el valor que deseas...
(Si se trata de tarea, no creo que sea justo dar una solución completa de inmediato. Spoilers a continuación).
Sugerencia: ya utilizó un comando que devuelve un valor arbitrario.
Respuesta3
alias
Es una mala elección aquí. Coloque esas líneas en un archivo 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á según lo previsto.