루트 디렉토리에 사용 가능한 데이터를 표시하고 쉘 스크립트에서 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
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] #