關於 zsh 中的前置命令修飾符
背景
雖然zsh 文件(第 6.2 章)提供了關於前置命令修飾符可以做什麼的描述,但它沒有為每種類型提供範例:
-
、builtin
、command
、exec
、nocorrect
和noglob
.使用者Tuyen Pham也提出了類似的問題。但是,該問題並未強調為每種類型的前置命令修飾符請求範例。
問題
任何人都可以提供每個前置命令修飾符可以做什麼的例子嗎?
乾杯!
請注意,我在下面為每個修飾符提供了一個範例。除了這裡顯示的內容之外,還有一些,比如
exec
andcommand
,還有多種用途。
- 用於執行實用程序將
-
插入破折號作為其第零個參數(命令名稱)的第一個字元。作為命令名稱的第一個字元的破折號是向 shell 發出信號表明它應該初始化為登錄 shell 的常用方法。# Start the yash shell as a login shell: - yash
這可能會使您啟動的 shell 讀取一組不同的啟動腳本。例如,在 的情況下
yash
,它將首先讀取~/.yash_profile
文件,否則它不會這樣做。當 shell 以
-
的第一個字元開頭時$0
,它將是一個登錄 shell。登錄 shell 通常也會有一個l
(小寫的 ell)$-
(儘管bash
shell 似乎不遵循這個習慣):$ sh -c 'echo "$0"; echo "$-"' sh ch
$ - sh -c 'echo "$0"; echo "$-"' -sh clh
- 使用
builtin
,您可以確保您執行的命令是命令的內置變體,而不是外部命令、別名或 shell 函式:builtin cd mydir
例如,如果您想要編寫一個名為的 shell 函式,這可能會很有用,作為它所做工作的一部分,稱為實際更改工作目錄
cd
的內置變體。cd
使用 justcd
會導致對您的函式的遞歸呼叫。$ cd () { builtin cd "$@" && printf 'Now in %s\n' $PWD; } $ cd /tmp Now in /tmp
- 該
command
命令是一個標準的 POSIX 命令,例如,可用於確定特定實用程序是否存在於使用者目前的系統中PATH
:if ! command -v gsed >/dev/null 2>&1; then echo 'gsed is not available' fi
該
command
命令通常還用於禁用給定實用程序的別名和函式查找,其方式類似於我在builtin
上面展示的方式。
exec
關鍵字也是 standard,可用於將目前 shell 完全替換為另一個程序*:*# Replace the shell with bash exec bash
在此之後鍵入
exit
不會帶您回到原來的 shell 會話,因為它已被bash
shell 會話所取代。您還可以使用
exec
為目前 shell 的標準 I/O 流設置重定向。
- 如果目前互動式 shell 會話啟用了拼寫更正 (
setopt CORRECT
),則使用nocorrect
不會啟用該命令的更正。按說:
$ setopt CORRECT $ seed zsh: correct 'seed' to 'sed' [nyae]? n zsh: command not found: seed
與
nocorrect
:$ setopt CORRECT $ nocorrect seed zsh: command not found: seed
noglob
修飾符禁用目前命令的萬用字元:$ noglob echo * *
如果沒有
noglob
修飾符,*
模式將被擴展,並且生成的單詞(目前目錄中的文件名)將作為echo
.在其他 shell 中,可以使用 暫時關閉 globbing
set -f
,然後使用 再次打開它set +f
。這將是在 shell 中禁用文件名通配的標準方法。該set -f
命令不影響 globbingzsh
,除非 shell 正在模擬sh
或ksh
。