2017-01-31 4 views
1

MacOSX에서는 이름에 슬래시 "/"가 포함 된 폴더를 만들 수 있습니다.

나는

거리 코너 형식으로 "거리 1/거리 2"교차입니다
args=("[email protected]") 
name=${args[0]} 
street_corner=${args[1]} 
my_folder="Hello ${name} - ${streetcorner}" 
mk() { 
    case "$1" in /*) :;; *) set -- "./$1";; esac 
    mkdir -p "$1" 
} 
mk $my_folder 

에 비슷한 일을 수행하여 동일한 스크립트를 비난하려고 따라서 유지 될 슬래시를 필요로하고 디렉토리 이름.

나는 several articles like this one을 읽습니다. 여기에서 이스케이프 할 문자열을 조작하는 방법이나 직접 문자열을 설정할 때 앞으로 유지하는 방법을 설명합니다. 내가 가진 문제는 사용자가 스크립트에서 사용되는 인수를 전달하므로 문자열을 $ my_folder 인수로 명령을 실행할 때 이미 캡슐화 된 것입니다.

슬래시가 "street 1"디렉토리 내에있는 "street 2"라는 하위 디렉토리를 만들지 않고 "street 1/street 2"라는 단일 디렉토리를 만드는 대신 street_corner 값을 어떻게 확장합니까?

내가 이러한 수정을 시도하고

street_corner="${args[0]}" 
my_folder='"Hello ${name} - ${streetcorner}"' 
my_folder="'Hello ${name} - ${streetcorner}'" 
my_folder="Hello ${name} - ${'streetcorner'}" 
my_folder="Hello ${name} - ${$"streetcorner"}" 
my_folder="Hello "${name}" - "${streetcorner} 

실패 또한 스크립트 내부

./my_script.sh "name" "street 1\/street 2" 
./my_script.sh "name" 'street 1/street 2' 
./my_script.sh "name" "'street 1/street 2'" 

답변

0

처럼 street_corner에 대한 입력을 제공하기 위해 노력했다, 당신은 인용의 오른쪽을 두 배로 필요 라인 :

name="${args[0]}" 
street_corner="${args[1]}" 

하고 명령 :

mk "$my_folder" 

또한 오타가 있습니다. street_corner에서 밑줄을 제거하십시오.

는 다음과 같이 스크립트를 호출

./my_script.sh "name" "street 1\/street 2" 

또는

./my_script.sh "name" 'street 1/street 2' 
1

문제가 인용 중 하나가 아닙니다.

슬래시는 UNIX 유형 운영 체제의 경로 구분 기호입니다. 그것은 파일 이름에 가질 수없는 유일한 문자입니다 (디렉토리 계층 구조를 표현할 수있는 경로의 일부가 될 수는 있지만). 공백, 탭, 심지어 줄 바꿈을 포함 할 수 있습니다. 그러나 슬래시가 없습니다.

따라서 답변은 street1이 디렉토리가 아닌 것으로 해석되지 않고 street1/street2을 파일 이름으로 사용할 수 없습니다.

4

/:과 관련된 경로 이름 (아래에서 설명 할 이유로)은 macOS에서 다소 혼란 스럽습니다. 짧은 대답은

  • 파일 이름에 /을 사용할 수 없습니다.
  • 역사적인 이유로 파인더는 할 수있는 것처럼 가장합니다.
  • 또한 역사적인 이유로 파인더는 :을 사용할 수 없다고 가장합니다.

첫째, /는 POSIX 경로 이름에 유효한 문자가 아닙니다; 경로 구성 요소 분리 기호로 예약되어 있습니다. 유효한 파일 이름을 인수로 요구하는 명령 행 도구는 /을 포함하는 명령을 거부합니다.

파인더 는 이름이 /를 포함하는 파일이나 폴더를 만들 수 있도록 나타납니다,하지만 묵묵히 :/ 변환합니다. 터미널에서이를 확인할 수 있습니다. 홈 디렉토리에 foo/bar이라는 폴더를 만듭니다. 터미널에서 ls을 실행하면 foo:bar으로 표시됩니다.


두 번째로, :은 기존의 Mac OS에서 경로 구분 기호로 사용되었습니다. Finder는 여전히 이름에 :을 포함하지만 명령 줄 도구 (예 : mkdir)를 포함하는 폴더를 만들 수 없습니다. mkdir foo:bar이 작동하고 더 나아가 이름이 foo/bar으로 Finder에 나타납니다.

+0

따라서 streetcorner의 슬래시를 파일 이름의 콜론으로 변환해야합니다. 이것은 작동합니다 :'my_folder = "Hello $ {name} - $ {streetcorner // \/:}". 그 중괄호 안에 다음과 같이 읽을 수 있습니다 : streetcorner 변수 ('streetcorner')와 슬래시 문자 ('/')가 모두 나오는 값 ('\ /'- 이스케이프 처리되어 있지 않으므로주의하십시오. ('/') 콜론 (':')으로 대체되었습니다. –

+0

@chepner와 @ gordon-davisson에 감사드립니다! =) – Discofan