셸에서 이전 명령을 호출하는 마지막으로 전달된 인수를 입력 ALT+.
하거나 사용합니다 . !$
이거 항상 사용하는데, 이전 명령어를 떼어내면 어떻게 하시나요?
$ do-something foo a_long_file_name &
a_long_file_name
앰퍼샌드 대신 힌트를 얻는 방법은 무엇입니까 ?
답변1
\e-\e.
(또는 alt/option 을 누른 채 -
) .
마지막 단어에서 두 번째 단어를 삽입합니다.
마찬가지로 \e-2\e.
마지막에서 세 번째 단어를 삽입한 후 \e2\e.
세 번째 단어를 삽입합니다.
답변2
기록 확장을 사용하면 이전 명령의 단어에 액세스할 수 있습니다. 여기서 !:n
n은 명령 이름으로 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_
. 물론 다른 접두사를 사용할 수도 있습니다.