如何从脚本中更改当前目录?
我想在Bash中创建一个目录导航工具。我已经创建了一个测试脚本,代码如下:
#!/bin/bash
cd /home/artemb
当我从Bash shell执行脚本时,当前目录不会改变。是否可能从脚本中更改当前shell目录?
如何从脚本中更改当前目录?
我想在Bash中创建一个目录导航工具。我已经创建了一个测试脚本,代码如下:
#!/bin/bash
cd /home/artemb
当我从Bash shell执行脚本时,当前目录不会改变。是否可能从脚本中更改当前shell目录?
. myscript.sh
.
会在当前环境中计算脚本,因此它可能会被改变。
您需要将脚本转换为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解释器中的,因此它们会影响shell进程。
通过将你的程序作为一个shell函数来创建,你添加了自己的进程内命令,然后任何目录更改都会反映在shell进程中。
function
关键字,尤其是在名称后面结合()``。
function myfunc{是旧版ksh语法,bash为向后兼容而实现的;
myfunc() {是现代POSIX语法,所有符合标准的shell都必须支持;
function myfunc() {`将两者合并在一起,与旧版ksh和现代POSIX sh均不兼容。请参见https://wiki.bash-hackers.org/scripting/obsolete。 - Charles DuffyPATH
中. 脚本名称
的形式运行该脚本.
(点号)将确保脚本不在子 shell 中运行。
综上所述,您可以创建一个别名
alias your_cmd=". your_cmd"
如果你不想每次在脚本中引用shell环境时都要写上前导的 ".",或者你只是不想记住这必须要做,才能使脚本正确工作。
~/.bash_aliases
并不总是被调用。 - Mateusz Piotrowski如果您正在使用bash,可以尝试使用别名:
将以下行添加到.bashrc文件中:
alias p='cd /home/serdar/my_new_folder/path/'
当你在命令行中输入"p"时,它将会改变当前目录。#!/bin/bash
cd $1
exec bash
这样你就会在/home/test目录下,直到你退出(使用exit或Ctrl+C)这个shell。
exec zsh
而不是 exec bash
对我很有用。谢谢。 - Amit Yadav使用 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.
exec $SHELL
基本上我们使用cd..
回到每个目录。我想通过给出需要一次性返回的目录数来使它更加容易。您可以使用别名命令使用单独的脚本文件来实现这一点。例如:
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中,以便每次打开新shell时都自动具备此新别名命令。您可以通过添加更多if条件
和不同的参数来修改代码,以添加新的命令以进入特定目录。您也可以从此处获取git代码。
pushd
(可能重定向到>/dev/null
以抑制其输出),而不是cd
,则可以稍后使用popd
返回到先前的目录。 - mklement0