명령을 실행하면 마지막 매개변수가 저장되어 _
액세스할 수 있습니다.
$ echo $_
그다지 유용한 기능은 아닌 것 같습니다. 그럼 왜 귀찮게? 실용적인 응용 프로그램이 있습니까?
답변1
대화형 용도로 사용되며 "코드 골프"에 사용할 수 있습니다.
다음과 같은 임시 변수가 필요하지 않아 코드를 줄일 수 있습니다.
temp=$destdir/$outfile
cp $infile $temp
chmod go-w $temp
도착하다
cp $infile $destdir/$outfile
chmod go-w $_
$_
이 기능이 표시되지 않습니다.특수 매개변수POSIX; Bash 확장입니다(아마도 다른 쉘에 있음).
debug
이는 다음 스크립트에 표시된 것처럼 트랩을 설정하면 중단되는 제대로 구현되지 않은 해킹입니다 .
#!/bin/bash
dbg()
{
:
}
echo abc
echo $_
trap dbg debug
echo abc
echo $_
Bash 4.4.20의 출력은 다음과 같습니다.
$ ./underscore.sh
abc
abc
abc
dbg
$_
디버그 트랩을 활성화하면 예상 값이 더 이상 렌더링되지 않는 것을 볼 수 있습니다 . 사양에서 "마지막 명령"은 말 그대로 명령 시퀀스의 이전 명령이 아니라 가장 최근에 실행된 명령을 의미합니다.abc
echo abc
$_
디버그 트랩의 도움으로 구현된 디버거를 사용하여 디버깅하려는 모든 Bash 프로그램에서는 이를 사용하고 싶지 않을 것입니다.
의 대화형 사용은 $_
동일합니다. 이전 명령의 마지막 인수를 참조하세요. 이것은 질문을 제기합니다: 왜 명령 중 하나 대신 이것을 사용하거나 M동일한 프로젝트를 명령줄로 확장 합니까 _?M.
차이점은 다음과 같습니다 $_
.
긴 경로를 확장하는 것보다 훨씬 더 컴팩트합니다.
명령이 기록에서 호출되면
$_
더 이상 기록의 이전 명령을 참조하지 않고 가장 최근에 실행된 명령을 참조합니다. 이는 악용될 수 있습니다. 동일한 인수를 사용하여 이전 명령을 완전히 반복하는 대신$_
가장 최근에 사용된 오른쪽 인수에 대한 작업이 포함된 명령을 호출하고 재사용할 수 있습니다 .생성된 콘텐츠는 생성된 이전 명령의 실제 마지막 인수를 M.사용하여 확장되지 않은 원본 명령줄을 기반으로 합니다 .
$_
이 차이점을 다음과 같이 표시할 수 있습니다.$ echo a{b,c} ab ac $ echo $_ ac $ echo a{b,c} $ echo █
커서 블록이 가리키는 지점에 명령을
█
입력합니다 . M.메타 는 또는 수정 M자일 수 있습니다 . 결과 :EscAlt$ echo a{b,c}█
즉,
a{b,c}
의미 항목이 아닌 이전 명령에서 비어 있지 않은 원래 마지막 토큰을 삽입합니다ac
. 이는 GNU Bash 기능이라기보다는 GNU Readline 기능에 더 가깝습니다.
답변2
종종 섞어서 사용하는데
mkdir verylongdirectoryname
cd $_