【问题标题】:Execute linux command from a variable从变量执行linux命令
【发布时间】:2013-08-07 15:08:07
【问题描述】:

我正在尝试从 file.sh 中的变量执行 linux 命令。

test.sh

OUT="日期";
回声 $OUT;

输出:
它运行良好。

但是当我尝试执行命令 pgrep vpnc

OUT="pgrep vpnc";
回声 $OUT;

输出
test.sh: 1: test.sh: pgrep vpnc: 未找到

我的期望是当上面的文件被执行时,它会返回 pid。

我也试过 eval。

OUT="pgrep vpnc";
$ 评估 $OUT;

输出:
test.sh:1:test.sh:pgrep vpnc:未找到
test.sh: 2: test.sh: $: 未找到

谁能帮助我如何运行命令并将其值存储在变量中。

非常感谢任何帮助。

【问题讨论】:

  • 你为什么要将完整的命令存储在一个变量中?你不能只运行命令吗?当然,除非您使用的是用户输入,这似乎是一个等待发生的安全问题。
  • 您发布的代码没有按照您的想法进行。 = 和命令之间的空格使您可以简单地将带引号的字符串作为命令运行,并在其环境中使用空值变量 OUTPUT

标签: linux bash shell


【解决方案1】:

应该是`而不是"

OUT=`pgrep process`;
echo $OUT;

显示进程的pid。

【讨论】:

  • 它成功了,能够获取进程 ID,但在控制台中它没有找到 test.sh: 1: vpn_test.sh: 20266: not found。你能解释一下吗
  • 它必须在您的脚本中的其他位置,如果您不向我们展示整个脚本,我们无法告诉您。
  • 但是使用$(...) 代替反引号更具可读性,仍然符合posix shell,并且可以嵌套。我会建议OUT=$(pgrep process)
  • 我在这项工作背后的意图是隐藏在我的 nohup.out 文件中生成的进程 ID (pid)。是的,我已经编写了一个脚本来检查和调试每一毫秒我的 VPN 连接是否处于活动状态,并且该脚本使用 nohup 命令在后台运行。如果连接在任何时候丢失,我说它要重新连接。所以,在 nohup.out 文件中我不想存储 pid,我想在连接丢失时记录调试部分。
  • 这是我的代码示例if ! pgrep vpnc; then /usr/sbin/vpnc --debug 2 vpn fi 这就是我实际上试图在我的 nohup.out 文件中隐藏 pid 的方式。 OUT_PID = $(pgrep vpnc) echo "$OUT_PID" 1>/dev/null if [[ -z "$OUT_PID"]] then /usr/sbin/vpnc --debug 2 vpn fi如果有错误请纠正我,如果你们有比我更好的想法,请与我分享。谢谢 Mali BasileStarynkevitch
【解决方案2】:

只是使用

$ $OUT

应该运行命令

【讨论】:

  • 嘿,谢谢,即使这样已经解决了,但是当我按照@Mali 的建议引用我的命令时。即使在这种情况下,在我的控制台中我也可以看到有些东西没有找到。 test.sh: 1: test.sh: 20266: not found test.sh: 2: test.sh: $: not found 我可以知道它没有找到什么。请