我正在运行此命令
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)'
答案 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.sh
或sh
)。通常,脚本应该“知道”该脚本是为哪个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