是否可以通过脚本更改当前目录?
我想在Bash中创建用于目录导航的实用程序。我创建了一个如下所示的测试脚本:
#!/bin/bash
cd /home/artemb
当我从Bash shell执行脚本时,当前目录不会更改。是否可以通过脚本更改当前的shell目录?
是否可以通过脚本更改当前目录?
我想在Bash中创建用于目录导航的实用程序。我创建了一个如下所示的测试脚本:
#!/bin/bash
cd /home/artemb
当我从Bash shell执行脚本时,当前目录不会更改。是否可以通过脚本更改当前的shell目录?
Answers:
您需要将脚本转换为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
}
原因是每个进程都有自己的当前目录,并且当您从外壳执行程序时,该程序将在新进程中运行。标准的“ cd”,“ pushd”和“ popd”内置于shell解释器中,因此它们会影响shell进程。
通过使程序成为Shell函数,您将添加自己的进程内命令,然后任何目录更改都会反映在Shell进程中。
启动脚本时,将创建一个仅继承您的环境的新进程。当它结束时,它结束。您当前的环境保持不变。
相反,您可以像这样启动脚本:
. myscript.sh
该.
会在目前的环境评估脚本,所以它可能被改变
.sh
扩展完全不正确。不要使用它们。
综上所述,您可以创建一个别名
alias your_cmd=". your_cmd"
如果您不想写开头的“。” 每当您想将脚本来源提供给Shell环境时,或者您只是不想记住脚本必须正确执行才能正常工作。
~/.bash_aliases
Bash启动时,@ Champ 并非总是来源。
如果您运行bash脚本,则它将在其当前环境或其子环境上运行,而不会在父环境上运行。
如果目标是运行命令:goto.sh / home / test然后在/ home / test中进行交互工作,一种方法是在脚本中运行bash交互子shell:
#!/bin/bash
cd $1
exec bash
这样,您将一直处于/ home / test中,直到退出此shell(exit或Ctrl + C)。
我已经制作了一个脚本来更改目录。看一下:https : //github.com/ygpark/dj
基本上,我们cd..
习惯从每个目录返回。我想通过给出一次需要返回的目录数来简化操作。您可以使用alias命令使用单独的脚本文件来实现此目的。例如:
代码
#!/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'
在source code.sh
当前shell中使用后,您可以使用:
$back 2
从当前目录返回两步。在这里详细解释。在那里也解释了如何将代码放入〜/ .bashrc中,以便每个打开的新外壳将自动具有此新别名命令。您可以通过添加更多if conditions
和不同的参数来修改代码,从而添加新命令以转到特定目录。您也可以在这里从git中提取代码。
我还创建了一个名为山羊的实用程序,可用于简化导航。
您可以在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
在shellscript的cd行下面添加以下代码:
exec $SHELL
pushd
(可能重定向到>/dev/null
以抑制其输出)而不是cd
,则可以稍后使用来返回上一个目录popd
。