\를 사용하여 함수를 이스케이프할 수 있나요?

\를 사용하여 함수를 이스케이프할 수 있나요?

.bashrc우회하려는 함수를 내에서 정의했습니다 .

function func() {
   // func
}
export -f func

실행할 때 방해받지 않고 명령에 env -i func액세스할 수 있지만 시도하면 운 이 없습니다.funcfunction"func"\func

\Bash 기능을 우회하는 것이 가능해야 한다는 또 다른 기사를 읽었습니다 . 이것이 사실입니까? 그렇다면 이런 상황에서 사용하지 못할 이유가 있을까요?

답변1

쉘이 함수 정의를 사용하는 것을 방지하는 공식적인 방법은 다음을 호출하는 것입니다.

command func

바라보다:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html

답변2

예를 들어 외부 명령 "func"의 경로 이름을 사용할 수 있습니다 /usr/bin/func.

답변3

함수 이름에 백슬래시나 다른 형태의 인용을 사용해도 아무런 효과가 없습니다. 쉘의 구문 분석에서는 따옴표가 구문 분석된 후 오랫동안 함수를 찾습니다.

당신이나 당신이 읽은 것을 쓴 사람은 혼란스러운 기능과 별칭입니다. 별칭은 훨씬 일찍 해결되며 명령 이름의 일부를 참조하면 별칭 조회에 적합하지 않게 됩니다. 따라서 함수, 내장 또는 외부 명령이 되어야 하지만 별칭은 아닙니다 \func.func

명령 이름을 내장 명령이나 외부 명령으로 강제로 해석하려면 command func. 명령 이름을 외부 명령으로 강제로 해석하려면 를 사용하십시오 env func.

답변4

~에 따르면배쉬 문서,

이름

문자, 숫자, 밑줄로만 구성되고 문자나 밑줄로 시작하는 단어입니다. 이름은 쉘 변수 및 함수 이름으로 사용됩니다. 식별자라고도 합니다.

단어

셸에서 하나의 단위로 처리되는 일련의 문자입니다. 단어에는 따옴표가 없는 메타 문자가 포함되어서는 안 됩니다.

함수 이름을 찾습니다사용성격:

명령 이름에 슬래시가 포함되어 있지 않으면 쉘은 슬래시를 찾으려고 시도합니다. 해당 이름의 쉘 함수가 존재하는 경우 다음과 같이 호출됩니다.쉘 기능.

해당 부분에서 지적한인용하다(처럼POSIX):

따옴표는 특정 문자나 단어의 특별한 의미를 쉘에서 제거하는 데 사용됩니다. 따옴표를 사용하면 특수 문자의 특수 처리를 비활성화하고, 예약어가 그렇게 인식되는 것을 방지하고, 매개변수 확장을 방지할 수 있습니다.

POSIX와 마찬가지로 bash는 참조 및 별칭을 언급하지만 구체적으로 언급하지는 않습니다.기능인용에 대하여.

요약하자면 함수 이름을 참조하는 기능이 문서화되어 있지 않습니다. 외부 명령을 사용하려면 슬래시를 사용하는 것이 가장 좋습니다. 배쉬와POSIX이에 동의합니다:

간단한 명령이 명령 이름과 선택적 인수 목록을 생성하는 경우 다음을 수행해야 합니다.

  1. 명령 이름에 <slash>문자가 포함되어 있지 않으면 첫 번째 성공적인 단계는 다음 순서로 수행되어야 합니다.

문서를 읽는 것이 도움이 됩니다.

관련 정보