
Bash를 사용하면 내 pwd
디렉터리에 공백이 있는 디렉터리가 포함됩니다.
$ pwd
/a/b c/d
이것은 작동합니다:
$ ls "$PWD"
bar foo
# yay!
해당 코드를 스크립트에 넣으면 작동합니다. 이제 이 명령을 두 부분으로 나누면 다음과 같습니다.
$ cat foo
echo \"$PWD\"
$ cat bar
ls $(./foo)
foo
참조에 대한 경로를 생성합니다.
$ ./foo
"a/b c/d"
# ok
그러나 bar
따옴표는 내가 예상한 대로 처리되지 않습니다.
$ ./bar
ls: "/a/b: No such file or directory
ls: c/d": No such file or directory
# boo!
이것은 학문적이지 않습니다. 실제로 분할하고 싶은 명령은 끔찍합니다. 단일 스크립트에 넣는 대신 두 개의 스크립트로 나누고 싶습니다. 하나는 올바르게 인용된 인수를 생성하고 다른 하나는 이를 크게 단순화합니다(그리고 첫 번째 스크립트를 호출합니다). 이 끔찍한 매개변수 목록은 여러 명령에 유용하므로 이를 별도의 스크립트에 넣는 또 다른 이유입니다.
업데이트 1:btw, 이것은 작동합니다:
$ cat foo
ARGS="$PWD"
$ cat bar
source ./foo
ls "$ARGS"
$ ./bar
bar foo
그러나 매개변수를 변수에 넣는 것은 인위적인 것 같습니다.
업데이트 2: @ user454038의 솔루션은 디렉토리 이름의 단일 공백에 대해 작동하지만 두 개의 공백에서 중단됩니다.
업데이트 3:@mikeserv 및 @user454038은 이 작업을 수행할 수 있을 만큼 충분히 교육했습니다(디렉토리 이름에 1개와 2개, 그리고 아마도 몇 개의 공백이 더 있을 수 있음).
$ cat foo
echo "$PWD"
$ cat bar
ls "$(./foo)"
시작하자! 다들 감사 해요!
답변1
@mikeserv가 지적했듯이 문제는 따옴표입니다. 중복된 인용문. 해결책은 foo
애초에 인용문에 인용문을 포함하지 않는 것입니다.
dir 구조(이 디렉토리로 cd해야 함 d
):
~
└── a
└── b c
└── d
dir 에 d
우리는 그것을 당신 foo
과 함께 게시했습니다. bar
하지만 이제 다음을 생성하세요.
foo2
:
echo $PWD
bar2
:
set -x
ls "$(./foo2)"
- 우리는
set -x
무슨 일이 일어나고 있는지 명확하게 볼 수 있도록 그것을 가지고 있습니다
명령 프롬프트에서 실행 하면 /bar
다음과 같이 표시됩니다.
$ ./bar2
+++ ./foo2
++ ls '/home/youruser/a/b c/d'
bar bar2 foo foo2
set -x
코드에서 이것을 제거하면 원하는 출력을 성공적으로 얻을 수 있습니다.
bar bar2 foo foo2
설명하다
set -x
원본에 추가한 bar
후 실행하면 다음과 같이 표시됩니다.
$ ./bar
+++ ./foo
++ ls '"/home/youruser/a/b c/d"'
ls: cannot access "/home/youruser/a/b c/d": No such file or directory
이는 명령 프롬프트에서 실행하는 것과 동일한 효과를 갖습니다.
$ ls '"/home/youruser/a/b c/d"'
ls: cannot access "/home/youruser/a/b c/d": No such file or directory
- 범인은 여분의
"
인용문 이다 - 이것은 원본 기사에 소개되었습니다.
foo
- 일단
"
제거하면ls
작동합니다
따라서 원본에서 따옴표를 제거하면 foo
(우리가 했던 것처럼 foo2
) ls
너무 많은 따옴표 없이 올바르게 수신되고 작동할 것입니다.