基本上我需要运行与shell脚本文件位置相关的路径脚本,我如何将当前目录更改为脚本文件所在的相同目录?
当前回答
如果你想获得实际的脚本目录(不管你是使用符号链接还是直接调用脚本),尝试:
BASEDIR=$(dirname $(realpath "$0"))
echo "$BASEDIR"
这在linux和macOS上都适用。我没看到有人提到realpath。不确定这种方法是否有任何缺点。
在macOS上,需要安装coreutils才能使用realpath。例如:brew install coreutils。
其他回答
如果你想获得实际的脚本目录(不管你是使用符号链接还是直接调用脚本),尝试:
BASEDIR=$(dirname $(realpath "$0"))
echo "$BASEDIR"
这在linux和macOS上都适用。我没看到有人提到realpath。不确定这种方法是否有任何缺点。
在macOS上,需要安装coreutils才能使用realpath。例如:brew install coreutils。
假设您正在使用bash
#!/bin/bash
current_dir=$(pwd)
script_dir=$(dirname "$0")
echo $current_dir
echo $script_dir
这个脚本应该打印您所在的目录,然后是脚本所在的目录。例如,当使用/home/mez/中的脚本从/调用它时,它输出
/
/home/mez
请记住,当从命令的输出为变量赋值时,请将命令包装在$(and)中—否则将得不到所需的输出。
让我们把它变成一个POSIX在线程序:
a="/$0"; a="${a%/*}"; a="${a:-.}"; a="${a##/}/"; BINDIR=$(cd "$a"; pwd)
在包括BSD在内的许多兼容bourne的shell上进行了测试。
据我所知,我是作者,我把它放到了公共领域。更多信息见: https://www.bublina.eu.org/posts/2017-05-11-posix_shell_dirname_replacement/
这个问题的最佳答案是: 从内部获取Bash脚本的源目录
它是:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
一行代码,它将提供脚本的完整目录名,无论从哪里调用脚本。
要了解它是如何工作的,你可以执行以下脚本:
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
TARGET="$(readlink "$SOURCE")"
if [[ $TARGET == /* ]]; then
echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [ "$DIR" != "$RDIR" ]; then
echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"
我发现的最有效的方法之一是
#!/bin/sh
relative_dir=`perl -e 'use Cwd "realpath";$pwd = realpath(shift); $pwd =~ s/\/[^\/]*$//; print $pwd' $0`
cd $relative_dir
使用符号链接工作,并为我的许多同事工作,无论他们选择的shell类型
推荐文章
- 如何在Makefile中设置子进程的环境变量
- 如何让“wc -l”打印没有文件名的行数?
- 有效地测试Linux上的端口是否打开?
- 如何从另一个文件A中删除文件B中出现的行?
- 对以制表符分隔的文件进行排序
- Shell脚本删除超过n天的目录
- 如何检查shell脚本中是否存在命令?
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何打破一个循环在Bash?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何合并2 JSON对象从2个文件使用jq?
- 在Bash中获取日期(比当前时间早一天)
- Linux: kill后台任务
- 在OSX中永久设置PATH环境变量
- 删除Bash脚本中的重复条目