【问题标题】:Failed to execute script by calling another script调用另一个脚本执行脚本失败
【发布时间】:2017-04-25 05:10:58
【问题描述】:

我有两个不同的用户用户“a”和用户“root”的两个 shell 脚本:

a.sh 用于用户“a

export CODE=`pwd | cut -d / -f 5`
isEnabled=`grep -i isEnabled $HOME/$CODE/config/code.properties | awk -F'=' '{print $2}'`

b.sh 用于用户 'root'

su - a -c "sh /export/home/a/a1/bin/a.sh status

如您所见,root 执行脚本 b.sh 执行脚本 a.sh 但实际上它失败了,因为它没有找到脚本的路径,因为 运行 b.sh 时,a.sh 中的变量 $CODE 可能在运行时丢失

经过调查,我厌倦了 b.sh 中的以下内容:

. /path/to/a.sh
source /path/to/a.sh
. /path/to/a.sh "$CODE"
. $(/path/to/a.sh $CODE)

有人可以建议吗?

谢谢大家。

【问题讨论】:

  • su - a 完成后,当前目录将设置为用户a 的主目录。我认为这会在a.sh 中抛弃您的逻辑。为什么需要依赖当前目录? code.properties 的路径能否以更好的方式导出?
  • 当用户执行 a.sh 时,它运行良好。但是当我通过 root 执行它时,它会抛出一个错误,因为 root 缺少 $CODE 导致重新分级未知路径

标签: linux bash shell


【解决方案1】:

变量$CODE 应该在那里,但它将被设置为a 的主目录。尝试使用basename $0 而不是pwd。这将获取正在执行脚本的目录,而不是用户执行它的当前工作目录。

【讨论】:

  • 不确定我理解你的意思。可以举个例子吗
  • @Asfbar 尝试在您的代码中更改此行:export CODE='pwd | cut -d / -f 5' 至此:'export CODE='basename $0 | cut -d / -f 5'(假装单引号是反引号,我不知道如何在 cmets 中解释 markdown)。这将获得 a.sh 所在的目录,而不是用户的主目录。如果您使用 pwd,那么您的 cut 命令将不会返回任何内容,因为用户的主目录可能没有那么长的路径。
  • @Asfbar 此外,您可能想使用cut -d / -f 4 而不是cut -d / -f 5。这将返回用户主目录的子目录的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2021-05-18
  • 2021-09-19
  • 2020-11-24
  • 2020-08-19
相关资源
最近更新 更多