다른 Bash 스크립트에서 생성된 인용문은 원본 스크립트에서 인용문으로 처리되지 않습니다.

다른 Bash 스크립트에서 생성된 인용문은 원본 스크립트에서 인용문으로 처리되지 않습니다.

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너무 많은 따옴표 없이 올바르게 수신되고 작동할 것입니다.

관련 정보