bash: ¿Cómo puedo suprimir el mensaje de error de una redirección fallida en UNIX?

CorePress2024-01-25  10

Estoy intentando que mi código devuelva el número de líneas del archivo gold o 0 si el archivo no existe. Tendré otra línea más adelante que puede crear el archivo gold, pero no quiero que se muestre el mensaje de error que dice que el archivo no existe.

lrwxrwxrwx 1 usuario Ninguno 9 27 de marzo 01:00 X -> /dev/nulo

wc -l< ~/PA2/habitaciones/tesoro/oro 2> ~/X/en blanco || eco 0

Con el código tal como está, devuelve el mensaje de error y luego 0.

$ wc -l< ~/PA2/rooms/treasureRoom/gold 2> ~/X/blank || echo 0
-bash: /home/User/PA2/rooms/treasureRoom/gold: No such file or directory
0

¿Cómo puedo evitar que se muestre el error?



------------------------------------

Imagino que esto es parte de un script, en cuyo caso puedes usar un shfunción ell:

function line_count {
    typeset filename=""
    if [[ -a "$filename" && -f "$filename" ]]
    then
        wc -l < "$filename"
    else
        echo 0
    fi
}

En el condicional, -a comprueba que el archivo existe y -f comprueba que sea un archivo simple (no un directorio o dispositivo).

Una solución aún más simple, si vas a crear el archivo gold de todos modos, es tocarlo de antemano, lo que lo crea como un archivo de 0 bytes si no existe. Advertencia: si el archivo existe, al tocarlo se actualiza la hora de su última modificación:

touch ~/PA2/rooms/treasureRoom/gold
wc -l < ~/PA2/rooms/treasureRoom/gold

5

¿Por qué no utilizar sólo -f? Devolverá falso si el archivo no existe, por lo que no hay motivo para agregar -a antes.

- Charles Duffy

28/03/2021 a las 15:08

Además, tenga en cuenta la entrada en la última tabla en wiki.bash-hackers.org/scripting/obsolete sobre: ​​la palabra clave de función.

- Charles Duffy

28/03/2021 a las 15:11

Por cierto, se puede ejecutar >>file como su propio comando con resultados similares al tacto pero con menos pesobrecarga de rendimiento (ya que no es necesario involucrar ningún ejecutable externo al shell).

- Charles Duffy

28/03/2021 a las 15:15

@CharlesDuffy En cuanto a -f y omitir -a, tienes razón. Con respecto a la palabra clave de función, la sintaxis que he usado es la segunda sintaxis de reemplazo en el gráfico que ha vinculado. Esto es más moderno y, cuando se trabaja con otros shells (ksh, probablemente zsh), la sintaxis de la función utiliza un comportamiento de alcance variable diferente y preferible en esos shells.

- Perette

28/03/2021 a las 15:18

La sintaxis que utilizó es el segundo reemplazo en el primer cuadro; Mi intención era llamar su atención sobre el tercer gráfico. Si uno quiere variables locales, la única forma confiable de lograrlo es declararlas explícitamente. (Incluso en ksh, la función cambia el significado de tipografía, por lo que aún es necesario usar tipografía; también se podría optar por la ruta más portátil entre shells recientes y usar local, que incluso admite ash y guión con la sintaxis de declaración estándar POSIX ).

- Charles Duffy

28/03/2021 a las 15:23



------------------------------------

Coloque el código con la redirección que desea silenciar en un grupo y redirija stderr para todo el grupo de comandos.

{ wc -l <~/PA2/rooms/treasureRoom/gold; } 2>/dev/null || echo 0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare