基本上我需要运行与shell脚本文件位置相关的路径脚本,我如何将当前目录更改为脚本文件所在的相同目录?
当前回答
正如marko所言:
BASEDIR=$(dirname $0)
echo $BASEDIR
除非你在脚本所在的目录中执行脚本,在这种情况下,你会得到一个值'。'
要解决这个问题,请使用:
current_dir=$(pwd)
script_dir=$(dirname $0)
if [ $script_dir = '.' ]
then
script_dir="$current_dir"
fi
现在可以在整个脚本中使用变量current_dir来引用脚本目录。然而,这可能仍然有符号链接的问题。
其他回答
最初的帖子包含了解决方案(忽略回复,他们没有添加任何有用的东西)。有趣的工作是由前面提到的unix命令readlink和选项-f完成的。当以绝对路径和相对路径调用脚本时,此方法有效。
对于bash, sh, ksh:
#!/bin/bash
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f "$0")
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname "$SCRIPT")
echo $SCRIPTPATH
对于tcsh, csh:
#!/bin/tcsh
# Absolute path to this script, e.g. /home/user/bin/foo.csh
set SCRIPT=`readlink -f "$0"`
# Absolute path this script is in, thus /home/user/bin
set SCRIPTPATH=`dirname "$SCRIPT"`
echo $SCRIPTPATH
参见:https://stackoverflow.com/a/246128/59087
如果您正在使用bash....
#!/bin/bash
pushd $(dirname "${0}") > /dev/null
basedir=$(pwd -L)
# Use "pwd -P" for the path without links. man bash for more info.
popd > /dev/null
echo "${basedir}"
基本版:
dir=$(dirname $0)
如果脚本可以通过$PATH调用,那么:
dir=$(dirname $(which $0))
如果脚本可能像这样调用:bash script.sh,那么:
dir=$(dirname $(which $0 2>/dev/null || realpath ./$0))
如果你感到极度不安全,那么:
dir="$(dirname -- "$(which -- "$0" 2>/dev/null || realpath -- "./$0")")"
BASE_DIR="$(cd "$(dirname "$0")"; pwd)";
echo "BASE_DIR => $BASE_DIR"
这应该能奏效:
echo `pwd`/`dirname $0`
它可能看起来很丑,这取决于它是如何被调用和cwd,但应该得到你需要去的地方(或者你可以调整字符串,如果你关心它的外观)。
推荐文章
- 如何合并2 JSON对象从2个文件使用jq?
- 在Bash中获取日期(比当前时间早一天)
- Linux: kill后台任务
- 在OSX中永久设置PATH环境变量
- 删除Bash脚本中的重复条目
- 如何将Bash命令的输出分配给变量?
- 如何在C程序中获取当前目录?
- PHP中的异步shell执行器
- Git显示“警告:永久添加到已知主机列表”
- 如何在Bash中逐行合并两个文件
- 检索Linux上单个进程的CPU使用情况和内存使用情况?
- 如何从远程SSH会话发送数据到本地剪贴板
- 我如何得到bash完成工作与别名?
- SSH端口转发~/。ssh /配置文件?
- 通过使用shell脚本替换文件名中的特定模式来重命名多个文件