从前一个stdout到命令行的文本

时间:2010-10-25 00:10:45

标签: bash shell terminal readline

我想以这样的方式设置我的Bash,我可以从上一个命令的标准输出中取出文本。我将使用的示例用例是在git rebase期间解决冲突。

$ git status
# Not currently on any branch.
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified:      app/views/report/index.html.erb
#
$ vim app/views/report/index.html.erb
# .... edit, resolve conflicts ....
$ git add <Alt+.>

问题是获取第二个命令(vim ...)的文件名的最简单方法是将我的手移到鼠标上。一个选项是screen,但它有一组自己的问题作为日常shell。 (其中最重要的是我使用并滥用Ctrl + A作为readline快捷方式)

我可以从哪里开始为我工作?理想情况下,我希望能够从上一个命令的stdout中拉出 N 行,我可以将其作为命令操作。

3 个答案:

答案 0 :(得分:2)

除了使用鼠标之外,我能想到的唯一方法是使用grepsed和/或awk,也许使用tee和/或Bash函数和进程替换和/或进程和/或命令替换:

vim $(git status | tee /dev/tty | grep ...)

var=$(git status | tee /dev/tty | grep ...)
vim "$var"
git add "$var"

tee允许您在捕获修改后的输出时查看完整输出。创建一个函数可以让你轻松传递一个选择某一行的参数:

var=$(some_func 14)
etc.

缺点是你必须从一开始就这样做。事实上我不知道如何在没有使用screen或其他输出记录和脚本翻阅日志的情况下执行此操作。

答案 1 :(得分:1)

我不知道一个好的,干净的解决方案,但作为一个黑客你可以尝试script命令,它将所有输入和输出记录到一个文件。对于GNU script

$ script -f
Script started, file is typescript
$ ls -1
bar
baz
foo
typescript
$ echo $(tail -3 typescript | head -1)
foo

答案 2 :(得分:0)

通过sed管道输出:

git status | sed -n '5p'

获得第5行