Переменная PIPESTATUS пуста

set world

Тогда:

if [ "${1%%w*}" ]
then
  echo false
else
  echo true
fi
  1. Агрессивно удалить подстроку, начинающуюся с w, из исходной строки
  2. Если что-то осталось, то исходная строка не начинается со второй строки

или:

if [ "$1" = "${1#w}" ]
then
  echo false
else
  echo true
fi
  1. Удалить wиз исходной строки
  2. Сравнить с исходной строкой
  3. Если они равны, то исходная строка не начинается со второй строки
3
28.05.2021, 16:34
1 ответ

Это может произойти, если $PIPESTATUSбыло объявлено как скалярная переменная или что-либо, что не является массивом или было сделано только для чтения, либо вами, либо кодом, найденным в вашем ~/.bashrc/ ~/.bash_profile... или потому что PIPESTATUS=был в среде, когда bashбыл запущен.

Вы можете проверить тип, атрибуты и значение $PIPESTATUSс помощью typeset -p PIPESTATUS.

Затем $PIPESTATUSостается скалярным и не преобразуется автоматически в массив для хранения статусов выхода компонентов конвейера:

$ env PIPESTATUS= bash -c 'false | true; typeset -p PIPESTATUS'
declare -x PIPESTATUS=""
$ bash -c 'PIPESTATUS=; false | true; typeset -p PIPESTATUS'
declare -- PIPESTATUS=""
$ bash -c 'typeset -A PIPESTATUS; false | true; typeset -p PIPESTATUS'
declare -A PIPESTATUS
$ bash -c 'readonly PIPESTATUS; false | true; typeset -p PIPESTATUS'
declare -r PIPESTATUS

За исключением случая readonly, который можно обойти, преобразовав переменную обратно в массив или удалив ее:

typeset -a PIPESTATUS # beware it can affect the scope if run from a function
unset -v PIPESTATUS
5
28.07.2021, 11:28

Теги

Похожие вопросы