我可以在“ &&”之后的“ &&”之前引用命令吗?


10

不知道如何用其他方式表达问题,但是基本上,我经常发现自己正在运行一个命令,例如vagrant启动虚拟机,然后像下面这样使用ssh进入该命令:

vagrant up && vagrant ssh

除了编写自己的函数或脚本之外,还有没有办法“重用” vagrant命令第二部分中的部分?


您可能会在一个相关的问题上找到有用的答案:unix.stackexchange.com/a/140513/14084
Bernhard

Answers:


23

随着(t)cshbashzsh历史扩展,你可以写:

vagrant up && !#:0 ssh

但是,说真的,你不会


这是我一直在寻找的,但是是的。可能更容易做一个别名或函数。谢谢!
jktravis 2014年

@glenn您能解释一下!#:0代表什么。如果我们将0替换为1、2或任何数字,那意味着什么?
RAM

4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#指的是您目前键入线,并:0在该线路(“流浪者”)的第一个字。所以!#:1会“上升”,等等
格伦·杰克曼

4
圣牛的人。停止支持我的答案。考虑一下a)重新键入“ vagrant”或b)首先记住“!#:0”然后键入它所需的智力。
glenn jackman 2014年

13

您可以这样做:

eval vagrant\ {'up &&',ssh}

但这并不会使其变得容易。

你总是可以做一个功能

doall() {
  cmd=$1; shift
  for arg do
    "$cmd" "$arg" || return
  done
}

接着:

doall vagrant up ssh

不错的方法!我喜欢能够将其用于多个应用程序的想法。谢谢!
jktravis 2014年

4

不是直接的答案,而是两个值得一看的替代方案(太多的评论):

  1. 别名

    如果您重复使用命令,则可以将别名放入 ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. 命令行历史

    Ctrl+ R让我们搜索以前的命令。这将比使用变量快得多...


4
 v=vagrant; $v up && $v ssh

那可能接近您想要的。

这是一个函数bash-in-将为当前复合命令在命令位置打印第一个单词:

rc() { $(set -f; unset IFS
        set -- $(history 1)
        IFS="(){};|'\\\"&#"
        set \ $2;IFS=\ ;set -- $*
        printf %s "$1") "$@"; }

这样,您可以执行以下操作:

vagrant up && rc ssh

一个例子:

echo up && rc ssh

输出值

up
ssh

要么...

set -x
(echo);rc 'times two'

输出值

+ echo

+ rc 'times two'
++ set -f
++ unset IFS
+++ history 1
++ set -- 549 '(echo);rc' ''\''times' 'two'\'''
++ IFS='(){};|'\''\"&#'
++ set ' ' echo '' rc
++ IFS=' '
++ set -- echo rc
++ printf %s echo
+ echo 'times two'
times two
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.