通过Shell脚本执行命令时出现Awk语法错误,但是从Linux bash shell执行命令时,该命令运行正常

时间:2019-03-25 12:10:08

标签: bash shell awk

我正在运行此命令

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上,该命令有效,但是从shell脚本执行时,它会引发基本错误

这里是示例,您可能会看到“第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 个答案:

答案 0 :(得分:2)

@Ibraheem有正确的解决方案,但到目前为止,没有人发现问题。这是因为您使用的是流程替换(<(cat /tmp/findo)),但是使用sh而不是bash运行脚本。并非在所有shell中都可用进程替换(甚至在以“ sh”调用时甚至不是bash)都可用。

有两种方法可以解决此问题,建议您同时进行两种操作(因为它们本身就是好主意):

  • 请勿使用<(cat somefile),而应使用简单的重定向,例如<somefile。替换为cat的命令是一种从文件读取的过于复杂,脆弱和低效的方式。

  • 给脚本适当的shebang行(#!/bin/bash#!/usr/bin/env bash),使其可执行(chmod +x rvarlog_util.sh),然后通过输入其路径({{1 }}),而不是显式指定外壳程序(./rvarlog_util.shsh)。通常,脚本应该“知道”该脚本是为哪个shell写的,并覆盖它(通过在运行时显式指定一个shell)是个坏主意。

答案 1 :(得分:1)

从您的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