Command-Substitution

什麼問題/模式證明使用命令替換是合理的?

  • June 11, 2018

我使用 Ubuntu 和 Bash 在 DigitialOcean 等“自我管理的外殼”託管服務提供商上建立了一些伺服器環境,我在其上執行 Drupal/WordPress 應用程序。

一直以來,我都沒有必要使用所謂的“命令替換”。

我問,Bash 程序員必須使用這個概念的“模式”會是什麼問題?請舉個例子?

命令替換意味著執行 shell 命令並將其輸出儲存到變數或使用 echo 命令顯示回來。例如,顯示日期和時間:

echo "Today is $(date)"

在我的命令接收另一個命令或範例的輸出作為參數的情況下,它很有用。

POSIX 標準中的命令替換小節

命令替換允許替換命令的輸出來代替命令名稱本身。

命令替換提供了一種方便的方式來使用命令的輸出,而無需先將其寫入臨時文件,然後再從該文件中讀取它。如果命令的輸出是單行的短字元串,則最好這樣做。

有些人使用命令替換來收集命令的輸出,即使輸出量可能是多行文件。這通常不是使用命令替換的好方法。相反,應該使用使用管道或臨時文件在處理階段之間傳遞數據的標準 Unix 習慣用法。


我使用的命令替換範例:

例如,要確定目前使用者是否以 root 身份執行腳本:

if [ "$( id -u )" -ne 0 ]; then
  echo 'This script requires root privileges, re-run with sudo' >&2
  exit 1
fi

命令替換將$(id -u)替換為 的輸出id -u,這將返回目前使用者的 UID(整數)。

另一個例子。我正在使用 GnuPG 簽署git送出。為了讓 GnuPG 正常工作,我需要GPG_TTY在我的互動式 shell 的初始化文件中設置為目前終端設備的名稱。我這樣做

export GPG_TTY="$( tty )"

這取決於目前終端設備在 shell 會話中的設置GPG_TTY/dev/ttyp4

另一個例子。我有一個腳本必須將在 Solaris 機器上執行視為一種特殊情況:

case "$( uname -s )" in
   SunOS)
       # code specific for Solaris
       ;;
   *)
       # code for all other Unix platforms
esac

另一個例子。該getconf PATH命令返回目前系統的“預設路徑”。我在某些情況下使用它來將PATH變數重置為“正常的預設”值:

PATH="$( getconf PATH )"

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