我有这个命令,正尝试在 Solaris 9 的 Bourne shell 中执行。
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}
我的问题是,变量${PARSEDATA}
无法正常工作,我尝试在其周围使用双引号,那么问题就是$0
执行此代码的脚本的名称,而不是使用命令找到的文件find
。
任何可以解决这个问题(可能是简单的问题)的建议都非常有帮助。
提前致谢。
更新: $0
是使用命令定位的脚本的名称find
,变量${PARSEDATA}
是过滤器,位于系统某处,用于修改每个定位脚本的输出。但是,问题是,我似乎无法同时获得两者$0
并${PARSEDATA}
正确扩展,要么$0
使用单引号扩展得很好,要么使用双引号${PARSEDATA}
扩展得很好,但随后$0
变成了运行此命令的原始脚本的名称find
。
答案1
我不确定你想做什么?但是如果你想要查找名为 check_* 的脚本,然后运行它并通过程序 ${PARSE_DATA} 进行管道传输,那么我猜 find 找到的文件不是,$0
但是{}
例子
查找 /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \;(维基百科)
所以我认为你可以使用双引号:
find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}
我已经成功尝试:
PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;
> Bleh Blah
答案2
保留单引号,问题很可能是您没有导出 PARSEDATA 变量。
export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}
答案3
如果您希望 $0 不被 shell 扩展(使用单引号)并且 ${PARSEDATA} 被扩展,那么为什么不对每个使用不同的引号:
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}
只要你保持引用的部分连接在一起,shell 就会扩展 ${PARSEDATA} 并将整个命令作为单个标记传递以进行查找。