Shell: 분리할 때 이전 명령의 마지막 인수를 얻는 방법은 무엇입니까?

Shell: 분리할 때 이전 명령의 마지막 인수를 얻는 방법은 무엇입니까?

셸에서 이전 명령을 호출하는 마지막으로 전달된 인수를 입력 ALT+.하거나 사용합니다 . !$이거 항상 사용하는데, 이전 명령어를 떼어내면 어떻게 하시나요?

$ do-something foo a_long_file_name &

a_long_file_name앰퍼샌드 대신 힌트를 얻는 방법은 무엇입니까 ?

답변1

\e-\e.(또는 alt/option 을 누른 채 -) .마지막 단어에서 두 번째 단어를 삽입합니다.

마찬가지로 \e-2\e.마지막에서 세 번째 단어를 삽입한 후 \e2\e.세 번째 단어를 삽입합니다.

답변2

기록 확장을 사용하면 이전 명령의 단어에 액세스할 수 있습니다. 여기서 !:nn은 명령 이름으로 0에서 시작합니다. 이 경우 !^에는 !:1.!:2

$ echo foo bar &
[1] 10750
foo bar
$ echo !:2
echo bar
bar
[1]+  Done                    echo foo bar

답변3

당신은 $_.

echo 'hey there' &
echo "$_"

산출

hey there
hey there

답변4

Glenn과 Laurie의 답변은 정확하지만 제 생각에는 입력이 너무 많이 필요합니다. 마지막으로 나는 다음과 같은 해결책을 생각해 냈습니다. C-j이전 명령의 인수(앰퍼샌드 제외)를 마지막에서 첫 번째까지 반복합니다. 이것은 매우 실용적입니다! 수행 방법은 다음과 같습니다.

다음 bash 스크립트를 작성하십시오.

#!/bin/bash

cj_hist=$(builtin history | tail -n1)
cj_num=$(cut -f1 -d\  <<< $cj_hist)

if [[ $cj_old_num -eq $cj_num ]]
then
  cj_killw='\x17'
else
  cj_args=$(cut -f3- -d\  <<< $cj_hist)
  cj_args=${cj_args%&}
  cj_args=($cj_args)
  cj_cnt=0
  cj_killw=''
fi

[[ $cj_cnt -le 0 ]] && cj_cnt=${#cj_args[*]}
let cj_cnt--

if [[ $cj_cnt -eq -1 ]]
then
  bind '"\ez":""'
  # bind -m vi-insert '"\C-o":""'
else
  bind '"\ez":"'$cj_killw${cj_args[$cj_cnt]}'"'
  # bind -m vi-insert '"\C-o":"'$cj_killw${cj_args[$cj_cnt]}'"'
fi

cj_old_num=$cj_num

이것을 ~/.bashrc에 넣으세요:

 bind -x '"\ew": source ~/foo.sh'  # ~/foo.sh is the script's path
 bind '"\C-j":"\ew\ez"'
 # bind -x '"\C-h": source ~/foo.sh'      # vi-users: no mess
 # bind -m vi-insert '"\C-j":"\C-h\C-o"'  # with escapes

참고: 스크립트를 가져오고 있으므로 일반적이지 않은 변수 이름을 사용해야 하므로 접두사 cj_. 물론 다른 접두사를 사용할 수도 있습니다.

관련 정보