이전 명령의 마지막 매개변수에서 두 번째 매개변수만 가져오기

이전 명령의 마지막 매개변수에서 두 번째 매개변수만 가져오기
[ -f /root/.bash_aliases ] || echo "$_"

나에게주세요]

제 생각에는/root/.bash_aliases

나도 시도했다

[ -f /root/.bash_aliases ] || echo !:2

하지만 그것은 나에게 다음과 같은 결과를 제공합니다

[ -f /root/.bash_aliases ] || echo /root/.bash_aliases
/root/.bash_aliases

나는 그저 원할 뿐이야/root/.bash_aliases

답변1

이 기능의 목적은 다음과 같습니다.

print_if_not_regular() {
  [ -f "$1" ] || printf '%s\n' "$1"
}
print_if_not_regular /root/.bash_aliases

일부 쉘에는 익명 기능이 있거나 다음과 같은 기능이 있습니다 es.zsh

(){[ -f "$1" ] || printf '%s\n' $1} /root/.bash_aliases # zsh
@ {[ -f $1 ] || printf '%s\n' $1} /root/.bash_aliases # es

$_예를 들어 DEBUG 트랩이 있으면 더 이상 작동하지 않습니다 .

$ bash -c 'trap ": \"\$((cmdcount+=1))\"" DEBUG; echo foo; echo "$_"'
foo
2

이는 !:n마지막 명령의 n번째 인수가 아니라 이전 명령줄의 n번째 어휘 토큰 입니다 (기록의 마지막 줄(및 여러 줄)에 저장됨). 예를 들어,

echo $(echo A B)
echo foo; echo !:1

(마지막 명령의 마지막 인수)나 ( 이전 명령줄에 있는 명령의 마지막 인수) !:1로 확장되지 않고 대신에 확장 됩니다 . 여기에 다음을 입력해야 합니다:fooBechoecho$(echo A B)

[ -f /root/.bash_aliases ] ||
  echo !:2

즉, 별도의 줄에 입력합니다. 여기서는 두 번째 줄을 입력할 때 기록 줄이 완전히 끝나지 않은 경우에도 (우연히) 작동합니다. 동일한 트릭이 (t)csh(역사적 확장의 소스)에서는 작동하지 않으며 작동하지 않습니다 zsh.

답변2

사용

test -f /root/.bash_aliases || echo "$_"

또는

test -f /root/.bash_aliases || printf '%s\n' "$_"

$_이전 명령의 마지막 인수로 확장됩니다. 귀하의 예에서 이전 명령은 [이고 마지막 인수는 입니다 ].

위의 마지막 명령은 test마지막 매개변수가 파일 이름이라는 것입니다.

test[동일한 명령이지만 마지막 명령줄 인수로 [a가 필요합니다 . ]이 경우 $_파일 이름을 얻는 데 사용하기가 어려운 이유입니다.

위의 솔루션은 적어도 bash( DEBUG트랩을 설정하지 않는 한) 및 에서 작업할 수 있다는 장점이 있습니다 zsh.


파일 이름이 변수에 있으면 간단합니다.

[ -f "$name" ] || printf '%s\n' "$name"

또는

if [ ! -f "$name" ]; then
    printf '%s\n' "$name"
fi

if명령문 및 단락 논리 테스트에 대한 선호도 에 따라 다릅니다 .

관련 정보