명령 대체 - 작은따옴표 및 공백

명령 대체 - 작은따옴표 및 공백

명령 대체가 공백으로 구분된 작은따옴표 POSIX 경로 목록을 전달하도록 하려면 어떻게 해야 합니까?

command1 $(command2)
command1 '/path/to/file 1' '/path/to/file 2' '/path/to/file 3'

확장 프로그램을 어떻게 추적하나요?

답변1

를 사용하여 어떤 명령이 실행되고 있는지 정확하게 확인할 수 있습니다 set -x. 다소 어리석은 예:

$ echo $(echo "foo 'bar baz' taz\\ jaz")
foo 'bar baz' taz\ jaz

줄게:

++ echo 'foo '\''bar baz'\'' taz\ jaz'
+ echo foo ''\''bar' 'baz'\''' 'taz\' jaz
foo 'bar baz' taz\ jaz

모든 탈출로 인해 읽기가 약간 어렵습니다. 예를 들어 두 번째 단어는 다음과 같습니다.

  1. ''아무것도 아닌 것이 되어라.
  2. \'작은따옴표( ') 로
  3. 'bar'~이 되다bar

따라서 매개변수는 으로 전달됩니다 'bar. 다음과 같이 이를 확인할 수 있습니다(Data::Dump가 설치되어 있다고 가정하지만 불행하게도 기본값은 아닙니다). $(echo…이는 Perl 줄에 그대로 복사되었습니다.

$ perl -MData::Dump=pp -E 'pp @ARGV' $(echo "foo 'bar baz' taz\\ jaz")
("foo", "'bar", "baz'", "taz\\", "jaz")

여기서 일어나는 일은 bash가 $IFS인수 구문 분석이 아닌 단어 분할( off 기반)을 수행한다는 것입니다. 따라서 불행하게도 이를 사용 eval하고 그에 따른 모든 위험을 처리 해야 할 수도 있습니다 .

$ eval "echo $(echo "foo 'bar baz' taz\\ jaz")"
foo bar baz taz jaz

(또한 명령이 NUL로 구분된 이름 목록으로 출력을 생성하도록 할 수 있다면 다음과 같습니다.단순한취급 사용 xargs -0및 더욱이 완전히 안전합니다).

답변2

이해하기 쉬운 형식의 파일 목록이 있는 경우는 거의 없습니다 xargs. 그러니 달려라

command1 | xargs command2

일부 UNIX 변형에서는 출력이 매우 크면 command1명령줄 길이 제한으로 인해 모든 파일 이름으로 실행되지 않습니다. command2사용의 단점은 xargs오류를 올바르게 보고하는 대신 명령을 여러 번 실행한다는 것입니다. getconf ARG_MAX다음을 사용하여 명령줄 길이 제한을 확인할 수 있습니다.

답변3

다음과 같이 시도해 보십시오:-

path1="/etc/passwd"
path2="/var/log/secure"

[root@localhost base_filters]# ls -l "$path1" "$path2"
-rw-r--r--. 1 root root 1876 Mar 10 22:15 /etc/passwd
-rw-------. 1 root root 2408 Apr  5 23:09 /var/log/secure

답변4

공백이 스크립트에 영향을 주지 않도록 IFS 변수를 사용해 보십시오. IFS를 변수에 저장하고 스크립트가 완료된 후 IFS를 복원합니다.

관련 정보