Zsh

關於 zsh 中的前置命令修飾符

  • November 28, 2021

背景

雖然zsh 文件(第 6.2 章)提供了關於前置命令修飾符可以做什麼的描述,但它沒有為每種類型提供範例:-builtincommandexecnocorrectnoglob.

使用者Tuyen Pham也提出了類似的問題。但是,該問題並未強調為每種類型的前置命令修飾符請求範例。


問題

任何人都可以提供每個前置命令修飾符可以做什麼的例子嗎?

乾杯!

請注意,我在下面為每個修飾符提供了一個範例。除了這裡顯示的內容之外,還有一些,比如execand command,還有多種用途。


  • 用於執行實用程序將-插入破折號作為其第零個參數(命令名稱)的第一個字元。作為命令名稱的第一個字元的破折號是向 shell 發出信號表明它應該初始化為登錄 shell 的常用方法。
# Start the yash shell as a login shell:
- yash

這可能會使您啟動的 shell 讀取一組不同的啟動腳本。例如,在 的情況下yash,它將首先讀取~/.yash_profile文件,否則它不會這樣做。

當 shell 以-的第一個字元開頭時$0,它將是一個登錄 shell。登錄 shell 通常也會有一個l(小寫的 ell)$-(儘管bashshell 似乎不遵循這個習慣):

$ 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 會話,因為它已被bashshell 會話所取代。

您還可以使用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命令不影響 globbing zsh,除非 shell 正在模擬shksh

引用自:https://unix.stackexchange.com/questions/679410