서로 다른 개념을 표현하기 위해 서로 다른 용어를 사용할 때 명확한 사고와 명확한 의사소통이 촉진됩니다.
이는 두 개념이 매우 유사하지만 다른 경우에 특히 유용합니다.
우리는 "명령"이라는 용어를 매우 유사하지만 다른 두 가지 개념을 의미하기 위해 사용하는 경향이 있습니다.
개념 1: 명령줄 인터페이스에 입력된 단일 프로그램.
옵션이 프로그램에 전달될 수 있지만 여전히 1개의 프로그램만 이를 사용하고 있습니다.
예):
$ ls
$ ls -alF
이 개념을 "명령"이라고 합니다.
개념 2: Enter 키를 누르기 전에 명령줄 인터페이스에 입력한 내용은 셸에서 이를 처리하도록 지시합니다.
예):
$ ls -alF | head > output.txt; cat output.txt
이 개념은 "명령"이라고도 합니다.
이는 이전 정의에 따라 3개의 서로 다른 "명령"을 포함하는 경우에도 마찬가지입니다.
아이디어를 보다 정확하게 생각하고 전달하기 위해 서로 다른 개념을 표현하기 위해 서로 다른 용어를 사용하려는 사람들은 이 두 가지 개념을 표현하는 데 어떤 용어를 사용하는 것이 가장 좋습니까?
답변1
글쎄요, 특히 쉘 명령 언어 사양을 읽어보실 수 있을 것 같습니다.2.9 쉘 명령.
이 섹션에서는 쉘 명령의 기본 구조를 소개합니다. 다음 명령 설명은 각각 명령의 형식을 설명하며 독자가 명령 유형을 식별하는 데 도움을 주기만 하며 구문을 공식적으로 나타내지는 않습니다. [...] 각 설명은 명령 언어의 형식적 정의에 대한 명령의 의미를 설명합니다.쉘 구문.
명령은 [단순 명령, 파이프, 목록, 복합 명령, 함수 정의] 중 하나입니다.
아래의 것은간단한 명령, ls
이는 "명령 이름"입니다.
ls -alF
아래의 것은관로두 가지 간단한 명령이 있습니다:
ls -alF | head > output.txt
ls -alF | head > output.txt; cat output.txt
(그러면 여기서 첫 번째 예를 (퇴화) 파이프라인으로 생각할 수도 있습니다.)
아래는 복합 명령과 간단한 명령의 파이프라인을 포함하는 AND 목록이 있는 목록입니다. 목록의 다음은 또 다른 간단한 명령입니다.
for x in a b c; do echo "$x"; done | cat -n && echo ok; echo end.
(목록의 일부를 올바르게 읽었다면 ;
명령을 줄 바꿈으로 구분하면 복합 목록이 될 것입니다. 그러나 이미 문제가 있습니다.)
나는 실제로 다른 문서(또는 이 사이트의 게시물)가 이러한 정확한 문구의 (올바른) 사용을 신중하게 준수할 것이라고 기대하지 않으므로 이를 정확하게 사용하여 의사소통을 시도하는 것이 어려울 수 있습니다. 혼돈을 받아들이세요.
답변2
나는 일반적으로 "명령"이라고 불리는 4가지 다른 개념이 있다고 생각합니다. 복잡성이 증가하는 순서대로:
명령 이름: 실행 가능한 프로그램이나 스크립트의 이름(또는 경로)입니다. 예를 들어, ,
ls
등 .cat
/usr/libexec/bootpd
명령 이름및 매개변수 목록. 예를 들어
ls
,-l
및/etc
. 이는 매개변수에 해당합니다.execl()
(명령 이름은 두 번 전달되는 것을 제외하고) 대부분의 다른 실행 명령과 함께find .. -exec
또는 컨텍스트에서sudo
실행할 수 있습니다.껍질을 통과하지 못하게 하세요.. 이 형식에서 매개변수에는 구문이 전혀 없고 단지 문자열일 뿐이며 실행 가능한 명령이 그 의미를 결정합니다.find ... -exec
( or 를 실행하면sudo
전체 명령이 셸에 의해 구문 분석되지만find
이는 또는 을 실행할 명령이 아니라 / 명령 입니다sudo
. 이것이 바로 what 또는 실행에 리디렉션과 같은 항목을 포함할 수 없는 이유입니다.)find
sudo
find
sudo
이것은 종종 인식되지 않지만 내 생각에는 명령이 쉘이 아닌 다른 것에 의해 실행될 때의 상황을 이해하려면 이를 이해하는 것이 중요합니다.
간단한 쉘 명령입니다. 이는 단일 문자열(개별 문자열 목록이었던 이전 문자열과 다름)이며 일반적으로 명령 이름과 인수(공백으로 구분), 그리고 리디렉션 및/또는 환경 변수 할당과 같은 기타 항목으로 구성됩니다. 따옴표, 변수 대체 등과 같은 다양한 쉘 구문을 포함할 수 있습니다. 예를 들어:
ls -l /etc >"$outdir/etcfiles.list"
.var=something
여기에는 변수 할당( ), 셸 내장 명령, 함수, 별칭 및 (셸에 따라)[[ ]]
조건식 및(( ))
산술식과 같이 처음 두 의미의 명령에 해당하지 않는 일부 콘텐츠도 포함됩니다 .셸에서 한 줄에 배치할 수 있는 모든 항목입니다. 기술적으로 이는 파이프, 목록, 복합 명령 등으로 나눌 수 있습니다. ilkkachu가 말했듯이 읽어주세요쉘 명령 언어 사양, 섹션 2.9 쉘 명령더 알아보기.
나 역시 완전히 일관된 용어를 개발하거나 사용하려는 노력은 의미가 없다는 일카츄의 의견에 동의합니다. 가능하다고 해도 이 용어를 사용하는 대부분의 사람들은 차이점을 완전히 이해하지 못할 것이며 결국에는 곧 혼동하게 될 것입니다(모든 쉘을 "bash"라고 부르는 사람들의 수를 고려하십시오). 문맥을 통해 파악하면 됩니다.
ls -l $(echo "$PATH" | tr : " ")
또한 파이프와 관련된 간단한 명령 과 같이 상황이 조금 이상해질 수 있습니다 .
답변3
이 질문은 '의견' 질문으로 끝나야 할 것 같지만 어쨌든 대답해 보도록 하겠습니다.
첫째, "명령"이라는 용어도 마찬가지로 쉽게 사용하지만, 나는 일반적으로 두 번째 개념에서 사물의 유형을 "라인"이라고 부릅니다. 이것은 첫 번째 요점을 제시합니다. "Enter"를 누르기 전에 여러 명령을 입력할 수 있기 때문에 두 번째 개념에 대한 정의에 결함이 있습니다. 귀하의 예에서는 ;
두 개의 서로 다른 명령을 분리합니다. 나는 그 예가 하나의 명령이라고 생각하지 않고 두 개의 명령이라고 생각합니다. 파이프 표기법은 두 명령을 "명령 파이프"로 통합하는데, 나는 여전히 이를 단일 명령으로 생각합니다.
또한 "명령"은 파이프와 같은 간단한 명령일 수도 ls
있고 파이프와 같은 복합 명령일 수도 있다고 생각합니다. 따라서 "명령"이라는 용어는 두 경우 모두 유효합니다.
요약하자면, 귀하가 게시한 개념이 실제로 다른 용어를 보증할 만큼 충분히 다르다고 생각하지 않습니다.