bash 脚本可以告诉用户运行脚本时所在的目录吗?

bash 脚本可以告诉用户运行脚本时所在的目录吗?

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/) )的命令后,其内容可能会更改。 popdPOSIX shell 还维护一个变量,$OLDPWD其中包含调用成功 // 之前的先前工作cd目录。pushdpopd

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随时访问它。

相关内容