Проблема заключается в том, что в Bash каждая команда имеет только один код выхода. Когда вы export foo="$(false)"
код выхода false
просто отбрасывается. Если вы вместо этого сделаете
foo="$(false)"
export foo
можно отреагировать на неудачную первую команду, например, с помощью настройки errexit
.
Объявление и присвоение строкового литерала, такого как export foo='bar'
, конечно, не страдает от этой проблемы. Но изменение — это единственная постоянная в разработке программного обеспечения, и это просто хорошая хозяйственная работа, чтобы в будущем -подтвердить такие заявления, разбив их на части.
В дополнение к конкретным командам назначения, которые вы упомянули, есть также несколько команд в одном назначении, например foo="$(false)$(true)"
. См.pipefail
в man bash
для еще одной такой ловушки.
Следует также помнить, что последовательность объявления и присваивания иногда имеет значение. Например, вы захотите объявить переменныеlocal
до их назначения. (К сожалению, невозможно объявить переменныеreadonly
до их первого назначения.)
sed -e 's/T/ /' -e 's/Z//' file
или, что то же самое,
sed 's/T/ /; s/Z//' file
Это сначала заменяет первый символ T
в каждой строке файла пробелом, а затем удаляет первое вхождение Z
. Это преобразовало бы
'2020-03-07T14:42:36Z UTC [ db=dev user=rdsdb pid=16913 userid=1 xid=5326 ]' LOG: SET statement_timeout TO 120000
в
'2020-03-07 14:42:36 UTC [ db=dev user=rdsdb pid=16913 userid=1 xid=5326 ]' LOG: SET statement_timeout TO 120000
Перенаправление в новый файл для сохранения данных. Если вы хотите отредактировать -место в файле, сначала убедитесь, что редактирование выполняется правильно. (команда предполагает, что будет не больше и не меньше ровно одной такой метки времени для каждого файла. строку ), то вы можете использовать sed -i
, чтобы изменить файл на месте.