题
是否可以从脚本更改当前目录?
我想在 Bash 中创建一个用于目录导航的实用程序。我创建了一个测试脚本,如下所示:
#!/bin/bash
cd /home/artemb
当我从 Bash shell 执行脚本时,当前目录不会更改。是否可以通过脚本更改当前的 shell 目录?
解决方案
您需要将您的脚本转换为外壳功能:
#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
# . ~/bin/myprog.sh
#
function myprog() {
A=$1
B=$2
echo "aaa ${A} bbb ${B} ccc"
cd /proc
}
原因是,每个进程都有自己的当前目录中,当你从shell执行程序是在一个新的进程中运行。标准的“CD”,“PUSHD”和“POPD”,使它们所影响的外壳进程被内置于壳解释器。
这是使你的程序的外壳功能,您要添加自己的过程中的命令,然后任意目录变化被反映在shell进程。
其他提示
当您启动脚本,创建一个新的过程,既继承了您的环境。当它结束时,它结束。您当前的环境保持原样。
相反,你就可以开始你的脚本是这样的:
. myscript.sh
在.
将评估在当前环境中的脚本,所以它可能被修改
鉴于答案不可读且过于复杂,我认为这是请求者应该做的
- 将该脚本添加到
PATH
- 将脚本运行为
. scriptname
这 .
(点)将确保脚本不在子 shell 中运行。
把上述在一起,就可以使一个别名
alias your_cmd=". your_cmd"
如果你不想写领先“”每一次 你想你的脚本源的shell环境, 或者如果你只是不想记住,一定要做 为脚本才能正常工作。
如果你正在使用bash,那么你可以尝试别名:
到.bashrc文件添加此行:
alias p='cd /home/serdar/my_new_folder/path/'
当你写的“p”在命令行上,它会改变的目录。
如果您运行bash脚本,那么它将运行在其当前的环境或它的那些孩子,从来没有父。
如果目标是运行命令: goto.sh /家/测试 然后进行交互式工作在/ home /测试的一种方法是在脚本中运行bash的交互式子shell:
#!/bin/bash
cd $1
exec bash
此方式,您将在/ home /测试,直到这个外壳在退出(退出或Ctrl + C)。
使用的 PUSHD 强>当前目录被推目录栈上,并将其改变为给定的目录,的 POPD 获取在堆叠和变化的顶部的目录,然后到它
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
只要到
yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor
和下添加此代码到最后一行:
alias yourcommand="cd /the_path_you_wish"
然后退出编辑器。
然后输入:
source ~/.bashrc or source ~/.bash_profile on MAC.
现在可以使用: yourcommand 在终端
我做了一个脚本来更改目录。看一看: https://github.com/ygpark/dj
基本上我们用cd..
来自每个目录回来。我想使通过给用,你需要再来一次目录的数量更容易。您可以使用使用alias命令一个单独的脚本文件实现这一点。例如:
<强> code.sh 强>
#!/bin/sh
_backfunc(){
if [ "$1" -eq 1 ]; then
cd ..
elif [ "$1" -eq 2 ]; then
cd ../..
elif [ "$1" -eq 3 ]; then
cd ../../..
elif [ "$1" -eq 4 ]; then
cd ../../../..
elif ["$1" -eq 10]; then
cd /home/arun/Documents/work
fi
}
alias back='_backfunc'
在当前shell使用source code.sh
后,可以使用:
$back 2
来两步从当前目录回来。详细超过解释这里。它也是在那里解释如何把在〜/ .bashrc代码,以便打开每一个新外壳将自动获得这一新的alias命令。您可以添加新的命令,通过增加更多的if conditions
和不同的参数修改代码去特定的目录。您也可以从拉过的git rel="nofollow">代码。
这种方法对我来说更容易。
假设在您是管理员的个人 iMac 上,在打开命令窗口时的默认目录 /Users/jdoe 下,这将是要转到的目录:/Users/jdoe/Desktop/Mongo/db.3.2.1/bin。
这些是可以完成工作的步骤:
- vi mongobin,我在其中输入:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
作为第一行。 chmod 755 mongobin
source mongobin
pwd
瞧!
我还创建了一个名为的实用程序 山羊 您可以使用它来更轻松地导航。
您可以在以下位置查看源代码 GitHub.
# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev
# Follow a link to change a directory:
cd h4xdir
# Follow a link (and don't stop there!):
cd h4xdir/awesome-project
# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...
# List all your links:
goat list
# Delete a link (or more):
goat delete h4xdir lojban
# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents
# Delete all saved links:
goat nuke
# Delete broken links:
goat fix
我喜欢做不同的项目,同样的事情兵不血刃了一个新的外壳。
在你的情况:
cd /home/artemb
保存the_script为:
echo cd /home/artemb
,然后用火起来:
\`./the_script\`
然后你使用相同的外壳获得该目录。
添加下面的CD线在你的shell这样的:
exec $SHELL
<强>声明你的路径:强>
PATH='/home/artemb'
cd ${PATH}