shell 脚本中的命令是否pwd
输出 shell 脚本所在的目录?
答案1
这里有三个独立的“目录”在起作用:
- 您当前 shell 的当前工作目录,
- shell 脚本的当前工作目录,以及
- 包含 shell 脚本的目录。
为了证明它们是独立的,您可以编写一个 shell 脚本,保存到 /tmp/pwd.sh,其中包含:
#!/bin/sh
pwd
cd /var
pwd
然后你可以将你的密码(上面#1)更改为/:
cd /
并执行脚本:
/tmp/pwd.sh
首先演示您现有的 pwd (#1),然后将其更改为 /var 并再次显示它 (#2)。这些都不pwd
是“/tmp”,即包含/tmp/pwd.sh 的目录(#3)。
答案2
当前(或当前)工作目录
shell 脚本中的命令 pwd 是否返回 shell 脚本所在的目录?
不。
首先,根据定义,除了 0 - 255 之间的数字退出状态之外,任何 shell 脚本或 shell 命令都不会返回任何内容。这是不言而喻的,但通常不是人们提出此类问题时的意思。
第二,pwd
既是一个Bourne shell 内置和标准系统二进制文件。任意一个印刷逻辑或物理当前工作目录,一般是:
- 调用脚本或二进制文件时您在目录结构中的位置。
- 更改工作目录后的当前位置光盘或其他修改当前工作目录的实用程序和内置程序,例如 Pushd 或 Popd。
如果您想要当前脚本的目录,请使用dirname
下面最后一节中所述的实用程序。
快速测试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
这将打印/etc
,而不是/tmp
,因为您当前的工作目录是 current /etc
。这是预期的行为。
获取包含脚本的目录
您可能会问这个问题,因为您想找到当前脚本的目录。在一般情况下,以下是快速而肮脏的解决方案:
#!/usr/bin/env bash
echo $(dirname "$0")
这是有效的,因为$0
通常包含用于调用正在执行的脚本的路径名,并且 shell 扩展使用该dirname
实用程序返回不包括文件名部分的路径。您可以使用 Bash 参数扩展来执行类似的操作,但可移植性较差"${0%/*}"
。
当然,这一切都过于简单化了。请阅读bash手册(特别是关于位置参数、特殊参数和BASH_SOURCEreadlink
)以及和的手册页,以realpath
更全面地了解边缘情况,其中有几种。
然而,在日常脚本编写中, 的目录组件$0
足以告诉您想要了解的内容。如果您正在做的事情足够复杂,但$0
无法保存您实际需要的信息,并且您需要更复杂的构造,例如:
echo $(dirname "$(realpath "$0")")
那么你可能会让你的生活变得比需要的更加困难。
答案3
pwd
返回 0 除非无法打开其当前工作目录。
mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"
/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1
答案4
它从调用/运行的位置返回目录,而不是脚本所在的位置!
这是 try.sh :
echo "The current working directory: $PWD"
这个输出将更加清晰:
[akarpe@ADM-PROD-OMNI ~]$ sh try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ sh ./try/try.sh
The current working directory: /mnt/home/akarpe
[akarpe@ADM-PROD-OMNI ~]$ cd try
[akarpe@ADM-PROD-OMNI try]$ sh ./try.sh
The current working directory: /mnt/home/akarpe/try
[akarpe@ADM-PROD-OMNI try]$ sh ../try.sh
The current working directory: /mnt/home/akarpe/try