저는 Ubuntu 14.04에서 터미널을 사용하고 셸에서 명령줄 코드를 실행하여(제가 말한 내용은 터미널 내부에 있음) 프로그램을 설치하는 방법을 배우고 있습니다. 하지만 쉘에서 Node.js 서버를 시작한 다음 터미널에서 자바스크립트 코드를 실행할 수도 있습니다. 변수에 저장한 값을 추적하고 함수를 만든 다음 사용할 수도 있습니다. 그러나 더 이상 OS의 특정 폴더에 있지 않다는 점에서 모드를 변경하는 것 같으니 더 이상 셸에 있지 않은 것일까요?
그래서 저는 쉘 명령을 조사하기 시작했습니다.
"명령"이란 무엇입니까?
~에 따르면http://linuxcommand.org/lc3_lts0060.php명령은 4가지 유형 중 하나일 수 있습니다.
실행 가능한 프로그램/usr/bin에 있는 모든 파일과 같습니다. 이 범주에서는 C 및 C++로 작성된 프로그램이나 쉘, Perl, Python, Ruby 등과 같은 스크립팅 언어로 작성된 프로그램과 같은 프로그램을 바이너리로 컴파일할 수 있습니다.
명령케이싱 자체에 내장되어 있습니다. bash는 내부적으로 쉘 내장이라고 불리는 여러 명령을 제공합니다. 예를 들어, cd 명령은 쉘 내장 명령입니다.
쉘 함수. 이는 환경에 통합된 작은 쉘 스크립트입니다.
별명. 다른 명령을 기반으로 자신만의 정의된 명령을 작성할 수 있습니다.
이것은 프로그램을 시작할 때마다 항상 쉘의 도움을 받아 파일(예: xphp, x.js x.css x.html 파일)에서 더 높은 수준의 코드를 실행한다는 의미입니까? 아니면 명령줄을 사용하여 프로그램을 시작한 다음 다른 곳에서 실행할 수 있다는 뜻인가요?(다른 곳이라면 어디서?)
이러한 다양한 유형의 코드/언어 간의 상호 작용을 어떻게 마스터합니까?
예를 들어, 이 모든 것을 명령줄에 입력된 코드로 생각할 수 있습니까? 일부 언어는 다른 언어를 한 줄씩 호출한 다음 호출자에게 제어권을 반환하는 등의 작업을 수행합니다. 아니면 무슨 일이 일어나고 있는지 이해하는 데 어떤 종류의 정신 모델이 도움이 될까요?
답변1
나는 복잡한 시스템의 정신적 모델을 개발하는 데 상향식 학습 외에 도움이 되는 것을 결코 발견하지 못했습니다.
약간의 어셈블리 언어를 배우십시오. 많이는 아니고 숫자 추가 서브루틴을 작성하는 데 충분합니다. Watch는 디버거를 단계별로 실행하여 작업을 수행합니다. 포인터는 기계 주소에 불과한 반면 문자열은 실제로 그 안에 있는 셀로 끝나는 메모리 셀의 시퀀스라는 것을 발견했습니다 0
(면책조항:일부언어).
이것을 알고 나면 고급 언어로 작성할 때 이를 기억하는 것이 전체 시스템에 대한 일관된 그림을 얻기 위해 할 수 있는 최선의 방법입니다. 어떤 것이 다른 것보다 느린 이유와 다른 것에는 더 많은 메모리가 필요한 이유를 즉시 이해하게 될 것입니다.
프로그래밍 언어를 이해한 후에는 다음을 빠르게 살펴보세요.구현하다명령 셸. 다시 말하지만, 입력과 출력이 다음과 같다는 점을 제외하면 다른 프로그램과 같은 프로그램이라는 것을 알 수 있을 만큼 길지는 않습니다.기타 명령. 명령줄을 구문 분석하는 것을 보면 공백이 있는 파일 이름이 왜 그렇게 많은 문제를 일으키는지 "알게" 됩니다.
또는 현대 시스템의 시작 데몬 내부를 살펴보고 이것이 쉘 스크립트, 프로그램 및 시스템 호출을 사용하여 특정 기능을 달성하는 방법을 확인하십시오(얼마나 흔들리는지 보고 너무 놀라지 마십시오).
시간이 좀 걸리지만 난 당신을 믿어요할 수 없다현대 컴퓨터와 같은 복잡한 시스템을 이해하기 위해 많은 시간을 소비할 필요는 없습니다. 더 일반적인 것은 반쯤 거짓이고 오해를 불러일으키는 정신 모델을 사용하는 것입니다(기술 지원 분야에서 하루를 보낸 적이 있는 사람에게 물어보세요). 또한 스택의 모든 내용을 이해하지 못할 수도 있지만 괜찮습니다.아무도오늘날 무엇이든 계산하는 데 사용되는 전체 스택에 대해 알아보세요. 인간의 두뇌는 그런 묘기를 다시 시도하기에는 너무 느리고 너무 소중합니다.
답변2
터미널을 열 때 쉘을 사용하는 것이 맞습니다. 셸의 주요 작업은 실행 가능한 프로그램을 실행하는 데 도움을 주는 것입니다.
그렇다면 실행 파일이란 무엇입니까? 입력 ls
하고 Enter를 누르세요. 현재 디렉토리의 파일을 인쇄해야 합니다. 이제 이것은 쉘이 이라는 일종의 내장 명령을 실행하는 것처럼 보입니다 ls
. 그렇죠? 잘못된! 실제로 새로운 Linux를 생성합니다. 프로세스실행 가능한 프로그램을 실행합니다 /usr/bin/ls
.
그렇다면 파일 목록을 쉘에 쓰는 이유는 무엇입니까? 글쎄요, ls
프로그램은 쉘에 대해 아무것도 모릅니다. 사실 어디에 써야할지 잘 모르겠습니다. 프로그래머가 하는 일은 프로그램이 목록을 다음과 같은 파일에 쓰도록 하는 것뿐입니다.표준 출력. 그런 다음 쉘은 다음과 같은 Linux 트릭을 사용합니다.관로목록이 터미널에 인쇄되도록 합니다.
흥미롭게도 쉘은 이 표준을 다른 곳에서도 적용할 수 있습니다. 예를 들어, 입력해도 ls > /tmp/ls.out
터미널에 인쇄되지 않습니다. 실제로 목록을 /tmp
디렉터리의 파일 로 보냅니다 . 더 흥미롭게도 입력하면 ls | less
셸이 ls
프로그램뿐만 아니라 less
프로그램도 실행하고 파이프로 연결합니다.표준 출력ls
도착표준은의 less
. 이들 프로그램 중 어느 것도 쉘에 대해 아무것도 모르고, 사실 쉘도 프로그램이 어떻게 작동하는지에 대해 아무것도 모릅니다. 프로그램이 표준 방식으로 코딩되면 그냥 작동할 것입니다.
이제 이 예를 살펴보겠습니다 node.js
. 다시 말하지만, 쉘은 방금 node.js
프로그램을 시작했습니다. 인수를 제공하지 않으면 이 프로그램은 다음에서 시작하려고 시도합니다.표준은좋다 less
. 아무것도 파이핑하지 않기 때문에 쉘은 키보드를 연결하여 입력한 모든 내용이 으로 전송되도록 합니다 node
.표준 출력쓰여진 모든 내용이 node
우리가 보는 대로 터미널로 전송되도록 터미널에 전송합니다 ls
. 결과적으로 쉘은 이제 JavaScript를 이해하는 것처럼 보이지만 그렇지 않습니다. 실제로는 실행기를 이해하고 입력/출력을 리디렉션합니다(적어도 이 경우). 이것은 node
JS를하고 있습니다.