
ルートディレクトリに利用可能なデータを表示し、シェルスクリプトでPROMPT_COMMANDを使用して、プロンプトの各新しいコマンドの後に継続的に表示するシェルスクリプトを作成したいと思います。しかし、利用可能なデータを取得できますが、PROMPT_COMMANDを適用して利用可能なデータを読み取って動作させる方法がわかりません。これを行うには、特にPROMPT_COMMANDを使用する必要があります。
スクリプトには次のものが含まれます。
df -h /root |awk '{print $4}'| grep "." | PROMPT_COMMAND= ""
私のスクリプトでPROMT_COMMANDを使用して動作し、正しい出力を提供する方法についてのアイデアはありますか?
私は実際にbashを使用しています。 grep機能は実際に重複しています。
答え1
$PROMPT_COMMAND
bash
シェルによって異なります。各プロンプトが表示される前に評価されるbashコードを含むように設計された特殊変数であるため、スクリプトではなく対話型シェルにのみ関連し、次のようにする必要があります。
PROMPT_COMMAND='
available_space_on_root_fs=$(df -h --output=avail /)
available_space_on_root_fs=${available_space_on_root_fs##*[[:space:]]}
'
PS1='$available_space_on_root_fs$ '
通常、これをソースに入れます(シェルがインタラクティブな場合は、ソース~/.bashrc
にいくつかのコードがあります)。~/.bash_profile
~/.bashrc
でzsh
これに対応するのはprecmd
関数です。オプションを設定した後、プロンプトでパラメータ拡張を実行することもできますがpromptsubst
、psvar
N要素は通常より安全な方法で参照されます。%nv
precmd() psvar[1]=${$(df -h --output=avail /)[-1]}
PS1='%1v$ '
(存在する~/.zshrc
)
グローバルフックを設定するだけでなく、配列precmd
に関数名を追加することもできますprecmd_functions
。
determine-avail-space() psvar[1]=${$(df -h --output=avail /)[-1]}
precmd_functions+=(determine-avail-space)
PS1='%1v$ '
上記の前提とオプションはdf
GNUです(後者は他の多くの実装にあります)。 Linuxでは、ヘッダーなしで結果を提供するを参照してください。--output=avail
-h
findmnt -no avail /
私たちが話すルートFSは通常、ユーザーのホームディレクトリにマウントされています/
。他のファイルシステムがマウントされていない場合でも、rootアカウントは利用可能で完全に機能するため、常にルートファイルシステムに存在し、同じ情報を提供する必要があります。/root
root
/root
df /
df /root
答え2
そのコマンドは次のとおりです。
df -h /root |awk '{print $4}'| grep "."
PROMPT_COMMAND は、コマンドを保持する変数です。だから:
PROMPT_COMMAND="df -h /root |awk '{print $4}'| grep \".\""
完璧。
答え3
一般的なプロンプトの前にhomedirのサイズを表示し、bashを使用する場合:
#you can place the later inside your .bashrc once you are satisfied it works:
PROMPT_COMMAND=' df -h ~ | tail -n 1 | awk '\''{print $(NF-2),$(NF-1), $NF }'\'' | xargs printf "%s " '
# this will display: available, %of_usage, and name before your usual prompt:
354Mb 68% /root [usual prompt here] #
# it is better to have it displayed not before the prompt line, but on a separate line, so:
PROMPT_COMMAND=' df -h ~ | tail -n 1 | awk '\''{print $(NF-2),$(NF-1), $NF }'\'' '
# will display it before the prompt line, not messing up with bash computation of the prompt-line length
354Mb 68% /root
[usual prompt here] #