我在我的shell脚本(bash)中使用了“改变目录”命令
#!/bin/bash
alias mycd='cd some_place'
mycd
pwd
pwd
可以正确打印出some_place
,但在脚本完成后我的当前工作目录没有改变。
是否可能通过脚本更改我的路径?
你需要这样引用该文件:
. myfile.sh
或者source myfile.sh
如果没有使用source,更改将在子shell中发生而不是调用脚本的父shell中。但是当你source一个文件时,文件中的行将被执行,就好像它们在命令行上输入一样。
虽然从源代码中获取要运行的脚本是一种解决方法,但您应该知道,这样脚本可以直接修改当前shell的环境。另外,也不再能够传递参数。
另一种方法是将脚本实现为bash函数。
function cdbm() {
cd whereever_you_want_to_go
echo arguments to the functions were $1, $2, ...
}
这个技巧被autojump使用: http://github.com/joelthelion/autojump/wiki 来为你提供学习shell目录书签。
# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
这可以通过源代码实现。源代码基本上是在同一个shell中执行脚本,而正常的执行(sh test.sh
或./test.sh
)会创建子shell并在那里执行脚本。
test.sh
cd development/
ls
# Do whatever you want.
执行test.sh
的方法:
source test.sh
.
是source
的最短记号。所以你也可以使用它。
. test.sh
development/
。source yourscript.sh
所谓的源代码执行,就是将代码作为TCL脚本进行执行,即与在登录shell的命令行中逐行输入并从那里执行时产生的效果相同。因此,在执行cd之后,该脚本保持在相应的目录中。
#!/bin/bash
cd some_place
bash
~/bin
中,在任何其他地方都可以调用。但是,输入source ~/bin/mygoodoldscript
而不是mygoo<TAB><ENTER>
略微繁琐一些。缺点是额外的shell会占用一些资源(影响不大)。虽然有答案,但我认为问题的意图是使用脚本导航到特定路径。
这里有一个简单实用的解决方案,可以在不取消现有终端环境标志的情况下工作。
/* .goto.sh */
#!/usr/bin/env bash
echo '~/workspace'
alias goto 'cd `.goto.sh`'