如何在不每次都键入的情况下为 shell 中的所有命令添加前缀?
我的用例1:
$ git init
$ git add -A
$ git commit
$ git push
Run Code Online (Sandbox Code Playgroud)
前缀应该是git?(?是空格字符)
init
add -A
commit
push
Run Code Online (Sandbox Code Playgroud)
我的用例2:
sudo docker run my-repo/my-image
sudo docker ps
sudo docker images
Run Code Online (Sandbox Code Playgroud)
前缀应该是 sudo docker?
run my-repo/my-image
ps
images
Run Code Online (Sandbox Code Playgroud)
如果我能做这样的事情,那就最好了:
$ git init
$ use_prefix sudo docker
> ps
> images
> exit
$ sudo docker run my-repo/my-image
Run Code Online (Sandbox Code Playgroud) 所以我希望我运行的所有命令都通过管道传输到另一个命令,并且我尝试使用 .bashrc 函数:
* () {
${@} | [my command]
}
Run Code Online (Sandbox Code Playgroud)
例如,我真正想要实现的是一种将上次运行的命令的标准输出存储在临时文件中的方法,您可以使用另一个命令调用该文件:
* () {
${@} | tee /tmp/last_command
}
Run Code Online (Sandbox Code Playgroud)
解释我想要实现的目标的另一种方式:类似 ALIAS [any_command]='[any_command] | tee /tmp/last_command'
所以这是我将通过tee示例实现的实际示例:
$ tail -5 /etc/passwd
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
Run Code Online (Sandbox Code Playgroud)
命令运行时实际发生了什么(但我不必每次都写它):
$ tail -5 /etc/passwd | tee /tmp/last_command
Run Code Online (Sandbox Code Playgroud)
所以这是一个完整的例子:
$ tail -5 /etc/passwd
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
$ cat /tmp/last_command
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
somethingsomethingsomethingsomething
$ date
Tue Jan 14 13:26:04 EET 2020
$ cat /etc/last_command
Tue Jan 14 13:26:04 EET …Run Code Online (Sandbox Code Playgroud) 我经常像这样在我的源代码存储库上运行搜索:
ack -l "foo bar" .
Run Code Online (Sandbox Code Playgroud)
搜索可能需要 10-60 秒并产生如下输出:
path/to/file1
path/to/file2
path/to/file3
Run Code Online (Sandbox Code Playgroud)
我经常使用这个别名来打开在 vim 中找到的所有文件:
alias go='gvim `fc -s` -p'
Run Code Online (Sandbox Code Playgroud)
这工作正常,但fc -s重新运行前一个命令,这可能需要几秒钟或几分钟。
将这样的内容附加到我以交互方式运行的每个命令中会非常有用:
| tee /tmp/lastCommand to all commands.
Run Code Online (Sandbox Code Playgroud)
这样,如果输出显示自己有用,那么我可以对它做其他事情。
用法示例:
类型:
find . -type f
Run Code Online (Sandbox Code Playgroud)
执行以下操作:
find . -type f | tee $lastOutLocation # Where lastOutputLocation=/tmp/lastOutput
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这样的东西来过滤上一个命令:
lastOut | grep "SomeString" # Where lastOut is an alias to cat $lastOutputLocation
Run Code Online (Sandbox Code Playgroud)
有没有一种机制可以用来做这样的事情? 我不认为别名会暴露这种行为。
潜在的障碍:
echo 'baz' ; echo 'bar'可能的解决方案,我目前正在探索: