我想制作一个 shell 脚本,显示根目录上的可用数据,并通过在 shell 脚本中使用 PROMPT_COMMAND 在提示中的每个新命令后连续显示它。但是,我可以获得可用数据,但我不知道如何应用 PROMPT_COMMAND 来读取可用数据以使其正常工作。我必须专门使用 PROMPT_COMMAND 来执行此操作。
现在我的脚本中有这个:
df -h /root |awk '{print $4}'| grep "." | PROMPT_COMMAND= ""
关于如何在我的脚本中使用 PROMT_COMMAND 以便它工作并给我正确的输出有什么想法吗?
我确实在使用bash。 grep 函数确实是多余的。
答案1
$PROMPT_COMMAND
是特定于bash
外壳的。它是一个特殊的变量,旨在包含在显示每个提示之前评估的 bash 代码,因此它仅与交互式 shell(而不是脚本)相关,并且应该类似于:
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$ '
您通常会将其放入您的源中(当 shell 是交互式时,您的源~/.bashrc
中会有一些代码)。~/.bash_profile
~/.bashrc
在 中zsh
,等价的是precmd
函数。虽然您还可以在设置选项后在提示中进行参数扩展promptsubst
,但设置psvar
nth元素并以通常更安全的方式引用它们:%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
始终位于根文件系统上,因为即使未安装其他文件系统,根帐户也可用且完全可操作,这一点很重要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] #