간단한 명령의 정의를 이해하는 방법은 무엇입니까?

간단한 명령의 정의를 이해하는 방법은 무엇입니까?

POSIX 2013에서:

"간단한 명령"은 일련의 선택적 변수 할당과리디렉션, 순서에 관계없이 선택적으로 다음 단어와리디렉션, 제어 연산자에 의해 종료됩니다.

Bash 매뉴얼에서:

간단한 명령은 가장 일반적으로 사용되는 명령입니다. 이는 단순히 공백으로 구분된 단어이며 쉘의 제어 연산자 중 하나로 종료됩니다.

나는 POSIX 정의가 Bash 수동 정의보다 낫다고 생각합니다. 하지만 POSIX 정의에 대해서는 아직 잘 모르겠습니다.

  • 내가 맞다면 간단한 명령에 대한 종료 제어 연산자는 해당 명령에 속하지 않는 것입니까, 아니면 속합니까?

  • 정의에 있는 두 개의 "리디렉션"은 간단한 명령입니까?

  • "일련의 선택적 변수 할당 및 리디렉션"에서 변수 할당 후 "리디렉션"은 무엇을 합니까? 변수 할당은 stdout이나 stderr에 쓰지 않습니다. 그렇죠?

  • "어떤 순서로든 선택적 변수 할당 및 리디렉션 시퀀스"에서 "어떤 순서로든"은 무엇을 의미합니까?

  • 이 정의는 간단한 명령에 대해 얼마나 많은 가능성을 제안하며, 그 가능성은 무엇입니까?

  • POSIX와 Bash에서 간단한 명령의 개념이 동일합니까?

답변1

Greg의 답변에 추가 :

  1. 응, 둘그룹 리디렉션 동일한 간단한 명령에 속합니다.

    입력(stdin)과 출력(stdout)이 리디렉션되어 명령을 실행할 때 다음을 수행합니다.

    cmd 매개변수 1   매개변수 2  <파일 1  >파일 2

    어떤 사람들(소수)은 다음과 같이 주장합니다.

    <파일 1 cmd 매개변수 1   매개변수 2  >파일 2

    입력을 지정하는 것이 더 직관적이라고 믿기 때문에 변경됩니다.그 다음에행동, 그리고그 다음에산출. 그러나 다음은 모두 동일합니다.

    <파일 1  >file2 cmd 매개변수 1   매개변수 2
    >file2 cmd 매개변수 1   매개변수 2  <파일 1
    지침  >파일 2 매개변수 1  <파일 1 매개변수 2

    아니요위의 방법 중 하나를 사용하면 나쁜 예가 됩니다.

    중요한 점은 리디렉션이 명령의 첫 번째 단어(또는 명령의 모든 단어) 앞이나 뒤에 나타날 수 있지만 동일한 방식으로 처리된다는 것입니다.

  2. 환경 변수가 해당 명령의 기간(범위) 동안에만 설정되도록 명령 앞에 변수 할당이 나타날 수 있습니다. 예를 들어,

    TZ=GMT0 ls -l

    수정 시간(GMT)을 표시하여 파일을 나열합니다. "순서에 관계없이 선택적 변수 할당 및 리디렉션"은

    TZ=GMT0 ls -l > ls_output_file
    TZ=GMT0 > ls_output_file ls -l
    > ls_output_file TZ=GMT0 ls -l

    모두 동일합니다. 다시,아니요첫 번째 것을 제외하고 아무거나 사용하세요.

    변수 할당에 중점을 둡니다.할 수 없다명령의 첫 번째 단어 뒤에 표시됩니다. 만약 그렇다면 명령에 대한 인수로 처리됩니다. 예를 들어 구문을 살펴보세요 dd.

    변수 할당은 stdout이나 stderr에 쓰지 않습니다. 그렇죠?

    단순하고 지속적인 데이터 할당은 어떠한 처리도 수행하지 않습니다(셸 내 기록은 포함되지 않음). 그러나 명령 대체는 명령을 실행합니다. CURRENT_DATE=$(date +%Y%m%d) 명령을 실행하면 date +%Y%m%d 표준 출력이 셸의 파이프로 리디렉션되고 셸은 출력을 캡처하여 명령줄에 포함합니다. 그러나 명령의 표준 오류는 date여전히 셸의 표준 오류입니다. 라고 말하면 날짜 지정 구문이 지원되지 않기 OLD_DATE=$(date --date"three days ago")때문에 화면에 오류 메시지가 표시됩니다 . date물론 말하면 억제할 수 있지만

    OLD_DATE=$(date --date "3일 전" 2> /dev/null)

    하지만 그렇게 말하면 그렇지 않아

    OLD_DATE=$(date --date "3일 전") 2> /dev/null

    또는

    2> /dev/null OLD_DATE=$(date --date "3일 전")
  3. "어떤 순서로든"은 제가 마지막으로 말한 내용과 함께 다음과 같은 사실을 의미합니다.

    TZ=GMT0 열=132 ls -l

    동등하다

    열=132 TZ=GMT0 ls -l

    (이상한 경우가 있을 수 있습니다. 거기까지 갈 위험은 없습니다.)

답변2

bash 수동 정의는 최소한 더 간단합니다. 리디렉션은 명령 유형과 독립적이지만 관련이 있는 기능입니다. 리디렉션은 연결된 특정 명령에 영향을 준다는 점에서 명령이지만 복잡한 명령(서브셸, 그룹 또는 파이프)에서도 발생할 수 있습니다. POSIX 정의는 작은 공간에 많은 개념을 담고 있으며, bash맨 페이지처럼 분리하면 이해하기가 더 쉬울 수 있습니다. 그래도...

  • 종료 제어 연산자는 명령의 일부가 아니며 단순 명령을 다른 단순 명령과 구분합니다.

  • 리디렉션은 간단한 명령이며 두 개 이상 있을 수 있습니다.

  • 설명자 복사를 시작할 때 순서가 중요하기는 하지만 리디렉션은 명령 텍스트와 다소 독립적입니다. 귀하의 예에서는 이 개념을 건너뛰겠습니다.

    a=5 5> out5.file some-command > out.file arg1 2> out2.file arg 3> out3.file

    작동하는 간단한 명령이 될 것입니다. 리디렉션은 매개변수 사이에 배치될 수 있으며 순서에 관계없이 나타날 수 있습니다.

  • 얼마나 많은 가능성이 있습니까? 여기서 무엇을 묻고 있는지 잘 모르겠습니다. 많은 명령과 무제한 매개변수 조합, 다양한 리디렉션이 있으므로 가능성이 많습니다.

  • 예, 동일합니다. 하지만 POSIX는 리디렉션 개념을 정의에 혼합했습니다.

매뉴얼 bash페이지는 훌륭한 리소스입니다. 하지만 제가 가장 좋아하는 리소스는 GNU입니다.배쉬 참조 매뉴얼GNU.org 웹사이트에서. 그것은 좋은 진행이고 잘 작성되었으며 거의 ​​반복되지 않습니다. 이에 대한 자세한 내용은 간단한 명령 정의 및 리디렉션 섹션을 확인하세요.

답변3

발생하는 문제를 해결하려면 다음을 수행하십시오.

간단한 명령에 대한 종료 제어 연산자는 해당 명령에 속하지 않습니다. 그렇죠?

음 ... 아니. 그러나 이는 "간단한 명령"을 정의하는 구문의 일부입니다. 적절한 제어 구분 기호가 없는 "간단한 명령"은 쉘에서 올바르게 인식되지 않습니다.
명령을 실행할 때 구분 기호 제어 문자를 실행할지 여부를 묻는 경우 다음을 수행하세요.아니요. 구분 기호는 실행된 명령의 일부가 아닙니다.

정의에 있는 두 개의 "리디렉션"은 간단한 명령입니까?

기술적으로는 그렇지 않습니다. 리디렉션은 명령이 실행되는 환경에 영향을 미치므로 명령의 "정확한" 부분이 아닙니다. 그러나 기술적으로는 환경을 변경하여 실행되는 명령에 영향을 미칩니다.

따라서 누군가는 "일종의"라고 말할 수 있습니다.

"일련의 선택적 변수 할당 및 리디렉션"에서 변수 할당 후 "리디렉션"은 무엇을 합니까? 변수 할당은 stdout이나 stderr에 쓰지 않습니다. 그렇죠?

이런, 한 입이군요. 이를 여러 부분으로 나누어 보겠습니다.

변수 할당 후 "리디렉션"은 무엇을 합니까?

이전과 동일하며, 중간, 끝 또는 전체 명령줄의 일부에 있을 수 있습니다. 즉, 위치는 리디렉션 작동 방식에 영향을 미치지 않습니다.

참고할 사항: 리디렉션 순서 자체가 명령에 미치는 영향을 변경합니다. 간단히 말해서, 그것은 >file 2>&1동일 하지 않습니다 2>&1 >file. 그러니 조심해! .

당신은 읽을 수 있습니다:

  1. 쉘에서 "2>&1"은 무엇을 의미합니까?
  2. 8.13 "2>&1 file"인가요, 아니면 ">File 2>&1"인가요? 왜?

"선택적 변수 할당 및 리디렉션의 순서"에서?

여기서 선택 사항은 1개, 2개,...5개 등이 있을 수 있음을 의미합니다.아니면.
명령줄에는 리디렉션이나 변수 할당이 없을 수 있습니다.
"선택 사항"입니다.

변수 할당은 stdout이나 stderr에 쓰지 않습니다. 그렇죠?

아니요, 물론 그렇지 않습니다. 단지 쉘 변수의 값만 변경됩니다.
그리고 명령 앞에 오는 경우 일반적으로 명령 환경에 영향을 미치고 명령이 끝나면 변경 사항이 접혀집니다(보통).

"어떤 순서로든 선택적 변수 할당 및 리디렉션 시퀀스"에서 "어떤 순서로든"은 무엇을 의미합니까?

왼쪽에서 오른쪽 순서가 순서입니다. 아니요. 할당 및/또는 리디렉션을 어떤 순서로든 배치하는 것은 정확히 동일하지 않습니다.
간단히 말해서: 99.99%의 시간에 변수 할당이 필요합니다.앞으로주문하다. 위에서 언급했듯이 리디렉션의 내부 순서는 중요합니다. 리디렉션은 어디에나(사용된 제어 문자의 한계 내에서) 배치될 수 있습니다(하지만 사용을 권장하지 않습니다. 명령줄을 읽는 것이 혼란스럽기 때문입니다).

간단한 명령의 경우 정의가 얼마나 많은 가능성을 제기하는지,

가능성? 끝없는. 예를 들어 다음과 같이 가정해 보겠습니다.

  1. 모든 옵션에 대한 중복이 없습니다(더 적은 수).
  2. 가능한 명령 이름: 10(한 번에 하나만 선택).
  3. 가능한 리디렉션: 5개(예, 기본 리디렉션은 10개이며 가능한 파일 설명자는 최대 99개까지 가능한 경우가 많습니다.) 10개 중 5개를 선택하겠습니다(순서가 중요함).
  4. 가능한 인수: 가능한 옵션 20개 중 3개를 선택하겠습니다(명령에 순서가 중요할 수 있지만 항상 그런 것은 아닙니다. 옵션의 최소 개수를 선택하고 순서는 중요하지 않다고 가정하겠습니다).
  5. 변수 할당? 가능한 변수 10개 중 3개를 선택해 보겠습니다. (예, 매우 낮은 숫자입니다).

    1C10 * 5P10 * 3C20 * 3C10 = 10 * 10!/(10-5)! * 20!/((20-3)!*3!) * 10!/((10-3)!3!) = 41,368,320,000

내 계산이 맞다면. 그건아니요섞일 수 있는 단어를 세어보세요. 그냥 KISS 계산이에요.

어쨌든, 그것은 엄청난 선택입니다.

그들은 무엇인가?

짧은 대답으로 나열할 수는 없습니다. 하지만 가능하더라도 그만한 가치가 있습니까?

솔직히 말해서, Tim, 레몬의 마지막 한 방울까지 짜내려고 하지 마세요. 확실히 건강에 좋지 않을 것 같아요 :-). 그냥 말하는거야!

POSIX와 Bash에서 간단한 명령의 개념이 동일합니까?

아마도 그렇습니다(통역사가 사용하는 언어로 인한 차이). 다시 말하지만, 마지막 한 방울까지 짜내려고 노력할 가치가 없습니다.

관련 정보