2016-10-13 2 views
0

저는 리눅스를 많이 사용 함에도 불구하고 여전히 프로그램을 실행하는 리눅스 쉘의 역할과 꽤 혼동스러워합니다.리눅스 쉘은 단지 선택 유틸리티인가 아니면 프로세스 실행시 필수적입니까?

2 가지 유형의 셸, 대화 형 셸 및 비대화 형 셸이 있다는 것을 알고 있습니다. 터미널 세션은 대화 형 셸과 상호 작용하고 스크립트는 비 대화 형 셸에서 실행됩니다. 하지만 실제로 입력과 출력물을 읽을 수있는 능력과 다른 점이 있습니까? 셸에서 스크립트를 호출하면이 대화 형 셸 또는 셸 내부의 새로운 비대화 형 셸에서 실행됩니까?

또한 대화 형 셸 또는 그래픽 인터페이스를 통해 이진 코드를 실행하면 항상 셸에서 실행되거나 셸없이 실행될 수 있습니까? 모든 프로세스는 쉘을 통해 커널과 통신한다고 말했지만, 도커에서는 진입 점을 바이너리 또는 "sh -c 바이너리"로 정의 할 수 있기 때문에 혼란 스럽습니다.

+0

쉘은 명령 인터프리터입니다. 더 이상은 아니지만 덜합니다. 그것은 다른 실행 파일과 마찬가지로 실행 파일이기 때문에 게임에서 _not_이라는 것을 의미합니다. 일부 "프로그램"은 실제로 바이너리 또는 스크립트가 실행되기 전에 환경을 설정하기 위해 "래퍼 셸 스크립트"를 사용합니다. 그러나 그것은 그 "프로그램"이 어떻게 설정되는지에 달려 있습니다. 그러나 일반적으로 로그인하는 사용자, 즉 "로그인 쉘"에 대해 생성 된 초기 셸 프로세스가 있습니다. 이 프로세스에서 다른 모든 사용자 프로세스가 생성됩니다. – arkascha

답변

4

쉘은 가능한 인터페이스 중 하나입니다. 모든 리눅스 시스템은 커널에 의해 직접 시작되는 "첫 번째"프로세스 (일반적으로 init)를 가지고 있습니다. 컴퓨터에있는 모든의 프로그램은 먼저 자체적으로 포크하는 다른 프로세스에서 시작한 다음 exec (실제로는 같은 제품군의 약 6 개 기능 중 하나)을 호출하여 다른 프로그램으로 바꿉니다.

셸은 텍스트를 다른 프로그램을 실행하는 요청으로 구문 분석하는 인터페이스 중 하나 일뿐입니다. 셸 명령 줄 mv foo bar은 셸을 넘기위한 요청으로 구문 분석되고 mv, foobar이라는 세 단어를 인수로 사용하여 exec을 새 복사본에 호출합니다. 파이썬 프로그램 포크 자체 인수로 세 개의 주어진 문자열 exec를 호출 : 기본적으로 같은 일을

subprocess.call(["mv", "foo", "bar"]) 

:

파이썬의 다음 코드를 생각해 보자. 쉘 참여가 없습니다.

+0

화제가 거의 없지만 포크를 통해 다른 프로세스를 시작한 프로세스가 종료되면 하위 프로세스가 계속 진행될 수 있습니까? 다른 말로하면, 그들은 포크 후 독립적입니까? 쉘에서 포어 그라운드로 프로세스를 생성하고 쉘을 닫으면 프로세스도 종료됩니다. 그러나 백그라운드 (&)에서 실행할 때 쉘은 생성 된 프로세스 종료없이 종료 될 수 있습니다. 포크와의 관계는 무엇입니까? 또한, 주제에서 벗어나지 만 도커 컨테이너 진입 점이 어디에서 갈까요? –

+1

@Tuomas : 별도의 질문을하고 싶을 수도 있습니다.하지만 먼저, [고아 프로세스 **] (// en.wikipedia.org/wiki/Orphan_process)에 대한 내용을 읽어보십시오. 즉, ID 1을 가진 프로세스는 고아 프로세스의 부모가됩니다. –

+0

예, Linux 커널이 있지만 쉘이없는 시스템이 있습니다. 예를 들어 [Empeg Car] (// en.wikipedia.org/wiki/Empeg_Car) 오디오 플레이어가 있습니다.이 플레이어는 기본적으로 플레이어 바이너리를 init 프로세스로 실행합니다. –

0

쉘은 사용자가 원하는대로 다른 프로세스를 실행할 수있는 편리한 UI입니다. 또한 스크립트를 실행하여 동일한 작업을 수행 할 수도 있습니다. 그게 전부입니다. 프로세스를 실행 한 후에는 프로세스 수행에 대한 책임이 없습니다.

당신은 완전히 같은 일을 할 수 있습니다 python로 교체 할 수 있지만, 당신은 단지 mv 프로그램을 실행하는 chepner의 subprocess.call(["mv", "foo", "bar"])을 입력해야하기 때문에 그 짜증나. 한 프로그램을 다른 프로그램으로 파이프하려면 5-10 줄이 필요합니다. 대화 형으로 글을 쓰는 재미는별로 없습니다.

KDE/Gnome/whatever로 바꾸고 실행하려면 프로그램을 두 번 클릭하십시오.하지만 인수를 포함 할 수 없기 때문에 융통성이 없으므로 자동화 할 수 없습니다.

2 가지 유형의 셸, 대화 형 셸 및 비대화 형 셸이 있다는 것을 알고 있습니다. 터미널 세션은 대화 형 셸과 상호 작용하고 스크립트는 비 대화 형 셸에서 실행됩니다. 하지만 실제로 입력과 출력물을 읽을 수있는 능력과 다른 점이 있습니까?

sh을 실행할 수있는 두 가지 모드입니다. 수동으로 (대화식으로) 입력하는 데 도움이되는 편리한 키보드 단축키, 별칭 및 옵션을 원하지만 미리 작성된 스크립트를 실행할 때는 의미가 없거나 귀찮습니다.

쉘에서 스크립트를 호출하는 경우이 대화 형 쉘 또는 쉘 내의 새로운 비 대화식 쉘에서 실행됩니까?

새로운 독립 프로세스로 실행됩니다. 동일한 대화 형 쉘 인스턴스 (source yourscript)로 실행할 수 있습니다. 이는 키보드에서 스크립트 내용을 입력하는 것과 기본적으로 같습니다.

또한 대화 형 셸 또는 그래픽 인터페이스를 통해 이진 파일을 실행하면 항상 셸에서 실행되거나 셸없이 실행될 수 있습니까?

프로세스는 항상 쉘과 완전히 독립적으로 실행되지만 동일한 터미널을 공유 할 수 있습니다.

모든 프로세스는 쉘을 통해 커널과 통신 말했다 것,

프로세스는 쉘을 통해 커널에 이야기하지 않았다. 그들은 syscalls를 통해 이야기합니다.

하지만 독커에서 진입 점을 바이너리 또는 "sh -c 바이너리"로 정의 할 수 있기 때문에 혼란 스럽습니다.

간단한 바이너리의 경우 두 개가 동일합니다.

예를 들면 프로세스가 자체적으로 수행하지 않기 때문에 파이프 또는 재 지정을 설정하면 sh -c을 사용하여 대신 쉘을 수행 할 수 있습니다.

관련 문제