【问题标题】:How to change current directory via shell script and execute command there?如何通过shell脚本更改当前目录并在那里执行命令?
【发布时间】:2020-12-30 16:06:27
【问题描述】:

我有这个脚本:

#!/bin/bash

cd ~/my-dir && bash && runall

我将此脚本添加到我的$PATH 中,当我运行此脚本时,它首先会做两件事。

  1. 它会更改当前目录并执行 bash,这样我的 shell 也会更改当前目录并且我可以在那里工作。
  2. 在此文件夹中运行 runall(另一个 shell 脚本)。

实际结果:

脚本成功更改了我当前的 shell 目录。 但是,runall 没有被执行。

预期结果:

脚本将我的当前shell目录更改为my-dir,然后执行runall

我该如何解决这个问题?

注意:

我知道我可以做到:

cd some-dir/ && runall

但这不会将我当前的会话更改为该目录。我还想更改我当前的 shell 目录。

原因:

我还想更改我当前的工作目录,以便在runall 执行后可以在那里运行其他手动命令。

【问题讨论】:

  • 这根本不会改变你的“当前会话”。它正在启动一个新的外壳,而不是修改现有外壳的状态。如果你退出那个新的 shell,runall 将运行,然后你会回到你的旧 shell。
  • 如果你想修改现有会话,脚本完全是错误的工具——改用函数。

标签: bash shell


【解决方案1】:

这几乎是Change the current directory from a Bash script 的副本,答案也非常相似——唯一的区别是附加了您要运行的命令。

根本不要使用脚本;相反,在您的 ~/.bashrc 或类似文件中,定义一个函数:

runInMyDir() {
  cd ~/my-dir || return
  runall
}

...定义命令runInMyDir。 (如果您希望 runall 在后台发生,请在该行末尾添加 &)。


如果您确实想要一个脚本,该脚本需要是sourced,而不是在进程外执行——当一个程序作为shell外部的可执行文件执行时,它在它开始之前已经从原来的 shell 中分离出来,所以它没有机会改变那个 shell 的行为。因此,如果您使用命令cd ~/my-dir || returnrunall 创建了一个名为runInMyDir 的文件,则需要运行source runInMyDir 而不仅仅是runInMyDir 来调用它。

【讨论】:

  • 感谢您为我指明了正确的方向。它确实工作得很好。谢谢!正如你所说,我删除了脚本并移至一个函数。
猜你喜欢
  • 2011-06-17
  • 2017-07-12
  • 2015-11-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多