Синтаксическая ошибка в Awk при выполнении команды через сценарий оболочки, однако команда работает нормально при выполнении из оболочки Linux bash - PullRequest
0 голосов
/ 25 марта 2019

Я запускаю эту команду

awk '{print "Removing " ORS $0;system("rm " $0 ORS  " if [ $? -eq 0 ]" ORS "then" ORS "echo file  " $0 " has been removed." ORS "fi")}' <(cat /tmp/findo)

В bash и команда работает, однако при выполнении из сценария оболочки выдает основную ошибку

Вот пример, и вы можете посмотреть на «строку 23 ошибки»

# sh -x rvarlog_util.sh
+ findout=/tmp/findout
+ '[' -e /tmp/findout ']'
++ du -sm /var/log
++ awk '{print $1+0}'
+ cdu=2372
++ awk '{print $1+0}'
++ grep total
++ du -m --max-depth=1 -c -m -x /var/log/messages /var/log/messages-20190310 /var/log/messages-20190323-1553338190.gz /var/log/messages-20190324-1553424406.gz /var/log/messages-20190324-1553456095.gz /var/log/messages-20190324-1553456293.gz /var/log/messages-20190324-1553457237.gz /var/log/messages-20190324-1553457268.gz /var/log/maillog-20190324-1553456095.gz /var/log/boot.log /var/log/audit/audit.log /var/log/audit/audit.log-20190311-1552325090.gz /var/log/puppetlabs
+ fusage=2258
rvarlog_util.sh: line 23: syntax error near unexpected token `('
rvarlog_util.sh: line 23: `awk '{print "Removing " ORS $0;system("rm " $0 ORS  " if [ $? -eq 0 ]" ORS "then" ORS "echo file  " $0 " has been removed." ORS "fi")}' <(cat /tmp/findo)'

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

@ У Ибрагима правильное решение, но пока никто не заметил проблему. Дело в том, что вы используете подстановку процесса (<(cat /tmp/findo)), но запускаете сценарий с sh вместо bash. Подстановка процессов доступна не во всех оболочках (или даже в bash, когда она вызывается как «sh»).

Есть несколько способов исправить это, и я бы рекомендовал сделать оба (потому что они сами по себе хорошие идеи):

  • Не используйте <(cat somefile), используйте обычное перенаправление, как <somefile. Замещенная процессом команда cat - это слишком сложный, хрупкий и неэффективный способ чтения из файла.

  • Дайте сценарию правильную строку shebang (#!/bin/bash или #!/usr/bin/env bash), сделайте его исполняемым (chmod +x rvarlog_util.sh) и запустите его напрямую, введя его путь (./rvarlog_util.sh), а не явно указав оболочка (sh или bash). В общем случае скрипт должен «знать», для какой оболочки он написан, и переопределять его (путем явного указания оболочки при его запуске) - плохая идея.

1 голос
/ 25 марта 2019

из вашей команды awk, как я понял, вы пытаетесь удалить файлы, имена которых находятся в файле / tmp / findo, это правильно?затем замените команду awk приведенным ниже кодом и посмотрите, работает ли она, НО убедитесь, что имена файлов в /tmp/findo содержат абсолютный путь к требуемым файлам, которые вы пытаетесь удалить

while read -r files
do
  rm "$files" 
  if [ $? -eq 0 ] 
  then
     "echo $files has been removed."
  fi
done < /tmp/findo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...