Estoy tratando de obtener la última fecha de modificación de un archivo con este comando
TM_LOCAL=`ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
TM_LOCAL tiene un valor como "2012-05-16 23:18" después de la ejecución de esta línea
También me gustaría verificar PIPESTATUS para ver si hubo un error. Por ejemplo, si el archivo no existe, ls
devuelve 2. Pero $?
tiene el valor 0 ya que tiene el valor de retorno de awk
.
Si ejecuto este comando solo, puedo verificar el valor de retorno de ls mirando ${PIPESTATUS[0]}
ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'
Pero $PIPESTATUS
no funciona como esperaba si asigno la salida a una variable como en el primer ejemplo. En este caso, la $PIPESTATUS
matriz tiene solo 1 elemento que es igual a$?
Entonces, la pregunta es, ¿cómo puedo obtener ambos $PIPESTATUS
y asignar la salida a una variable al mismo tiempo?
Uso
set -o pipefail
debash
conseguir el código de salida más a la derecha que no sea cero en una secuencia de comandos como por tubería$?
. Deman bash
:Entonces puedes simplemente acceder
$?
. Useset +o pipefail
para deshabilitar nuevamente.fuente
Supongo que el problema aquí es que PIPESTATUS desaparece por completo tan pronto como ejecutas un comando. Puede obtener la matriz PIPESTATUS completa en la versión bash 2 o superior de esta manera:
A continuación, el acceso
${status[0]}
,${status[1]}
etc.fuente
El principal problema con "lo que espera" es que un comando en comillas inversas se ejecuta en una subshell;
$PIPESTATUS
existe allí y el estado devuelto por ellos sigue las mismas reglas que si ejecutara un solo ejecutable (o script de shell). El estado del comando backquote es el estado más a la derecha (awk
).Para implementar lo que dijo @ Daniel Beck , configure la
pipefail
opción en el subshell de esta manera:TM_LOCAL=`set -o pipefail; ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
ahora el estado almacenado$?
posteriormente será el estado dels
(si no es cero).Sin embargo, creo que una
if [ -f ~/.vimrc ];
prueba explícita ... sería más legible.No puede obtener el resultado en una variable y
PIPESTATUS
devolverlo sin un archivo temporal para el primero o sin ordenar el último en una cadena.fuente
Quería enviar correos electrónicos fron cron solo si el estado de salida no era cero
El truco es que para obtener el stdin para el final de la tubería, debe colocarlo en una subcapa, pero eso parece ocultar el valor de PIPESTATUS ...
prueba cron escupe alguna salida y sale con 1 o 0 ..
ACTUALIZACIÓN: el PIPESTATUS no es visible hasta que se procese el comando de canalización
fuente
Una opción es verificar la existencia de su archivo antes de obtener su hora de modificación con una llamada a
stat
. Comostat
devuelve un poco más de lo que desea en la marca de tiempo, puede recortarlo mediante la expansión de parámetros.Con GNU
stat
(por ejemplo, en Linux), puede ejecutar:En Mac OS X y otros sistemas BSD, la
stat
sintaxis difiere y puede especificar un formato de hora:fuente
$TM_LOCAL
es seguro. Solo es seguro si esperaba que no tuviera un valor anterior. Digamos que el valor era anteriormente2020-02-27 17:14
y no hay~/.vimrc
archivo. Entonces lo habrías hecho2020-02-27 17
. Por lo tanto, encadenaría esas dos líneas con&&
unaif
estrofa adicional o (preferiblemente ya que no es tan legible) .