unix 中带有 -c 选项的 Sh 命令
Sh command with -c option in unix
我正在尝试 运行 使用 sh -c
下面的一组命令
sh -c "
Dup_flag=`wc -l test.dat | awk '{print }'`;
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 }'`
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
谢谢
第一个版本失败,因为 double-quoted 参数由调用 sh -c "…your script…"
.
的 shell 处理
这意味着 wc
和 awk
在调用 sh -c
之前是 运行。此外,各种变量引用 $Dup_flag
等是由调用 shell 计算的,而不是由调用的 shell.
计算的
您需要使用反斜杠来转义 back-ticks 和美元符号。即使您更改为 $(…)
表示法,您仍然必须转义 $
.
或者在 sh -c '…your script…'
周围使用单引号,并在脚本中适当的地方使用双引号。
我以为我之前添加了 'Escapes' 和 'Single quotes' 部分。向 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 }"`
user="test@domain.com"
subject="Notification"
if [ "$Dup_flag" -eq 0 ]
then
echo "$Dup_flag" | mailx -r "$user" -s "$subject" "$user"
fi
'
请注意,single-quoted 版本将使电子邮件的 multi-word 主题行等变得更加容易。
在这两个版本中,我都删除了 text
,因为它未被使用。当命令分布在多行时,分号不是必需的(所以我删除了它们)。如果将它们全部压平到一条线上,它们将是必要的。
Actually, I need to run the mentioned commands in an Informatica command task which runs the commands as 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 实际上 运行 是你的脚本。那么我的分析就生效了。
可能还有其他方法可以完成这项工作;它们的效果可能略有不同。
它在转义 $ 和 back-ticks
后起作用
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
"
谢谢乔纳森
我正在尝试 运行 使用 sh -c
下面的一组命令sh -c "
Dup_flag=`wc -l test.dat | awk '{print }'`;
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 }'`
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
谢谢
第一个版本失败,因为 double-quoted 参数由调用 sh -c "…your script…"
.
这意味着 wc
和 awk
在调用 sh -c
之前是 运行。此外,各种变量引用 $Dup_flag
等是由调用 shell 计算的,而不是由调用的 shell.
您需要使用反斜杠来转义 back-ticks 和美元符号。即使您更改为 $(…)
表示法,您仍然必须转义 $
.
或者在 sh -c '…your script…'
周围使用单引号,并在脚本中适当的地方使用双引号。
我以为我之前添加了 'Escapes' 和 'Single quotes' 部分。向 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 }"`
user="test@domain.com"
subject="Notification"
if [ "$Dup_flag" -eq 0 ]
then
echo "$Dup_flag" | mailx -r "$user" -s "$subject" "$user"
fi
'
请注意,single-quoted 版本将使电子邮件的 multi-word 主题行等变得更加容易。
在这两个版本中,我都删除了 text
,因为它未被使用。当命令分布在多行时,分号不是必需的(所以我删除了它们)。如果将它们全部压平到一条线上,它们将是必要的。
Actually, I need to run the mentioned commands in an Informatica command task which runs the commands as
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 实际上 运行 是你的脚本。那么我的分析就生效了。
可能还有其他方法可以完成这项工作;它们的效果可能略有不同。
它在转义 $ 和 back-ticks
后起作用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
"
谢谢乔纳森