
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