이 명령의 기능은 무엇입니까(이상한 할당 및 리디렉션)

이 명령의 기능은 무엇입니까(이상한 할당 및 리디렉션)

다음 명령이 수행하는 작업에 대한 자세한 내용을 알고 싶습니다.

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.

관련된:


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.

관련 정보