首頁>Linux>source

在bash / zsh中,我们使用 $_ 表示上一个命令的最後一个引數供以後使用,但是此引數包含已記錄的"擴充套件版本".有没有可以擴充套件的版本? 如以下示例所示:

printf "%s\n" something{1..3}

我想訪問未展開的 something{1..3} 後面命令中的引數,不仅是 something3

這樣做仍然只会添加到最後一个引數,而不是全部。

bash -c '
   printf "%s\n" "[email protected]" && printf "%s\n" "[email protected]"-add-something-more;
' _ something{1..3}

zsh相同 ,有没有办法做到這一點,而無需 eval 我不類似使用這種方式,而是想要顯示我到底想要什麼的技巧?

bash -c '
    eval printf "%s\\\n" "[email protected]" && eval printf "%s\\\n" "[email protected]"-add-something-more;
' _ 'something{1..3}'
something1
something2
something3
something1-add-something-more
something2-add-something-more
something3-add-something-more

註意:

  • Reading from the history is not an option as commands would executing within script and arguments would passing to the script by a user.
  • I'm using command1 "[email protected]" && command2 "[email protected]"<question-part> 執行 command2的語法 仅当 command1 已成功執行。
最新回復
  • 5月前
    1 #

    要重複使用多个args列表,通常就是(匿名)函式或變數的用途。

    zsh

    () {cmd1 "[email protected]" && cmd2 "[email protected]"} something{1..3}
    
    l=(something{1..3}); cmd1 $l && cmd2 $l
    

    要向每个引數添加相同的字元串,請使用 $^array 語法:

    $ () {echo [email protected]; echo $^@-more} a{1..3}
    a1 a2 a3
    a1-more a2-more a3-more
    

    bash / ksh / zsh 等效為 "${@/%/-more}" )。

    获取 $_的未擴充套件版本 ,您可以執行以下操作:

    TRAPDEBUG() last_cmd=($cur_cmd) cur_cmd=("${(z)ZSH_DEBUG_CMD}")
    

    然後:

    $ echo a{1..3}; echo $last_cmd[-1]
    a1 a2 a3
    a{1..3}
    

    但是請註意, DEBUG 陷阱是在每个子列表之前執行的,而不是pipeline,更不用說command了.所以這對 echo a{1..3} && echo $last_cmd[-1]不起作用 .您需要:

    $ eval 'echo a{1..3}' && eval 'echo $last_cmd[-1]'
    a1 a2 a3
    a{1..3}
    

  • touchpad:有没有办法让像nedit這樣的編輯器可以从觸控板水平滚動?
  • 使用bash擴充套件遞迴建立目錄和檔案