![我可以让所有命令都有有效或无效的反馈吗?](https://linux22.com/image/1119887/%E6%88%91%E5%8F%AF%E4%BB%A5%E8%AE%A9%E6%89%80%E6%9C%89%E5%91%BD%E4%BB%A4%E9%83%BD%E6%9C%89%E6%9C%89%E6%95%88%E6%88%96%E6%97%A0%E6%95%88%E7%9A%84%E5%8F%8D%E9%A6%88%E5%90%97%EF%BC%9F.png)
有时当我运行命令时它不会显示输出,所以我不确定它们是否有效。是否可以让所有命令都有反馈,无论它们是否正确运行?或者至少显示它们是否运行的反馈(正确或不正确)
答案1
要检查某个命令是否成功运行,您可以检查返回状态,由 给出$?
,上一个命令的内容为:
echo $?
返回状态0
表示命令成功完成,而非零输出(错误代码) 表示遇到了一些问题或出现了错误,错误类别可以从错误代码中得知。Linux/C 错误代码在/usr/include/asm-generic/errno-base.h
和中定义/usr/include/asm-generic/errno.h
。
此外,在 bash 中,.bashrc
定义了一个别名alert
,可用于通知完成状态。您必须将别名与命令或命令组合附加在一起,如下所示:
some_command --some-switch; alert
您可以将以下代码行附加到文件中~/.bashrc
以显示返回状态最后执行的命令..
# show the return code of last command executed PS1='${debian_chroot:+($debian_chroot)}\u@\h(lst ret. $(echo $?) ):\w\$ '
(使用您选择的文本编辑器打开文件~/.bashrc
,复制上面的行,将其粘贴到文件中并保存。启动终端的新实例,您应该可以运行它。或者您可以定义一些函数并像PS1
下面所示那样使用它。)
一个小演示:
hash@precise(lst ret. 0 ):~$ ls -sh someFileThatsNotThere
ls: cannot access someFileThatsNotThere: No such file or directory
hash@precise(lst ret. 2 ):~$
hash@precise(lst ret. 2 ):~$ aCommandThatsNot
aCommandThatsNot: command not found
hash@precise(lst ret. 127 ):~$
hash@precise(lst ret. 127 ):~$ echo "you should get a lst ret. 0, I believe the system has echo installed :)"
you should get a lst ret. 0, I believe the system has echo installed :)
hash@precise(lst ret. 0 ):~$
hash@precise(lst ret. 0 ):~$ sudo touch /tmp/someTestFile
[sudo] password for hash:
hash@precise(lst ret. 1 ):~$
hash@precise(lst ret. 1 ):~$ chown $USER:$USER /tmp/someTestFile
chown: changing ownership of `/tmp/someTestFile': Operation not permitted
只是玩玩PS1
:) ..再多一点,
function showRetStat { ## line1: initiliazing retStat with the return status of the previous command retStat=$? ## line2: Left padding the return status with spaces. If you prefer the unpadded one, you can just replace # $retStatFtd in the lines initializing noErrStr and errStr among other possible ways. retStatFtd=$(sed -e :a -e 's/^.\{1,2\}$/ &/;ta' <<< $retStat) ## lines3&4: Setting the strings to display for a successful and unsuccessful run of previous command # which we are going to display with the prompt string. Change the strings to display text of your # choice like you may set noErrStr="yippie!" , errStr="oopsie!" in place of what they're now. noErrStr="retStat "$retStatFtd" :: PASS ^_^" errStr="retStat "$retStatFtd" :: FAIL x_x" ## line5: Applying the logic and display the proper string at the prompt. Space padded number i.e. retStatFtd, here, # worked in the logic, originally I intended to use this for the display while retStat in the conditional # check; you could make the function one statement less if you want to. echo "$([ $retStatFtd = 0 ] && echo "$noErrStr" || echo "$errStr")" } ## Combining the function showRetStat into the prompt string. PS1='${debian_chroot:+($debian_chroot)}\u@\h($(showRetStat)):\w\$ '
(您可以修改该函数以使其更加精美,就像@gronostaj 在他的帖子中所做的那样。)
答案2
(我想既然你在里面发帖询问 Ubuntu我们可以假设你正在谈论默认 shell,也就是说,猛击。
Stack Overflow 上有一个非常好的答案在 shell 脚本中:在执行 shell 命令时回显它们(这不仅仅是一个特定于 Ubuntu 的解决方案)。
你需要做的是使用放命令来打开详细或 xtrace。
set -o
将为您提供当前参数切换至的列表在或者离开。
set -v
或完整版本:
set -o verbose
会变得冗长在。
不过,我认为你想要的实际上是 xtrace。这不仅会回显你运行的每个命令,还会扩展参数并为你提供更多反馈。因此,如果我做一些愚蠢的事情,比如在终端上输入“hi”,我将得到我输入内容的回显以及 shell 为尝试执行命令“hi”所做的事情的报告/跟踪(见下面的屏幕截图):
要启用 xtrace:
set -x
或者:
set -o xtrace
要禁用这些参数,你可以(违反直觉地)调用相同的命令,但要使用加号+而不是破折号或减号,例如:
set +v
会变得冗长离开, 相似地:
set +x
将转向 xtrace离开。
有关 shell 选项的详细指南位于第 33 章 选项,高级 Bash 脚本指南。
答案3
您可以更改命令提示符,以便当前一个命令以 0 退出时显示绿色勾号,否则显示红色 X。Arch Linux 维基有一些很好的代码可以添加到您的bash.rc
:
set_prompt () {
Last_Command=$? # Must come first!
Blue='\[\e[01;34m\]'
White='\[\e[01;37m\]'
Red='\[\e[01;31m\]'
Green='\[\e[01;32m\]'
Reset='\[\e[00m\]'
FancyX='\342\234\227'
Checkmark='\342\234\223'
# Add a bright white exit status for the last command
#PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
PS1+="$Green$Checkmark "
else
PS1+="$Red$FancyX "
fi
# If root, just print the host in red. Otherwise, print the current user
# and host in green.
if [[ $EUID == 0 ]]; then
PS1+="$Red\\h "
else
PS1+="$Green\\u@\\h "
fi
# Print the working directory and prompt marker in blue, and reset
# the text color to the default.
PS1+="$Blue\\w \\\$$Reset "
}
PROMPT_COMMAND='set_prompt'
(我已经禁用实际的错误代码,因为我不喜欢它,如果您想查看确切的代码,只需#
从此行删除#PS1="$White\$? "
:)
它看起来是这样的:
答案4
是的,可以获得在终端上执行的每个命令的反馈。它的工作原理是,echo $?
如果命令成功完成则返回 0,如果失败则返回 0 以外的任何其他值。
要获得成功或失败的反馈,请将以下行添加到~/.bashrc
文件中。
bind 'RETURN: ";if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;\n"'
然后源~/.bashrc
文件使其工作。
source ~/.bashrc
解释:
对于你在终端上执行的每个命令,此;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
代码将自动地与其绑定。
例子:
$ sudo apt-cache policy firefox;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
firefox:
Installed: 24.0+build1-0ubuntu1
Candidate: 24.0+build1-0ubuntu1
Version table:
*** 24.0+build1-0ubuntu1 0
500 http://ubuntu.inode.at/ubuntu/ saucy/main amd64 Packages
100 /var/lib/dpkg/status
SUCCESS
$ suda apt-get update;if [[ $? == 0 ]]; then tput setaf 6 && echo SUCCESS; tput sgr0; else tput setaf 1 && echo FAILURE; tput sgr0; fi;
No command 'suda' found, did you mean:
Command 'sudo' from package 'sudo-ldap' (universe)
Command 'sudo' from package 'sudo' (main)
suda: command not found
FAILURE