Jef*_*ler 19
这里有三个独立的“目录”:
为了证明它们是独立的,您可以编写一个 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)的目录。
shell 脚本中的命令 pwd 是否返回 shell 脚本所在的目录?
不。
首先,根据定义,除了 0 到 255 之间的数字退出状态之外,没有任何 shell 脚本或 shell 命令返回任何其他内容。这是不言而喻的,但通常不是人们在问这些类型的问题时的意思。
其次,pwd
既是Bourne shell 内置程序又是标准系统二进制文件。要么打印逻辑或物理当前工作目录,通常是:
如果您需要当前脚本的目录,请使用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 的部分)和手册页readlink
,realpath
以更全面地了解边缘情况是什么,其中有几个。
但是,在日常脚本编写中, 的目录组件$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)
归档时间: |
|
查看次数: |
5061 次 |
最近记录: |