Bash 확장 동작

Bash 확장 동작

나는 readline 함수 shell-expand-linealias-expand-line.from을 작업 중입니다.문서:

쉘 확장 라인껍질처럼 선을 확장하십시오. 이는 별칭 및 기록 확장은 물론 모든 쉘 단어 확장(셸 확장 보기).

내가 이해하는 바는 shell-expand-linebash가 실제 실행 지점 이전에 수행하는 모든 대체 및 확장을 수행한다는 것입니다.

인위적인 예가 이를 뒷받침하는 것 같습니다.

$ NAME="Adam"
$ alias ec='echo'
$ ec $NAME

함수를 실행하면 shell-expand-line이전 명령이 $ echo Adam.

내 혼란은 다음 예에서 시작됩니다.

$ alias cdspace='cd ~/path\ with\ spaces'
$ cdspace

shell-expand-line내 이해에 따르면 명령을 실행하면 $ cd /Users/Adam/path\ with\ spaces.로 확장되지만 실제로 는 예상대로 작동하지만 실행하여 확장하면 $ cd ~/path with spaces실패 합니다.cdspacealias-expand-lineshell-expand-line

일부견적 삭제~의쉘 확장문제를 해결했습니다.

이전 확장 이후에는 위 확장 중 하나에서 발생하지 않은 따옴표가 없는 문자 '\', ''' 및 '"'가 모두 제거됩니다.

따라서 인용되지 않은 백슬래시는 항상 제거되는 것처럼 보입니다. 이를 테스트하기 위해 수동으로 입력한 $ cd ~/path\ with\ spaces다음 실행 하면 shell-expand-line명령이 로 업데이트됩니다 $ cd ~/path with spaces. 또한 입력한 $ cd ~/path\\ with\\ spaces다음 shell-expand-line두 번 실행하면 실행할 때마다 백슬래시 세트가 제거됩니다.

내 기대는 shell-expand-linebash 내부에서 해당 라인을 완전히 확장하면 결국 문제가 해결될 것이라는 것이었지만 여러 번의 실행이 필요하기 때문에 그렇지 않은 것 같습니다.

내가 지금 궁극적으로 혼란스러워하는 $ cd ~/path\ with\ spaces것은쉘 확장 문서, 결국 해결될 것입니다 $ cd ~/path with spaces.

답변1

여기서 bash 문서가 불분명하다고 생각합니다. 다른 의견에서 지적했듯이 shell-expand-line문서는 다음을 의미합니다.모두물결표 확장이 명백히 수행되지 않을 때 쉘 확장이 수행됩니다.

또한 따옴표 제거 단계에서는 첫 번째 패턴 일치 세트 뒤에 남아 있는 따옴표가 없는 백슬래시를 제거하지 않습니다. 이는 3.5.9(https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Quote-Removal) 표현하다.

즉, 나는 shell-expand-line그 목적이 쉘에서 실행될 수 있는 명령을 생성하는 것이라고 생각하지 않습니다(만약 그것이 당신이 기대하는 것이라면). 모든 쉘 확장을 수행하고 있으므로 입력이 다음과 같다고 가정합니다.이미토큰화된 후 패턴 일치 단계에서는 백슬래시를 제거하여 이전에 이스케이프된 공간을 "이스케이프되지 않은" 공간으로 만듭니다. 결과 문자열을 실행하려고 하면 토큰화됩니다.다시이므로 공백으로 구분된 각 단어는 별도의 토큰으로 처리됩니다.

관련 정보