En general, recomendaría seguir la forma de hacer las cosas de Bourne-SHell , ya que bash es posiblemente el shell de Unix más popular que existe. Bash generalmente usa &>
o 2>&1
. En mi humilde opinión, ninguno de los dos es "perfecto", así que recomiendo olvidarse de esas tonterías. Siendo realistas, cuál debe usar depende de lo que esté tratando de hacer.
2>&1
combina stderr con stdout, lo que puede ser útil si, por ejemplo, desea canalizar texto stderr. Entonces, por ejemplo, si desea ver si un programa imprime un determinado mensaje stderr, pero no desea que su pantalla se llene de basura (presumiblemente) sin importancia, puede hacer algo como program 2>&1 | grep crashed
, que buscará stdout y stderr desde un programa llamado "programa" para la palabra "bloqueado".
Por otro lado, si no desea que un programa imprima nada, simplemente puede ejecutar program &> /dev/null
, lo que redirigirá tanto stderr como stdout a / dev / null, un archivo especial que mágicamente hace que las cosas desaparezcan. O, si desea guardar la salida de un programa (tal vez para informar un error o algo), puede redirigir tanto stderr como stdout a un archivo: program &> log.txt
redirigirá todos los datos a un archivo llamado "log.txt". Si lo desea, puede redirigir stdout y stderr a través de program 2> log.txt > log.txt
o program 2>&1 | cat > log.txt
, los cuales tendrían el mismo efecto que usar &>
. Si hace algo así program 2>&1 > file
, solo se redireccionará stdout, pero stderr aún se puede canalizar a otro programa, como cat, que podría redirigirse como se muestra arriba. Sin embargo, escribiendo&>
es más fácil que cualquiera de los ejemplos anteriores, ya que implica escribir menos caracteres (y es un poco más fácil de leer para los seres humanos). Tenga en cuenta que program 2> log.txt > log.txt
podría ser más probable que funcione en shells que no sean bash.
PD: si te preocupa que las personas usen otros shells, hay algo que puedes agregar a la primera línea de tu script llamado "número mágico" o "shebang". Esta es esencialmente una forma de asegurarse de que otras computadoras (particularmente aquellas que ejecutan sistemas operativos tipo Unix) sepan qué programa usar para ejecutar un script. Diferentes scripts usan diferentes shebangs. Un shebang para un script bash se ve así:
#!/bin/bash
Si usa lo anterior como la primera línea de un script dado, bash generalmente se usará para ejecutar dicho script. Esto hará que sea mucho más difícil para alguien ejecutar accidentalmente el script con el shell incorrecto.
PD: No voy a mentir: hasta ahora, no sabía que se podía usar >&
, pero, en lo que respecta a bash, parece hacer lo mismo &>
. Tu aprendes algo nuevo cada dia.