밑줄 변수를 실제로 사용할 수 있나요?

밑줄 변수를 실제로 사용할 수 있나요?

명령을 실행하면 마지막 매개변수가 저장되어 _액세스할 수 있습니다.

$ 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

$_디버그 트랩을 활성화하면 예상 값이 더 이상 렌더링되지 않는 것을 볼 수 있습니다 . 사양에서 "마지막 명령"은 말 그대로 명령 시퀀스의 이전 명령이 아니라 가장 최근에 실행된 명령을 의미합니다.abcecho 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 $_

관련 정보