완전한 초보자 질문.
Linux에서 왜 쉘이 필요한가요? 예를 들어-find를 입력 할 때. -name xy *-쉘이이 입력을 받아서 find 명령을 호출한다고 들었습니다 (와일드 카드가 올바르게 해석되는지 확인하십시오). 쉘의 개념 없이는 이것을 할 수 없습니까? … 쉘이 다양한 프로세스를 추적한다면 이것 없이는 할 수 없습니까?
또한 왜 ls xy *를 입력하고 \ in find-find로 *를 이스케이프 해야하는 동안 적절한 출력을 얻을 수 있습니까? -name xy \ * 쉘이 다른 실행 파일이 아닌 와일드 카드 확장을 수행합니까?
감사합니다.
답변
쉘 개념이 없으면이 작업을 수행 할 수 없습니까?
음 … 아니. 의도를 해석하고 적절한 프로그램을 호출하는 무언가가 필요합니다. 그 것을 껍질이라고합니다.
편집 : 혼란을 피하기 위해 “쉘”은 “명령 줄 인터페이스”를 의미하지 않습니다. 에서 ) http://en.wikipedia.org/wiki/Shell_(computing :
“운영 체제 셸은 일반적으로 명령 줄과 그래픽의 두 가지 범주 중 하나에 속합니다. 명령 줄 셸은 운영 체제에 명령 줄 인터페이스 (CLI)를 제공하는 반면 그래픽 셸은 그래픽 사용자 인터페이스 (GUI)를 제공합니다. 쉘의 주요 목적은 다른 프로그램을 호출하거나 “시작”하는 것이지만, 쉘은 종종 디렉토리의 내용을 보는 것과 같은 추가 기능을 가지고 있습니다. “
다른 질문에 관해서는, 셸은 두 명령 모두에 와일드 카드 확장을 수행하지만 셸이 아닌 찾기를 사용하여 파일을 검색 할 때 찾기가 찾고있는 위치에서 수행하기 때문에 확장을 수행하려고합니다. 호출 된 위치가 아닌 따라서 *를 이스케이프하여 쉘 확장을 중지하면 찾기에서 볼 수 있습니다.
답변
물론 GUI를 통해 모든 것을 할 수 있습니다. XP 이전 버전의 Windows 파일 찾기는 입력 한 명령과 다소 유사합니다.
자, 왜 유닉스 (및 리눅스) 사용자들이 쉘을 좋아합니까? 출력을 가져 와서 다른 프로그램에 공급하고 다른 출력을 얻을 수 있습니다. 예를 들면 다음과 같습니다.
find | grep burek
이것들은 두 개의 명령 find
이며 grep
, 하나는 다른 하나를 공급합니다. find
현재 및 모든 하위 폴더의 모든 파일을 한 줄에 하나씩 나열 grep
하고을 포함하는 행만 인쇄합니다 burek
.
이제 다음과 같은 더 복잡한 다른 것들이 있습니다.
ls -R | sort | uniq
ls -R
현재 및 하위 폴더에 파일을 나열 sort
하고 출력을 정렬합니다. uniq
그런 다음 우리에게 유일한 라인을 제공합니다.
이제이 모든 것을 GUI로 코딩 할 수는 있지만, 직접 작성하지 않으면 GUI로 수행 할 수없는 명령 줄을 사용하여 이러한 까다로운 작업을 빠르게 수행 할 수 있습니다. 어떤 경우에는 명령 줄에 입력하는 것이 더 빠르지 않습니까?
결론 : 당신이 이것을 요구한다면, 당신은 그것을 요구하지 않습니다. 일반 사용자는 명령 줄을 사용할 수 없습니다. 그러나 명령 줄은 시스템 관리자, 개발자 및 컴퓨터를 빠르고 빠르게 엉망으로 만들고 싶은 사람들에게 좋습니다.
답변
예, 쉘없이 find 명령을 실행할 수 있습니다.이를 시작하려면 일부 프로그램이 필요하며 출력을 표시하려면 일부 프로그램이 필요합니다. 많은 경우, 쉘의 기능을 사용하고 있으며,이 명령은 의도를 해석하기 위해 쉘이 필요합니다.
예를 들어 배관, 방향 전환 및 글 로빙은 쉘의 기능이며 해석하려면 쉘이 필요합니다. “find. -name myfile”은 쉘의 기능을 사용하지 않으며 쉘없이 실행될 수 있습니다. “find. -name myfile | sort> output”은 파이핑과 리디렉션을 모두 사용하므로이를 해석하려면 셸이 필요합니다.
xy * 이스케이프와 관련하여 찾은 입력 또는 재귀 출력의 경우 차이가 거의 없습니다. 쉘은 어느 쪽이든 확장합니다.
현재 디렉토리에 xyz라는 파일이있는 경우
찾기 . -name xy *는 실제로 find로 실행됩니다. -name xyz, 이것은 아마도 당신이 원하는 것이 아닙니다.
당신이 찾을 경우. -name xy *이고 현재 디렉토리에 xy *와 일치하는 파일이 없으면 find로 실행됩니다. -이름 xy *.
마찬가지로 현재 디렉토리 ls> xy *에 xy *와 일치하는 파일이 없으면 xy *라는 파일을 만듭니다. xyz와 일치하는 파일이 하나 있으면 ls> xyz를 의미합니다. xy *와 일치하는 여러 파일이 있으면 ls> xy *가 실패합니다.
답변
사소한 OS 는 커널에서 명령 줄 인터프리터를 실행 하지 않습니다 .
그것들을 프로그램으로 실행하고 그 프로그램을 쉘 이라고 합니다 . GUI의 상황은 혼합 된 것처럼 보이지만 적어도 일부 OS는 커널 외부에서도 작동합니다.
이제는 쉘이 유닉스 쉘처럼 작동 할 필요는 없지만 인터페이스 가 필요합니다.
답변
두 번째 질문에 대답하기 위해 … 쉘은 당신이 그것을 막지 않는 한 가능할 때마다 가능한 모든 것을 확장하려고 시도합니다. *를 이스케이프하면 확장을 방지 할 수 있으며 일반적으로 find 명령에 필요합니다.
질문으로 질문에 대답하지 않으려면 명령 줄 확장으로 인해 ls 명령이 파일을 나열했는지 또는 ls 명령이 파일 시스템에서 디렉토리 목록을 합법적으로 조회했기 때문에 어떻게 알 수 있습니까? 예를 들어, 다음과 같이 루프 for 루프를 작성할 수 있습니다.
for i in $(ls /home/mydir);
또는 좋아
for i in /home/mydir/*;
그들은 같은 세트를 초래합니다.
답변
> ls xy *를 입력하고 적절한 출력을 얻는 이유는 무엇입니까? find-find에서 \로 *를 이스케이프해야합니다. -이름 xy \ *는 쉘 하나에 대한 와일드 카드 확장을하고 있지만 다른 실행 파일?
찾기 호출에서 ‘*’를 벗어나는 지점은 쉘이 확장을 수행하지 못하게하는 것입니다. 이를 빠져 나가면 find가 “.”, “-name”, “xy *”인수를 보게됩니다. ‘*’를 이스케이프하지 않으면 “.”, “-name”, “xya”, “xyz”가 표시됩니다 (쉘이 “xy *”를 “xya xyz”로 확장한다고 가정하면 xy로 시작하는 파일은 xya 및 xyz입니다. 따라서 귀하의 질문에 대한 대답은 아니오입니다. 쉘은 찾기 호출로 ‘*’를 확장하지 않습니다.
답변
Linux의 셸은 Linux의 파일 시스템과 상호 작용하고 인수 및 환경 변수와 관련하여 명령을 실행하는 편리하고 일반적인 방법입니다. 예를 들어 한 프로세스의 출력을 다른 프로세스의 입력으로 연결, 입력 / 출력 스트림을 파일, FIFO 등으로 리디렉션하는 등 유용한 기능을 많이 제공합니다. 셸은 여러 개의 작은 프로그램을 쉽게 결합 할 수있는 좋은 방법입니다. 유용한 작업을 제공하기 위해 비교적 작은 작업을 수행합니다. 이러한 프로그램 중 일부 (예 : find 및 ls)는 쉘에서 이들과 함께 작동하도록 설계되었습니다.
확장을 이해하기 위해서는, 단순히 단어 (aplhanumeric 문자의 공간 경계 순서 기억 -
, 그리고 몇몇 다른 기호)에 포함 주어진 *
또는 ?
패턴 문자는 이스케이프 또는 따옴표 (내부에 넣어되지 않은 "
) 또는 아포스트로피 '
일련의 치환, 패턴과 일치하는 파일 이름을 가진 공백으로 구분 된 단어 따라서 별표가있는 단어가 하나 있었습니까? 확장 후 bash에서 여러 인수로 처리되는 0 개 또는 여러 단어가 있습니다. 다음은 특정 ls
명령 디자인입니다 . ls foo*
“foo”로 시작하는 모든 파일을 표시 할 때이 구성표에 완벽하게 맞습니다 ! 그것은 같은 것으로 확장됩니다
ls foobar boobaz
ls는 인수에서 파일을 인쇄하여 존재 여부를 확인하고 폴더 등을 탐색합니다.
그러나 그것은 대부분 철학의 문제입니다. 다른 시스템에서는 모든 것이 “시작”버튼과 작업 표시 줄에서 나타납니다. 일부 사용자는 그것에 능숙합니다. 일부는 리눅스와 같은 쉘을 그러한 시스템에 설치하려고합니다. 그것은 맛의 문제이지만 파일을 다루는 간단한 스크립트를 프로그래밍 할 때 쉘은 매우 편리합니다.