& 및 ;는 단항 연산자인가요, 아니면 이항 연산자인가요?

& 및 ;는 단항 연산자인가요, 아니면 이항 연산자인가요?

&POSIX 2013 및 다음 의 제어 연산자 관련 ;:

비동기 목록의 경우

백그라운드에서 명령을 실행하는 형식은 다음과 같습니다.

command1 & [command2 & ... ]

순차 목록의 경우,

순차적 실행 명령의 형식은 다음과 같아야 합니다.

command1 [; command2] ...
  1. &1위안인가요, 2위안 인가요 ? ;1위안인가요, 2위안 인가요 ?

    &;이는 바이너리처럼 보이고 앞과 뒤의 명령에 대해 작동하며 두 명령 간의 실행 순서가 동시인지 순차적인지를 나타냅니다.

    &비동기 목록의 각 명령 뒤에는 &.

    ;순차 목록의 마지막 명령에는 다음이 필요하지 않기 때문에 단항처럼 보이지 않습니다 ;.

    참고: 연산자는 피연산자에 대해 작동합니다. 피연산자의 수에 따라 연산자는 단항, 이진…이라고 말할 수 있습니다. 내가 올바르게 이해했다면 제어 연산자는 명령에 대한 연산자입니다.

  2. &및 혼합 목록의 ;구성 요소 명령 간의 실행 순서는 무엇입니까 ? 구성요소 명령에서 각각 &및 의 의미는 무엇입니까?;

    예를 들어 배쉬에서는

    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5
    1
    [1] 11089
    3
    2
    [2] 11090
    5
    4
    [1]-  Done                    echo 2
    [2]+  Done                    echo 4
    
    $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &
    1
    [1] 11100
    3
    [2] 11101
    5
    [3] 11102
    6
    4
    2
    [1]   Done                    echo 2
    [2]-  Done                    echo 4
    [3]+  Done                    echo 6
    

답변1

  1. 나는 일반적으로 그들을 "운영자"로 생각하지 않습니다. 내 말은, 일반적으로 연산자는 값을 반환한다는 것입니다. &어느 것도 아니다 ;. 대신 그들은 성명을 종료합니다. 하지만 이들을 연산자로 생각하면 단일 명령문에 대해 작동하므로 후위 단항 연산자가 될 것 같습니다.

  2. 그들은 왼쪽에서 오른쪽으로 시작합니다. 의 경우 &백그라운드에서 비동기적으로 실행됩니다. echo 1 & echo 2 & echo 31, 2, 3은 순서에 관계없이 인쇄될 수 있습니다.여기 간다순차적으로, 커널은 순차적으로 인쇄하도록 예약하지 않을 수 있습니다. 그러나 echo 1; echo 2; echo 3항상 숫자순으로 인쇄됩니다. echo 1; echo 2 & echo 31은 항상 먼저 인쇄되지만 2와 3은 순서에 상관없이 인쇄될 수 있습니다.

답변2

derobert의 답변에 추가하고 질문에 포함된 명령을 분석하려면 다음을 수행하십시오.

echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &

이는 의사 코드에서 다음을 의미합니다.

print 1 (and complete this step before continuing)

start a process in the background that will eventually print 2,
  and keep going as soon as the process has been *started*

print 3 (and complete this before continuing)

start a background process that will eventually print 4,
  and keep going as soon as it has started

print 5 (complete this before continuing)

start a background process that will print 6.

또한 쉘에 대한 모든 명령은 종료되어야 합니다( &또는 ;또는 개행, 파일 끝 또는 지금 당장 생각하지 않는 다른 것). 그렇지 않으면 쉘은 언제 더 많은 문자 읽기를 중단해야 할지 알 수 없습니다. 명령은 실제로달리기주문하다.

답변3

Bash에는 명령줄의 일반적인 경우와 매우 유사해 보이는 내장 명령이 있습니다. 이 부분은 건너뛰겠습니다.

그러나 일반적으로 명령줄은 연산자가 아닌 특수 구두점 문자로 구분된 일련의 명령입니다.

명령은 실행 파일의 이름입니다(PATH 환경 변수를 통해 검색 가능). 명령을 실행하기 위해 실행될 프로그램입니다.

명령 다음에는 명령에 문자열로 전달되는 공백으로 구분된 문자열이 옵니다. 그러나 인수의 일부로 특수 구두점을 사용하려면 이를 이스케이프 처리해야 합니다( \' 또는 따옴표 사용).

구두점에는 영향이 있습니다.

"<", ">" 등과 같은 특수 구두점은 명령의 표준 입력, 출력 및 오류를 정의합니다.

'|' 명령을 종료하고 해당 표준 출력을 다음 명령의 표준 입력으로 연결합니다.

';'이전 명령을 실행하고 완료될 때까지 기다립니다. 즉, 전경에서 실행됩니다.

'&' 이전 명령을 실행하지만 완료될 때까지 기다리지 않고 명령줄 프로세스를 계속합니다. 즉, 백그라운드에서 실행됩니다.

따라서 이러한 구문 태그의 목적은 이러한 항목을 함께 사용하여 다음과 같은 작업을 수행할 수 있도록 하는 것입니다.

echo perl myperlprogram.pl \< mydata.txt | at 12:35

다른 쉘 명령 자체를 사용하여 echoPerl 프로그램을 실행하기 위한 문자열을 생성하고 at나중에 일괄 작업으로 실행하기 위해 문자열을 명령에 보냅니다. 그러나 이는 이스케이프되므로 표준 입력을 즉시 설정하는 대신 (입력으로 보낼 ) <인수로 전달됩니다 . 배치 시스템은 THEN 명령 문자열을 실행할 때 Perl 프로그램의 표준 입력을 설정합니다.echoat

기본 제공 명령 및 괄호와 같은 세부 지침이 있으며 기본 사항을 이해하면 배울 수 있습니다.

관련 정보