【问题标题】:Trying to convert script using PUSHD/POPD from BASH to ZSH尝试使用 PUSHD/POPD 将脚本从 BASH 转换为 ZSH
【发布时间】:2019-11-12 03:17:41
【问题描述】:

我正在尝试将以下脚本从 BASH 转换为 ZSH,但 POPD 无法正常工作...有人可以帮帮我吗?

runMyScript() {
  if [[ -e $PROJECTS_HOME/myFolder/myScript.sh]]; then
    pushd $PROJECTS_HOME/myFolder > dev/null
    . ./myScript.sh
    popd > dev/null
  else
    ... //Do something else instead
  fi
}
runMyScript

错误是这样的

myScript:popd:5: directory stack empty

现在我知道这意味着什么,但我似乎无法修复它......我也在努力寻找有意义的修复。

如果我手动运行脚本,它似乎工作正常,但如果我通过调用 runMyScript 来运行它,那么它似乎就失败了。

有人可以帮帮我吗?

【问题讨论】:

  • 不太可能将真正的错误消息发送到标准输出,但我会从您的脚本中删除>/dev/nulls,然后在set -vx 之前和set +vx 之后添加shell 调试有问题的代码。您还可以在else 分支中包含一个真正的警告消息。然后你就知道到底发生了什么,然后你就能弄清楚它为什么会发生。用双引号括起来你的所有变量不会有什么坏处,即"$MyVar"。祝你好运。
  • "directory stack empty" 是一个正常的答案 popd on stderr 当目录没有变化时,我不知道你的脚本做了什么,所以很难说更多。顺便说一下 > 重定向stdout而不是stderr,并将this重定向到./dev目录中的一个空文件,该文件可能不存在而不是系统/dev/null
  • @Takuhii :从这条消息中,我可以得出结论 pushd 失败了,但您并没有说您从 pushd 收到错误消息。难道是你忽略了它?再次运行脚本并发布完整的输出(复制和粘贴)。一般来说,在代码中处理失败的推送是个好主意,例如pushd $PROJECTS_HOME/myFolder || exit 1
  • 谢谢@shellter,这让我走上了正轨,我的脚本现在可以运行了,谢谢 :)
  • @user1934428 pushd 似乎工作正常,没有错误消息:(

标签: bash zsh pushd


【解决方案1】:

我根据@shellter 的一些反馈修改了脚本,现在脚本似乎可以工作了……新代码如下所示;

runMyScript() {
  if [ -f "$PROJECTS_HOME"/myFolder/myScript.sh]; then
    pushd "$PROJECTS_HOME"/myFolder
    . ./myScript.sh
    popd
  else
    // CREATE the variables needed to run this script
  fi
}
runMyScript

【讨论】:

  • 很好用,但是 >dev/null 重定向虽然在原始文件中是不必要的,但不会造成任何伤害,因为您可以通过在命令行上执行 pushd $HOME; popd >/dev/null 轻松验证。
  • 除了删除不必要的重定向之外,我看不到您的原始脚本有任何更改。你还改变了什么?
猜你喜欢
  • 2014-10-06
  • 2019-07-03
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多