我有一个 bash script.sh。我可以像这样轻松滚动输出:
$ ./script.sh | less
但是如何使输出显示自动滚动,而不必通过管道呢less
?换句话说,我如何将该功能直接放入脚本本身?我只想像这样执行脚本:
$ ./script.sh
我知道我可能能够编写一个不同的脚本来执行第一个脚本并自动管道输出,但我不想编写另一个脚本只是为了让第一个脚本做我想做的事情。明白我的意思了吗?
你可以这样写你的脚本:
#!/bin/bash
(
Your script here
) | less
exit $PIPESTATUS
less
如果输出是终端,这将通过管道输出脚本(因此您可以./script.sh > file
不分页),并保留脚本的退出代码。
通常足够将下一个添加到您的脚本中
#!/bin/bash
( # add this to the start
#your old script here
date
cat /etc/passwd
df
ls -l
#end of your script
) | less #and add this to the end
或者您可以将整个脚本放入 bash 函数中,例如
#!/bin/bash
the_runner() {
#your old script here
date
cat /etc/passwd
df
ls -l
#end of your script
}
the_runner "$@" | less
我决定向 Bash 添加一个特殊绑定,而不是修改脚本本身。
实际上,您将能够编写./script.sh
而不是( ./script.sh ) | more
.
这是您需要添加到您的.bashrc
:
# Switch to vi mode (default is emacs mode).
set -o vi
dont_scroll_down() {
# Add the command to your history.
history -s "$READLINE_LINE"
# Redirect all output to less.
bash -c "$READLINE_LINE" 2>&1 | less -eFXR
# Remove the command from the prompt.
READLINE_LINE=''
# Optionally, you can call 'set -o vi' again here to enter
# insert mode instead of normal mode after returning from 'less'.
# set -o vi
}
bind -m vi -x '"J": "dont_scroll_down"'
因此,您将能够执行以下操作:
键入要运行的命令。
$ ./script.sh
点击Escape退出插入模式并进入正常模式。
现在点击Shift-j执行该行。
现在您应该能够从头开始滚动输出。