在unix中使用-c选项执行sh命令

时间:2016-01-24 17:19:23

标签: shell unix posix sh

我正在尝试使用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

运行它们

由于

2 个答案:

答案 0 :(得分:2)

第一个版本失败,因为双引号参数由调用sh -c "…your script…"的shell处理。

这意味着wcawk在调用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