首页 > 解决方案 > 如何通过shell脚本更改当前目录并在那里执行命令?

问题描述

我有这个脚本:

#!/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

标签: bashshell

解决方案


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

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

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

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


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


推荐阅读