¿Qué hace la `fecha 2&>$0`?

¿Qué hace la `fecha 2&>$0`?

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:

  • Carrerasdate 2, que no es una invocación válida datey 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 $0y ejecutar este código de manera no destructiva invocando a Bash con la -copción: bash -c "$(<test.bash)" output-filecolocará 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&>$0se interpreta de la siguiente manera:

  1. El datecomando se ejecuta con argumento.2

  2. Toda la salida, tanto stdout como stderr, del comando date se redirige al archivo $0. $0es el nombre del script actual.

    El símbolo >indica la redirección de, de forma predeterminada, stdout. Como bashextensió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.

  3. Una vez que se sobrescribe el archivo de secuencia de comandos, ya no es una secuencia de comandos válida y bashse quejará de los comandos con formato incorrecto.

Diferencia entre bashshells y POSIX

Con un shell POSIX simple, como dash, el acceso directo &>no es compatible. Por lo tanto, el comando date 2&>$0redirigirá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 datemensaje de error aparecerá en la terminal.

información relacionada