다음 명령이 수행하는 작업에 대한 자세한 내용을 알고 싶습니다.
PASSING=0 FAILED=0 > log_${ENV} print "Test Started at `date`\n"
답변1
이 명령은 다음과 같이 다시 작성할 수 있습니다.
PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}
리디렉션은 명령줄의 어느 지점에서나 발생할 수 있기 때문입니다.
리디렉션은 명령의 출력을 print
이름이 지정된 파일로 보냅니다 log_${ENV}
(또는 log_$ENV
중괄호는 여기서 아무 작업도 수행하지 않음). 여기서는 ENV
현재 환경에 존재하는 일부 값을 포함하는 쉘 변수여야 합니다.
PASSING
및 에 두 번 할당하면 FAILED
명령 환경에서 두 변수가 모두 설정됩니다 print
. 이 줄을 실행한 후에는 존재하지 않습니다(이전에 스크립트에 존재하지 않는 한, 이 경우 이 명령줄을 실행한 후에도 원래 값은 변경되지 않습니다).
이 두 변수를 사용하지 않는 것 같기 때문에 print
(스크립트나 함수 또는 우리가 모르는 다른 것이 아닌 한) 이 변수의 의도가 무엇인지 말하기가 어렵습니다.
이 print
기능은 텍스트 문자열을 유일한 인수로 사용합니다. 여기서 문자열의 일부는 이전 스타일의 명령 대체이며, 이는 호출되기 date
전에 명령의 출력으로 확장됩니다 print
. 보다 현대적인 명령 대체 구문을 사용하면 매개변수를 "Test Started at $(date)\n"
.
전반적인 효과는아마도(무엇에 따라 다름 print
) 이름이 value 에 따라 달라지는 특정 파일에 지정된 텍스트 문자열을 씁니다 $ENV
.
관련된:
- Bash에서 명령 앞에 변수를 설정하는 것이 합법적인 이유는 무엇입니까?
- 이 명령은 어떻게 적법합니까? "> 파일 1 < 파일 2 고양이"
- *sh 쉘에서는 백틱(예: "cmd")이 더 이상 사용되지 않습니까?
ksh93
(및 zsh
) 에는 print
와 같은 작업을 수행하는 쉘 내장 유틸리티가 있습니다 echo
. 쉘은 또한 대화형 쉘을 시작할 때 $ENV
파일을 가리키는 특별한 방법으로 처리됩니다. $ENV
쉘 스크립트에서 범용 변수로 이 변수(또는 일반적으로 대문자 변수)를 사용하는 것은 권장되지 않습니다.
이와 관련된:
답변2
명령줄을 단어로 "분석"(해석)해야 합니다.
PASSING=0 FAILED=0 >log_${ENV} print "Test Started at `date`\n"
\___ __/ \__ __/ \___ ____/ \_ _/ \_________ ____________/
\/ \/ \/ \/ \/
var1 var2 redirect cmd "Argument to command".
명령줄을 구성하는 5개의 단어(공백으로 구분)입니다.
명령 앞의 var(예: in)는
var=123 cmd
명령 실행 중에 환경에서만 정의됩니다. 그러면 폐기됩니다.여러 변수를 정의할 수 있습니다.앞으로명령 이름.
리디렉션은 출력을 파일로 보내거나 파일에서 입력을 읽는 데 사용됩니다. 리디렉션은 명령줄 어디에나 나타날 수 있으며 전체 명령줄(명령 실행)에 적용됩니다.
이 경우 리디렉션은
log_
변수(부분) 내에서 단어와 값을 연결한 것을 파일로 출력하는 것입니다.ENV
$(ENV)
print
분명히 이 경우 명령 이름입니다.이 명령 이름은 ksh, mksh, lksh 및 zsh에 내장 명령으로 존재하지만 ash, dash, csh, yash, bash(및 기타)에는 존재하지 않습니다. 이러한 셸에서 명령은 PATH에 있는 외부 프로그램으로 존재할 수 있습니다.
argv[]
인수는 명령에 제공되는 인수, 텍스트 또는 기타 정보의 목록 으로 , c 프로그램 이나int argc
셸에서$@
사용할 수 있습니다$#
.이 경우 인수에는
`date`
(최신 구문에서는 적극 권장됨)과 동일한 명령 확장이 포함됩니다$(date)
. 이 섹션에서는 명령(이 경우)을 실행date
하고 전체 섹션을 명령 출력으로 바꿉니다. 즉, 해당 위치에 실제 날짜를 입력하십시오.
전체 명령을 작성할 수도 있습니다(정확히 동일한 효과를 얻기 위해).
PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}
정보가 부족하여 로그 파일에 문자열이 출력되는 것 같습니다. 실제로 위에서 언급한 내장 인쇄인 경우 이 두 변수는 아무런 효과가 없으며 제거하여 다음과 같이 명령을 작성할 수 있습니다.
print "Test Started at `date`\n" >log_${ENV}
그러나 이는 단지 추측일 뿐이므로 인쇄 명령이 수행하는 작업을 실제로 이해하려면 더 깊이 파고들어볼 필요가 있습니다. 어떤 쉘이 명령을 실행하고 있는지, 그리고 그것이 당신의 쉘에서 작동하는지 표시해야 합니다 type print
.