스크립트에서 !$를 사용할 수 없나요?

스크립트에서 !$를 사용할 수 없나요?

왜 이것이 작동하지 않는지 궁금합니다.

#!/bin/bash 

ls /bin
ls !$

두 번 실행할 것으로 예상했지만 ls /bin두 번째에는 !$해석되지 않아 오류가 발생합니다.

뭔가 빠졌나요? 아니면 !$명령줄에서만 작동하나요?

man bash(Mac에서) 관련 부분을 찾을 수 없습니다

답변1

역사그리고역사적 확장셸이 비대화식으로 실행되면 기본적으로 비활성화됩니다.

다음을 수행해야 합니다.

#!/bin/bash 

set -o history
set -o histexpand

ls /bin
ls !$

또는:

SHELLOPTS=history:histexpand bash script.sh

script.sh실행 가능한 모든 bash 인스턴스에 영향을 미칩니다 .

답변2

하는 것이 현명할 것이다

ls /bin
ls $_

또는

set ls /bin
$*
$*

또는

c='ls /bin'
$c
$c

주의 사항: 각 방법에는 몇 가지 함정이 있다는 점을 기억할 가치가 있습니다. $_ 솔루션은 마지막 매개변수만 캡처합니다. 따라서 ls foo bar$_에는 bar.사용된 매개변수만 포함 set되어 매개변수( 등)가 재정의 $1됩니다 $2. 이 작성은 모두 작동하지만 이스케이프 및 공백이 중요한 더 복잡한 명령으로 일반화할 때 약간의 어려움에 직면할 수 있습니다. 예를 들면 다음과 같습니다. ( ls 'foo bar'단일 경로 이름 인수에는 다음이 foo bar포함됩니다 .이상의 공백 또는 기타 공백 문자)는 두 예 모두에서 올바르게 실행되지 않습니다. 이러한 상황을 해결하려면 적절한 이스케이프(아마도 eval명령과 함께) 또는 "$@"대체가 필요할 수 있습니다 $*.

관련 정보