pwd 输出什么?

mkd*_*ve2 6 linux command-line shell

pwdshell 脚本中的命令是否输出 shell 脚本所在的目录?

Jef*_*ler 19

这里有三个独立的“目录”:

  1. 当前 shell 的当前工作目录,
  2. shell 脚本的当前工作目录,以及
  3. 包含 shell 脚本的目录。

为了证明它们是独立的,您可以编写一个 shell 脚本,保存到 /tmp/pwd.sh,其中包含:

#!/bin/sh
pwd
cd /var 
pwd
Run Code Online (Sandbox Code Playgroud)

然后,您可以将您的密码(上面的 #1)更改为 /:

cd /
Run Code Online (Sandbox Code Playgroud)

并执行脚本:

/tmp/pwd.sh
Run Code Online (Sandbox Code Playgroud)

首先演示您现有的密码(#1),然后将其更改为 /var 并再次显示(#2)。这些都不pwd是“/tmp”,即包含 /tmp/pwd.sh(#3)的目录。

  • 值得注意的是,程序(包括脚本;脚本就是程序)从它们的父级继承了它们的工作目录。一个进程可以改变它自己的工作目录,但这不会影响它的父进程。`cd` 和类似的命令之所以有效,是因为它们是在 shell 中运行的 _builtins_,而不是它们自己的外部程序。 (3认同)
  • 啊对。shell 脚本可以改变 `pwd`。我不知道。但是你的答案表述的有点混乱。我会重写它... (2认同)

Cod*_*ome 7

当前(或当前)工作目录

shell 脚本中的命令 pwd 是否返回 shell 脚本所在的目录?

不。

首先,根据定义,除了 0 到 255 之间的数字退出状态之外,没有任何 shell 脚本或 shell 命令返回任何其他内容。这是不言而喻的,但通常不是人们在问这些类型的问题时的意思。

其次,pwd既是Bourne shell 内置程序又是标准系统二进制文件。要么打印逻辑或物理当前工作目录,通常是:

  1. 您在调用脚本或二进制文件时在目录结构中的位置。
  2. 使用cd或其他修改当前工作目录的实用程序和内置程序(例如 pushd 或 popd)更改工作目录后的当前位置。

如果您需要当前脚本的目录,请使用dirname下面最后一节中所述的实用程序。

快速测试 pwd

作为查看pwd实际打印内容的快速测试,您可以运行以下命令:

# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh

pwd
EOF

# Make the script executable.
chmod 755 /tmp/test_pwd.sh

# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh
Run Code Online (Sandbox Code Playgroud)

这将打印/etc,而不是/tmp,因为您当前的工作目录当前是/etc. 这是预期的行为。

获取包含脚本的目录

您可能会问这个问题,因为您想找到当前脚本的目录。在一般情况下,以下是快速而肮脏的解决方案:

#!/usr/bin/env bash
echo $(dirname "$0")
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为$0通常包含用于调用正在执行的脚本的路径名,并且 shell 扩展使用该dirname实用程序返回不包括文件名部分的路径。您可以使用 Bash 参数扩展来执行类似但不太便携的操作"${0%/*}"

当然,这一切都过于简单化了。请阅读Bash 手册(尤其是关于位置参数、特殊参数和BASH_SOURCE 的部分)和手册页readlinkrealpath以更全面地了解边缘情况是什么,其中有几个。

但是,在日常脚本编写中, 的目录组件$0足以告诉您想要了解的内容。如果您正在做一些足够复杂的事情而$0没有保存您实际需要的信息,并且您需要更复杂的结构,例如:

echo $(dirname "$(realpath "$0")")
Run Code Online (Sandbox Code Playgroud)

那么你可能会让你的生活变得比需要的更困难。


小智 5

pwd 除非无法打开其当前工作目录,否则返回 0。

mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"
Run Code Online (Sandbox Code Playgroud)
/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1
Run Code Online (Sandbox Code Playgroud)

  • `pwd` 将目录打印到命令行。我相信这就是 OP 所要求的,而不是退出代码。 (4认同)