我正在尝试使用sh -c
运行以下命令集sh -c "
Dup_flag=`wc -l test.dat | awk '{print $1}'`;
user='test@domain.com';
text='Hi';
subject='Notification';
if [ $Dup_flag -eq 0 ];
then
echo $Dup_flag | mailx -r $user -s $subject $user;
fi
"
没有给出理想的结果
当我在脚本中运行相同的
时Dup_flag=`wc -l test.dat | awk '{print $1}'`
user='user@domain.com'
text='Hi'
subject='Notification'
if [ $Dup_flag -eq 8 ]
then
echo $Dup_flag | mailx -r $user -s $subject $user
fi
它给出了期望的结果
有些人可以帮助我,我在这里做错了。我只能用sh -c
运行它们由于
答案 0 :(得分:2)
第一个版本失败,因为双引号参数由调用sh -c "…your script…"
的shell处理。
这意味着wc
和awk
在调用sh -c
之前运行。此外,各种变量引用$Dup_flag
等由调用shell评估,而不是由调用的shell评估。
你需要使用反斜杠来逃避反蜱和美元符号。即使您更改为$(…)
符号,您仍然必须转义$
。
或者在sh -c '…your script…'
周围使用单引号,并使用脚本内适当的双引号。
我想我已经添加了' Escapes'和'单引号'以前的部分。 SO的提交过程出现了问题(暂停);可能是我的互联网连接有问题,但我似乎关闭了标签而没有注意到它没有成功。
sh -c "
Dup_flag=\`wc -l test.dat | awk '{print \$1}'\`;
user='test@domain.com';
subject='Notification'
if [ \$Dup_flag -eq 0 ]
then
echo \$Dup_flag | mailx -r \$user -s \$subject \$user
fi
"
sh -c '
Dup_flag=`wc -l test.dat | awk "{print $1}"`
user="test@domain.com"
subject="Notification"
if [ "$Dup_flag" -eq 0 ]
then
echo "$Dup_flag" | mailx -r "$user" -s "$subject" "$user"
fi
'
请注意,单引号版本可以更容易地为电子邮件等提供多字主题行。
在这两个版本中,我删除了text
,因为它未被使用。当命令分布在多行时,分号是不必要的(所以我删除了它们)。如果将它们全部展平成一条线,它们就是必要的。
实际上,我需要在Informatica命令任务中运行上述命令,该命令以
sh -c " my script "
运行命令。
哎哟。这增加了许多可能混淆的程度。可能是Informatica代码创建了一个shell命令:
char *args[] = { "sh", "-c", your_string, 0 };
execvp(args[0], args);
在那种情况下,我对你的问题的诊断是不合适的;除了最终的shell之外什么都不解释你的字符串的内容。
OTOH,他们可以使用:
char buffer[4096];
snprintf(buffer, sizeof(buffer), "sh -c \"%s\"", your_string);
system(buffer);
在这种情况下,system()
函数运行一个shell,然后分析并运行实际运行脚本的shell。然后我的分析生效了。
可能有其他方法可以完成这项工作;它们可能会产生微妙的不同效果。
答案 1 :(得分:1)
它在逃避$和后退滴答后工作
sh -c "
Dup_flag=\`wc -l test.dat | awk '{print \$1}'\`
user='user@domain.com';
text='Hi';
subject='Notification';
if [ \$Dup_flag -eq 8 ]
then
echo \$Dup_flag | mailx -r \$user -s \$subject \$user;
fi
"
感谢Jonathan