команда "what" не работает в сценарии оболочки с #!/bin/bash, но работает с #!/bin/zsh

Используя awk, сопоставьте только те строки, которые не входят в сетку, т. е. valuesв $1и alarmsв $2, и поменяйте местами значения столбцов. {..}1re -строит всю строку с любыми изменениями внутри {..}и любыми изменениями в разделителях поля/записи.

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t

Часть column -tпредназначена только для красивой печати вывода awk. Вы можете использовать printf()с соответствующей шириной, но предыдущая команда упрощает работу.

Но только для жалоб POSIX awkиспользуйтеprintf()

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp; } 
{ printf "%s%40s\n",$1,$2}' file

Если вы должны были внести изменения в строку -и использовать GNU awkниже 4.1.2, используйте временный файл для повторного -перенаправления содержимого из него

tmpfile=$(mktemp)

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t > "$tmpfile" && mv "$tmpfile" file

или используйте волшебный инструмент spongeиз пакета moreutils (В RHEL выполнитеyum install moreutils)

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t | 
sponge file
1
21.09.2020, 23:44
1 ответ

Не все команды существуют в виде отдельных исполняемых файлов, :некоторые команды могут быть встроены -в используемой вами оболочке.

Судя по всему, у вас не /usr/bin/whichустановлен (, хотя некоторые пакеты в вашем дистрибутиве могут предоставить это ).

Ваши выходные данные type whichпоказывают, что команда whichв bashна самом деле является псевдонимом, и этот псевдоним определяется только тогда, когда bashвызывается как интерактивная оболочка. Это означает, что он, вероятно, определен в /etc/bash.bashrcили ~/.bashrcили в каком-то скрипте, взятом из одного из них.

При выполненииbashне -в интерактивном режиме (, как в bash -c "type which", например ), /etc/bash.bashrcи ~/.bashrcбудут пропущены, поэтому псевдоним не будет определен.

_which, в свою очередь, может быть функцией оболочки. Вы можете увидеть его определение с помощью type _which. Возможно, это что-то похожее на это:

which() { 
   IFS=:
   for x in $PATH; do
      if [ -x "$x/$1" ]; then
         echo "$x/$1"
         return 0
      fi
   done
   echo "$1 not found in \$PATH"
   return 1
}

Таким образом, если вы хотите добиться максимальной переносимости вашего скрипта, было бы неплохо использовать подобную функцию, и пусть скрипт несет в себе собственную версию which.

2
18.03.2021, 23:03

Теги

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