선택은 당신입니다. 인용하지 않으면 $@
그 값 중 하나가 추가 확장 및 해석됩니다. 인용하면 전달 된 모든 인수는 확장 그대로 그대로 재현됩니다. &>|
어쨌든 인수를 직접 파싱하지 않고도 쉘 구문 토큰 등 을 안정적으로 처리 할 수 없습니다. 따라서 함수 중 하나를 전달하는보다 합리적인 선택이 남아 있습니다.
- 와 함께 단일 간단한 명령을 실행하는 데 사용 된 단어입니다
"$@"
.
...또는...
- 추가 확장되고 해석 된 인수 버전은와 함께 간단한 명령으로 만 적용됩니다
$@
.
의도적이고 의도 한 결과의 영향을 잘 이해한다면 어느 쪽의 방법도 잘못되지 않습니다. 두 가지 방법 모두 장점이 있지만 두 번째 방법의 장점은 특히 유용하지는 않습니다. 아직도...
(run_this(){ $@; }; IFS=@ run_this 'ls@-dl@/tmp')
drwxrwxrwt 22 root root 660 Dec 28 19:58 /tmp
... 쓸모 없고 별로 많이 사용 되지 않을 것입니다 . 그리고 bash
쉘에서, bash
기본적 으로 변수 정의를 환경에 고정 하지 않기 때문에, 그 정의가 특수 내장 명령 행 또는 함수,$IFS
은 영향을받지 않으며 선언은 로컬입니다 run_this()
통화 에만 .
비슷하게:
(run_this(){ $@; }; set -f; run_this ls -l \*)
ls: cannot access *: No such file or directory
글 로빙도 구성 할 수 있습니다. 따옴표는 목적을 제공합니다-그들은 아무것도 아닙니다. 그것들이 없으면 쉘 확장은 추가 해석- 구성 가능한 해석을 겪습니다 . 예전 에는 아주 오래된 쉘이 $IFS
있었지만 확장뿐만 아니라 모든 입력 에 전체적으로 적용되었습니다 . 실제로, 쉘 은의 가치에 대한 모든 입력 단어를 깨뜨렸다는 점에서 매우 똑같이 행동했습니다 . 그리고 만약 당신이 찾고있는 것이 아주 오래된 쉘 동작이라면,을 사용해야 합니다 .run_this()
$IFS
run_this()
나는 그것을 찾고 있지 않으며, 현재 유용한 예를 제시하기 위해 상당히 압박을 받고 있습니다. 나는 일반적으로 쉘이 실행하는 명령이 내가 입력하는 명령을 선호합니다. 따라서 선택의 여지가 있다면 나는 거의 항상 그렇습니다 run_that()
. 그거 빼고 ...
(run_that(){ "$@"; }; IFS=l run_that 'ls' '-ld' '/tmp')
drwxrwxrwt 22 root root 660 Dec 28 19:58 /tmp
무엇이든 인용 할 수 있습니다. 명령이 따옴표로 실행됩니다. 명령이 실제로 실행될 때 모든 입력 단어가 이미 따옴표 제거를 겪었 기 때문에 작동합니다. 이는 셸의 입력 해석 프로세스의 마지막 단계입니다. 따라서 쉘이 해석하는 동안 'ls'
과 의 차이점은 ls
중요합니다. 따라서 인용 ls
하면 이름 이 지정된 별칭ls
이 인용 된 ls
명령 단어로 대체되지 않습니다 . 그 외에는 따옴표가 영향을 미치는 유일한 것은 단어의 구분입니다. (변수 / 입력-공백 인용이 작동하는 방법과 이유) 과 메타 문자와 예약어의 해석입니다.
그래서:
'for' f in ...
do :
done
bash: for: command not found
bash: do: unexpected token 'do'
bash: do: unexpected token 'done'
당신은 절대로 run_this()
또는run_that()
.
함수 이름, 또는 그러나 $PATH
'D 명령, 또는 내장 매크로는 잘 인용 또는 인용 부호가 실행됩니다, 그리고 정확하게 방법 run_this()
과 run_that()
처음부터 일을. 당신은 $<>|&(){}
그들 중 어떤 것도 유용한 것을 할 수 없을 것 입니다. 의 부족입니다 eval
.
(run_that(){ "$@"; }; run_that eval printf '"%s\n"' '"$@"')
eval
printf
"%s\n"
"$@"
그러나 그것 없이는 사용하는 따옴표 때문에 간단한 명령의 한계로 제한됩니다 ( $@
명령이 메타 문자로 구문 분석 될 때 프로세스의 시작 부분에서 따옴표처럼 행동 하기 때문에 그렇지 않은 경우에도 ) . 명령 줄 할당 및 리디렉션의 경우에도 동일한 제약 조건이 적용되며 이는 함수의 명령 줄로 제한됩니다. 그러나 그것은 큰 문제가 아닙니다.
(run_that(){ "$@";}; echo hey | run_that cat)
hey
나는 쉽게 가질 수 있었다 <
>
파이프를 열 때처럼 입력 또는 출력 리디렉션 .
어쨌든, 원형으로, 여기에는 옳고 그른 방법이 없습니다-각 방법마다 그 용도가 있습니다. 사용하려는 의도대로 작성해야하며, 무슨 뜻인지 알아야합니다. 따옴표를 생략하면 목적이있을 수 있습니다. 그렇지 않으면 따옴표 가 전혀 없습니다 . 하지만 목적과 관련이없는 이유로 따옴표를 생략하면 잘못된 코드를 작성하는 것입니다. 당신이 의미하는 것을하십시오; 어쨌든 노력합니다.
run_that
의 행동은 내가 기대하는 것입니다 (명령 경로에 공백이 있으면 어떻게됩니까?). 다른 행동을 원한다면 데이터가 무엇인지 아는 전화 사이트 에서 인용을 취소 해야합니다. 이 함수를로 호출하면run_that ls -l
어느 버전에서나 동일하게 작동합니다. 다르게 기대했던 사건이 있습니까?