cd 명령에 전달된 괄호를 어떻게 보호할 수 있나요?

cd 명령에 전달된 괄호를 어떻게 보호할 수 있나요?

나는 물었다여기보호 공간을 만드는 방법 cd. 탭 완성 기능은 훌륭하지만 클립보드에서 경로를 붙여넣는 경우가 있으므로 유용합니다.

그러나 솔루션은 괄호로 인해 중단됩니다. 입력을 어떻게 이스케이프하고 보호하려고 시도하더라도 항상 다음을 반환합니다.

bash: syntax error near unexpected token `('

괄호도 처리할 수 있는 방법이 있나요? 내가 원하는 것은 이것을 입력하면 작동한다는 것입니다.

cd My path with spaces (and parentheses)

답변1

'인수 주위에 작은따옴표를 사용하십시오 . (이는 뿐만 아니라 모든 명령에 적용됩니다 cd).

cd 'My path with spaces (and parentheses)'

bash가 괄호를 cd. 공간을 작동시키는 것은 매우 전문적인 해킹입니다.

작은따옴표는 자신을 제외한 모든 문자에 적용됩니다 '. 작은따옴표를 4자 시퀀스로 바꿉니다 '\''.

cd 'Apostrophe'\''s a pain'

디렉토리 이름이 하이픈으로 시작하는 경우 cd명령이 인수를 옵션으로 해석하게 되므로 이는 작동하지 않습니다. --이를 방지하려면 디렉터리 이름 앞에 전달하세요 .

보다https://unix.stackexchange.com/questions/69144/how-do-i-escape-a-sub-directory-name-with-an-ampersand-in-it/69147#69147상세 사항은.

또 다른 방법은 명령줄에 인수를 전달하는 대신 쉘이 별도의 텍스트 줄을 읽도록 하는 것입니다.

Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
Strapakowsky@darkstar ~/My path with spaces (and parentheses)$ 

수동으로 복사하여 붙여넣는 대신 프로그래밍 방식으로 수행하는 것이 좋습니다. 다음 중 하나를 설치하세요.엑스클립또는xsel.

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

이것을 별칭으로 만들 수도 있습니다.

alias cde='cd -- "$(xsel -bo)"'

답변2

cd이름에 공백이나 괄호와 같은 문자가 포함된 디렉터리를 올바르게 지정하는 방법 :

폴더 이름에 작은따옴표 문자가 포함되어 있지 않으면 '작은따옴표로 묶으세요.

cd 'My path with spaces (and parentheses)'

를 포함 '하지만 큰따옴표 문자 ", 백래시 \, 역따옴표 `또는 달러를 포함하지 않는 경우 $큰따옴표로 묶습니다.

cd "My path with spaces (and parentheses)"

파일이나 디렉터리 이름에 작은따옴표와 큰따옴표가 모두 포함되는 경우는 흔하지 않습니다. (이것은 아마도 파일이나 디렉터리 이름에 큰따옴표가 포함되는 것이 일반적이지 않기 때문일 것입니다. 원래 큰따옴표를 권장하지 않은 유일한 이유는 작은따옴표와 달리 큰따옴표를 사용하면 $환경 변수를 확장할 수 있다는 것입니다. 파일 이름에 $문자와 텍스트가 포함되어 있으면 문제가 될 수 있습니다 .)

둘 다 포함되어 있거나 다른 방법을 원하는 경우 \앞에 백슬래시 문자를 삽입하여 각 공백과 괄호를 수동으로 이스케이프할 수 있습니다.

cd My\ path\ with\ spaces\ \(and parentheses\)

짜증나는 일이지만 다행히도 셸에는당신을 위해 그것을 해주세요, 이름의 시작 부분을 입력하고 를 누르십시오 Tab. 로 시작하는 파일 또는 디렉토리 이름이 두 개 이상인 경우 My확장하려면 추가로 입력해야 할 수도 있습니다. 눌렀 Tab는데 확장되지 않으면 Tab다시 눌러 지금까지 입력한 내용과 일치하는 파일 목록을 볼 수 있습니다. 그러면 고유하게 일치하고 확장되도록 하려면 얼마나 더 입력해야 하는지 알 수 있습니다.

또는 내부 따옴표를 이스케이프할 수 있습니다. 예를 들어 다음과 같은 폴더가 있다고 가정해 보겠습니다.

Mischa's gardening tips for "home and office"

당신이 사용할 수있는:

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

그러나 간단히 다음을 사용할 수도 있습니다.

cd 'Mischa'\''s gardening tips for "home and office"'

백슬래시는 작은 따옴표 안에서 특별하지 않으므로 작은 따옴표로 묶인 문자열을 종료하고 백슬래시로 보호된 작은 따옴표를 추가한 다음 즉시 다른 작은 따옴표로 묶인 문자열을 시작합니다. 모두 별도의 인수를 시작하는 공백이 없습니다.

cd당신이 원하는 방식으로 일을 할 수 없는 이유 :

작업에 관해서는 cd My path with spaces (and parentheses): 아니요, 실제로는 그렇게 할 수 없습니다. 이 동작은 명령에만 국한된 것이 아니고 cd명령을 실행하는 방식의 일부이기 때문입니다. 명령이 실행되면 사용자가 제공한 인수 목록이 제공됩니다. 쉘이 공백을 발견하면 하나의 인수가 막 끝났고 다른 인수가 막 시작되었음을 알게 됩니다. 인수의 일부로 공백을 전달하려면 위 방법 중 하나로 공백을 인용해야 합니다.

당신은 달성할 수부분이의일부당시에는 폴더 cd My path with spaces에 들어가도록 작업을 수행할 수 있었습니다 My path with spaces. 사용자가 제공한 모든 인수를 공백으로 연결하는 쉘 스크립트를 작성하여 이를 달성할 수 있습니다. (그런 다음 원하는 경우 cd이름이 지정된 셸 별칭을 만들어 자체적으로 해당 스크립트를 호출 할 수 있습니다. 이는 현재 일반적으로 실행 중인 cd셸 내장보다 우선합니다 .) 그러나:cd

  • 스크립트는 My path with spaces및 에 대해 다른 인수를 받지 않으므로 실패 My path with spaces하거나 cd My path with spaces잘못된 폴더를 입력하게 됩니다.

  • 괄호에 대해서는 이 작업을 수행할 수 없습니다. 괄호는 어떤 방식으로든 명령에 전달되지 않도록 셸에서 그룹화하는 데 사용되기 때문입니다. 실제로 대부분의 경우 쉘은 단순히 구문 오류를 발생시킵니다(본 바와 같이):

    ek@Kip:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token `('
    

    무엇을 변경하더라도 해당 명령이 제공되면 해당 구문 오류가 계속 발생합니다.

나는 당신이 "아마도" 이 작업을 수행할 수 없다고 말합니다. 왜냐하면 당신이 원하는 대로 작동하는 자신만의 쉘을 만들 수 있는 한 가지 방법이 있기 때문입니다. 그러나 이것은 매우 어렵고 단지 이러한 변화를 만들기 위해 그렇게 하고 싶어하는 사람은 거의 없습니다. (기존 셸의 소스 코드를 수정할 수도 있습니다. 이는 보다 실용적인 솔루션이지만 여전히 대부분의 사람들이 쏟고 싶어하는 것보다 더 많은 노력이 필요합니다.) 게다가 cd공백을 포함한 임의 문자가 포함된 디렉터리 이름을 허용할 가능성은 거의 없습니다. , Windows에서와 마찬가지로.

이것이 Windows에서는 작동하지만 Ubuntu에서는 작동하지 않는 이유가 궁금하신 경우: Windows에서는 명령 뒤에 입력된 텍스트가 다음과 같이 전달됩니다.텍스트 문자열, 그리고 명령이 해당 문자열을 별도의 인수 시퀀스로 해석해야 하는 경우(항상 그렇지는 않지만 일반적으로) 명령에 대한 코드는 명령줄 문자열을 구문 분석하는 특수 라이브러리 함수를 호출해야 합니다. (C 프로그램에서는 이 작업이 배후에서 발생하지만 여전히 Windows API를 사용합니다.)

관련 정보