我有一个简单的脚本,我想调用“push”,然后调用另一个命令。但脚本中的“pushd”命令似乎并没有超出脚本范围。
有什么方法可以使其在 shell 终端中执行?
#!/bin/sh
pushd $1
time
我真正想要完成的是调用,pushd
然后other-command
使用一个命令。
答案1
/bin/sh
在本例中,shell 脚本通常在 shell 程序的单独实例中执行。您的pushd
命令仅影响该子 shell 的工作目录。否则,从 shell 运行的任何程序都可能会扰乱 shell 的工作目录。
要在当前 shell 中执行该脚本,请改为:
$ . my-command somedir
或者,更详细地说:
$ source my-command somedir
为了使您的程序看起来像其他程序一样工作,您可以使用别名:
$ alias mycmd='source my-command'
$ mycmd /bin
$ pwd
/bin
答案2
脚本无法更改其父进程的环境。因此,脚本中所做的任何环境更改都会丢失。
要在同一进程中运行脚本,您可以像这样“获取”脚本
. /path/to/script.sh args
答案3
函数比 shell 脚本更适合这种操作,尤其是在使用 Pushd 时。
将其添加到.bashrc
:
foo() {
pushd $1
time
}
export foo
在外壳中:
$ foo mydir1
输出:
~/mydir1 ~
real 0m0.000s
user 0m0.000s
sys 0m0.000s