【问题标题】:non-shell command running inside shell script在 shell 脚本中运行的非 shell 命令
【发布时间】:2015-09-21 16:36:16
【问题描述】:

我正在尝试在 .sh 脚本中运行非 shell 脚本命令。 当前代码如下所示:

#!/bin/bash

echo "Enter name of the folder you want to join!"
read folder
cd ~/domains/name/public_html/$folder/sites/default/
echo "enabling u7seven theme!"
drush en u7seven -y;
echo "disabling overlay!"
drush dis overlay -y;
echo "running all-folder script!"
u7d7up all-folder

不是shell代码的代码(服务器上某处的本地脚本是):

u7d7up all-folder

但是,如果我从站点根目录手动调用此函数u7d7up all-folder,它将起作用。 由于我有超过 10 个站点,我想只调用脚本而不手动输入和执行所有这些命令。

【问题讨论】:

  • 如果它在 $PATH 中并且是可执行的,你应该可以调用它。否则使用绝对路径或 cd 到它所在的路径。否则这应该有效。您可能想要执行 var=`u7d7up all-folder` 之类的操作来获取 stdout 到变量并评估 $?检查命令的退出信号。
  • 您有问题吗?从 shell 脚本运行该命令是否不起作用?如果不能,您可以发布您得到的错误吗?
  • 检查 $PATH 是否包含包含 'u7d7up' 的文件夹
  • @Michael echo $PATHtype u7d7up 的输出是什么?

标签: linux bash shell


【解决方案1】:

由于 $PATH 变量中不存在 u7d7up,您可能会遇到问题。

编写脚本的一种可靠方法是将u7d7up 的绝对路径;您还需要检查它的权限。

#!/bin/bash

echo "Enter name of the folder you want to join!"
read folder
cd ~/domains/name/public_html/$folder/sites/default/
echo "enabling u7seven theme!"
drush en u7seven -y;
echo "disabling overlay!"
drush dis overlay -y;
echo "running all-folder script!"
/absolute-path-to/u7d7up /absolute-path-to/all-folder

【讨论】:

  • 还有一个问题,如果我想从不同的服务器调用脚本,我仍然可以使用/absolute-path 对吗?在这种情况下,我将如何处理 ssh 用户名/密码,并且仍然在同一个脚本中使用它?
  • @Michael 在这种情况下,您可以使用基于公钥的身份验证 (help.ubuntu.com/community/SSH/OpenSSH/Keys) 和空白密码来实现您想要的;因为它会绕过交互式密码提示。
  • 你能提供一个这样的例子吗?谢谢!