
Estoy mirando el código shell de un compañero de trabajo y vi esto:
date 2&>$0
Sé lo que hace la fecha, pero ¿qué hace 2&>$0? Estará fuera por un tiempo, así que no puedo preguntarle de qué se trata esta parte.
Respuesta1
Suponiendo que el código que publicaste es correcto, lo que hace es muy extraño. Él:
- Carreras
date 2
, que no es una invocación válidadate
y que producirá un mensaje de error, entonces - Redirige tanto su salida estándar como su error estándar.con
&>
, - En el archivo que contiene el script en ejecución (
$0
), borrando su contenido existente.
Debido a que la forma en que Bash lee el script es tomar una línea a la vez del archivo, eso da como resultado que el archivo sobrescrito no tenga sentido y probablemente salga (porque el archivo se ha truncado a un punto más corto que el punto en el que apareció esta línea) o dando un error de sintaxis (si el original era muy corto y parte del error se lee en la siguiente línea).
No puedo pensar en un solo uso legítimo para esa línea, pero como dices, la has dado exactamente como está escrita, eso es lo que hace.
Estrictamente hablando, es posible darle otro valor $0
y ejecutar este código de manera no destructiva invocando a Bash con la -c
opción: bash -c "$(<test.bash)" output-file
colocará el mensaje de error en output-file
, pero es completamente perverso hacerlo.
Respuesta2
Resumen
En bash
, si ese comando está en un script, el archivo del script se sobrescribirá con un mensaje de error.
Ejemplo
Considere el guión:
$ cat test.sh
date 2&>$0
Ahora, ejecuta el script:
$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file
Observe los nuevos contenidos del guión:
$ cat test.sh
date: invalid date `2'
Explicación
El comando, date 2&>$0
se interpreta de la siguiente manera:
El
date
comando se ejecuta con argumento.2
Toda la salida, tanto stdout como stderr, del comando date se redirige al archivo
$0
.$0
es el nombre del script actual.El símbolo
>
indica la redirección de, de forma predeterminada, stdout. Comobash
extensión, el símbolo&>
es un atajo que indica la redirección deambossalida estándar y stderr. En consecuencia, tanto stdout como stderr se redirigen al archivo$0
.Una vez que se sobrescribe el archivo de secuencia de comandos, ya no es una secuencia de comandos válida y
bash
se quejará de los comandos con formato incorrecto.
Diferencia entre bash
shells y POSIX
Con un shell POSIX simple, como dash
, el acceso directo &>
no es compatible. Por lo tanto, el comando date 2&>$0
redirigirásolosalida estándar al archivo $0
. En este caso, eso significa que el archivo de script se sobrescribe con un archivo vacío mientras que el date
mensaje de error aparecerá en la terminal.