我想以这样的方式设置我的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 行,我可以将其作为命令操作。
答案 0 :(得分:2)
除了使用鼠标之外,我能想到的唯一方法是使用grep
,sed
和/或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行