shell脚本是否可以知道用户运行时所在的目录?我正在尝试开发一个像这样的脚本,它运行子目录列表并在它们上运行一些 git 命令。一种方法可能是传递pwd
给它,但它需要一些额外的参数,这就是为什么我想使用内置函数来获取工作目录。
该示例假定当前目录。
#!/bin/bash
for d in */ ; do
echo ""
echo "===================="
echo ""
echo "$d"
git -C "$d" remote show origin
echo ""
echo "===================="
echo ""
done
答案1
POSIX shell(如bash
)并在 POSIX shell 中的特殊变量fish
中创建当前工作目录的路径(由子进程继承并在命令执行过程中保存的进程属性) 。 -like shell 的$PWD
等价物是.csh
$cwd
该变量是动态的。在调用更改当前目录(例如cd
(或某些 shell 中的pushd
/) )的命令后,其内容可能会更改。 popd
POSIX shell 还维护一个变量,$OLDPWD
其中包含调用成功 // 之前的先前工作cd
目录。pushd
popd
该pwd
命令打印当前目录的一个路径。在 POSIX shell 中,该命令通常是内置的,仅打印$PWD
.
如果您想知道脚本启动时的工作目录,您需要将其记录在脚本的开头,如下所示:
#! /bin/sh -
original_PWD=$PWD
...
cd ...
要了解父进程的当前工作目录,在 GNU/Linux 上,您可以这样做
parent_PWD=$(readlink -ve "/proc/$PPID/cwd")
尽管您可能并不总是有权获取该信息。如果你的父母去世,你将被收养init
或被子收割者(如果有)收养。不过$PPID
会不是被更新,所以在这种情况下你可能会得到错误进程的cwd(如果你的父进程的pid已被重用)。
答案2
当然,该脚本继承了运行它的 shell/程序的当前目录。因此,所有文件名引用都将与该文件名相关,除非脚本cd
本身执行此操作。知道脚本文件本身的位置比较困难,而且几乎是不可能的。
答案3
我不认为有一个环境变量可以做到这一点,但是您可以创建自己的变量来轻松使用,而不需要很多命令。
例如:
#!/bin/bash
starting_dir=$(pwd) #use pwd to get the starting directory
#do things
cd some_example_dir/
#do more things
cd $starting_dir #go back to the directory
在这种情况下,您只需将起始目录的路径作为字符串保存在变量中$starting_dir
。它被保存为绝对路径,因此您可以cd
随时访问它。