Bash에서 느낌표(!)를 사용할 수 없나요?

Bash에서 느낌표(!)를 사용할 수 없나요?

!컬 명령을 사용하여 경로에 느낌표( )가 있는 http url에 액세스하려고 합니다. 예를 들어:

curl -v "http://example.org/!287s87asdjh2/somepath/someresource"

콘솔이 응답합니다 bash: ... event not found.

어떻게 되어가나요? 느낌표를 이스케이프 처리하는 올바른 구문은 무엇입니까?

답변1

느낌표는 다음의 일부입니다.역사적 확장배쉬에서. 사용하려면 꼭 필요해요작은따옴표로 묶음(예를 들어 'http://example.org/!132':).

\문자 앞에 백슬래시( )를 사용하여 문자를 직접 이스케이프할 수 있습니다(예: "http://example.org/\!132"). 그러나 느낌표 앞의 백슬래시는 기록 확장을 방지하지만 백슬래시는아니요이 경우 일부 껍질이 제거됩니다. 따라서 curlURL의 일부로 리터럴 백슬래시를 전달 하지 않도록 작은따옴표를 사용하는 것이 좋습니다 .

답변2

Daniel의 답변 외에도 사용하지 않는 경우 기록 확장을 완전히 끌 수도 있습니다.

set +H

또는

set +o histexpand

(후자는 bash 호환성 옵션의 대체 이름인 zsh에서도 작동합니다 .)histexpandbanghist

역사적 확장이 시작된 (t)csh에서는 변수에 빈 문자열을 할당하여 이를 비활성화할 수 있습니다 $histchars.

set histchars = ''

또는:

set histchars

(실패하다 unset histchars)

이는 다음 구문을 사용하더라도 기능을 복제하는 bash 및 zsh에도 적용됩니다.

histchars=

거기.

bash((t)csh 또는 zsh와 반대로) $histchars환경에서 발견된 변수는 무시되지 않으므로 이 변수를 내보낼 때 발생할 수 있는 결과에 유의하세요 .

답변3

개인적으로 나는 작은따옴표를 사용하겠지만, 완전성을 위해 URL이므로 예 !%21들어 curl -v http://example.org/%21132.

답변4

나는 같은 문제가 있었고 간단한 해결책은 변수를 사용하는 것입니다.

E=!  
curl -v "http://example.org/${E}287s87asdjh2/somepath/someresource"

여기서의 단순성은 (1) 쉘과 명령 간에 이식 가능하고 (2) 이스케이프 구문과 ASCII 코드를 알 필요가 없다는 것입니다.

관련 정보