我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
我正在写一个Bash脚本。我需要当前工作目录始终是脚本所在的目录。
默认行为是脚本中的当前工作目录是我从中运行它的shell的目录,但我不想要这种行为。
当前回答
这里有很多正确答案,但有一个对我来说更有用(确保脚本的相对路径保持可预测/工作)是使用pushd/popd:
pushd "$(dirname ${BASH_SOURCE:0})"
trap popd EXIT
# ./xyz, etc...
这将把源文件的目录推到导航堆栈上,从而改变工作目录,但是,当脚本退出时(无论出于什么原因,包括失败),trap将运行popd,恢复执行前的当前工作目录。如果脚本被cd,然后失败,那么在执行结束后,您的终端可能会处于一种不可预知的状态——陷阱可以防止这种情况。
其他回答
如果你只是需要打印当前的工作目录,那么你可以这样做。
$ vim test
#!/bin/bash
pwd
:wq to save the test file.
给予执行权限:
chmod u+x test
然后通过./test执行脚本,然后可以看到当前的工作目录。
这个脚本似乎对我有用:
#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
无论从哪里运行,pwd命令行都将脚本的位置返回为当前工作目录。
我吃了这个,它起作用了。
#!/bin/bash
cd "$(dirname "$0")"
CUR_DIR=$(pwd)
#!/bin/bash
cd "$(dirname "$0")"
这里有很多正确答案,但有一个对我来说更有用(确保脚本的相对路径保持可预测/工作)是使用pushd/popd:
pushd "$(dirname ${BASH_SOURCE:0})"
trap popd EXIT
# ./xyz, etc...
这将把源文件的目录推到导航堆栈上,从而改变工作目录,但是,当脚本退出时(无论出于什么原因,包括失败),trap将运行popd,恢复执行前的当前工作目录。如果脚本被cd,然后失败,那么在执行结束后,您的终端可能会处于一种不可预知的状态——陷阱可以防止这种情况。