Я пытаюсь получить дату последнего изменения файла с помощью этой команды
TM_LOCAL=`ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
TM_LOCAL имеет значение типа "2012-05-16 23:18" после выполнения этой строки
Я также хотел бы проверить PIPESTATUS, чтобы увидеть, если была ошибка. Например, если файл не существует, ls
возвращает 2. Но $?
имеет значение 0, поскольку имеет возвращаемое значение awk
.
Если я запускаю эту команду в одиночку, я могу проверить возвращаемое значение ls, посмотрев на ${PIPESTATUS[0]}
ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'
Но $PIPESTATUS
не работает, как я ожидал, если я назначу вывод переменной, как в первом примере. В этом случае $PIPESTATUS
массив имеет только 1 элемент, который совпадает с$?
Итак, вопрос в том, как я могу получить оба $PIPESTATUS
и назначить вывод переменной одновременно?
Использование
set -o pipefail
в ,bash
чтобы получить код выхода самого правой ненулевого в централизованному последовательности команд , как$?
. Отman bash
:Тогда вы можете просто получить доступ
$?
. Используйте,set +o pipefail
чтобы отключить снова.источник
Я предполагаю, что проблема заключается в том, что PIPESTATUS полностью исчезает, как только вы выполняете команду. Вы можете получить полный массив PIPESTATUS в bash версии 2 или выше:
Тогда доступа
${status[0]}
,${status[1]}
и т.д.источник
Основная проблема с «тем, что вы ожидаете», заключается в том, что команда в обратных кавычках выполняется в подоболочке;
$PIPESTATUS
существует там, и статус, возвращаемый из m, следует тем же правилам, что и при выполнении одного исполняемого файла (или сценария оболочки). Статус команды backquote является самым правым (awk
).Чтобы реализовать то, что сказал @ Daniel Beck , установите
pipefail
параметр в подоболочке следующим образом:TM_LOCAL=`set -o pipefail; ls -l --time-style=long-iso ~/.vimrc | awk '{ print $6" "$7 }'`
теперь статус, сохраненный в$?
последующем, будет статусомls
(если не ноль).Тем не менее, я думаю, что явный
if [ -f ~/.vimrc ];
... тест был бы более читабельным.Вы не можете получить вывод в переменную и
PIPESTATUS
вернуть его без временного файла для первого или маршалинга последнего в строку.источник
Я хотел отправить электронное письмо от fron cron, только если статус выхода не был нулевым
Хитрость заключается в том, что для получения stdin для конца конвейера вам нужно поместить его в подоболочку - но это, кажется, скрывает значение PIPESTATUS ...
тестовый крон выплевывает некоторые выходные данные и выходит с 1 или 0 ..
ОБНОВЛЕНИЕ: PIPESTATUS не виден, пока команда конвейера не обработана
источник
Один из вариантов - проверить наличие вашего файла, прежде чем получить время его изменения с помощью вызова
stat
. Посколькуstat
в метке времени возвращается немного больше, чем вы хотите, вы можете обрезать его, используя расширение параметра.С GNU
stat
(например, в Linux) вы можете запустить:В Mac OS X и других системах BSD
stat
синтаксис отличается и может указывать формат времени:источник
$TM_LOCAL
безопасно. Это безопасно, только если вы ожидали, что оно не будет иметь предыдущей ценности. Скажите, что значение было ранее,2020-02-27 17:14
и нет~/.vimrc
файла. Вы бы тогда2020-02-27 17
. Поэтому я бы связал эти две строки вместе с дополнительным&&
или (желательно, так как это не так легко читается)if
строфой.