ls와 같은 시스템 명령은 어떻게 만들어 집니까?


19

* nix에 대한 의심이 있습니다.

  • ls.sh 또는 .ksh 또는 다른 종류의 시스템 실행 파일인지 여부에 관계없이 어떤 유형의 실행 파일인지 알 수 없습니다 .

  • ls명령 의 소스 코드가 어떻게 보이는지 보려고 할 때 읽을 수없는 것을 보여줍니다. * nix는 이러한 유형의 읽을 수없는 파일을 작성하는 데 어떤 방법을 사용하며 내 파일을 이러한 파일과 유사하게 만들 수 있습니다 (예 ls: 읽을 수 없음).



4
나는 그것이 위의 URL과 관련이 있다고 생각합니다.
— slm

답변:


31

file명령과 명령을 사용하여 Unix에서 실행 파일의 특성을 확인할 수 있습니다 type.

유형

다음 type과 같이 디스크에서 실행 파일의 위치를 ​​결정하는 데 사용 합니다.

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

그래서 나는 그것이 ls내 시스템의 두 위치에 있음을 알고 있습니다 : /usr/bin/ls& /bin/ls. 해당 실행 파일을 보면 동일한 것을 볼 수 있습니다.

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

참고 :cmp 또는 을 사용하여 크기 이상으로 동일한 지 확인할 수 있습니다 diff.

diff로
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
cmp로
$ cmp /usr/bin/ls /bin/ls
$ 

파일 사용

file명령을 사용하여 쿼리하면

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

따라서 이들은 C / C ++에서 컴파일 된 실제 물리적 프로그램입니다. 쉘 스크립트 인 경우 일반적으로 다음과 같이 표시됩니다 file.

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

ELF 란 무엇입니까?

ELF는 파일 형식 이며, gccC / C ++ 프로그램을 컴파일하는 데 사용되는 컴파일러의 출력입니다 ls.

컴퓨팅에서 실행 가능 및 연결 가능 형식 (ELF, 이전에는 확장 가능 연결 형식이라고 함)은 실행 파일, 개체 코드, 공유 라이브러리 및 코어 덤프에 대한 일반적인 표준 파일 형식입니다.

일반적으로 파일 이름에 다음 확장명 중 하나가 있습니다. none, .o, .so, .elf, .prx, .puff, .bin


- @lgeorget 유형의 대를 사용하는 방법에 대한 팁이 Q & A를 참조 unix.stackexchange.com/questions/85249/...을 . 일반적으로 또는 type사용하려는 곳이면 어디든 사용하는 것이 가장 좋습니다 . whichwhereis
— slm

3
또한, GNU 도구에 대한 소스 코드를 자유롭게 사용할 수 있으며, 귀하의 검색을 시작 gnu.org/software
— 글렌 잭맨

동일한 테스트를 위해, 당신은 정말 같은 것을 사용해야 md5sum하거나 sha1sum, 단지 파일 크기와 시간을 확인하지.
— Bob

@Bob-동일한 파일은 Q와 관련이 없으므로 간단한 방법을 보여주었습니다. 파일을 비교하기 위해 바이너리 파일을 비교하기위한 cmp와 같은보다 적절한 도구를 사용했습니다. 또한 그들이 제공하는 패키지가 관련되어 있는지 여부를 나타냅니다. 그것들은 둘 모두의 일부이며 coreutils-8.21-13.fc19.x86_64, Red Hat 릴리즈를 다루는 20 년 동안 동일하다는 것을 알고 있습니다.
— slm

@Bob-파일 비교에 대한 예제 업데이트를 참조하십시오.
— slm

9

바이너리 실행 파일입니다 (대부분의 시스템처럼 머신 코드로 컴파일됩니다). 쉘 스크립트는 "접착제"와 유사하여 부품을 하나로 결합하여 기존 솔루션으로 빠르고 유연하게 솔루션을 만들 수 있습니다. 이것이 * nix의 힘입니다.

컴파일 된 실행 파일뿐만 아니라 소스 코드 (c, 때로는 c ++는 * nix에서 가장 일반적인 언어 임)가 필요합니다. 오픈 소스이므로 온라인 리포지토리에서 모든 코드를 얻을 수 있습니다 (핵심 유틸리티는 일반적으로 gnu 프로젝트에서 제공). 그러나 git 또는 다른 버전 추적 시스템을 사용하는 방법을 모른다면 약간 까다 롭습니다.

도움이되는 경우 ls.c 파일은 다음과 같습니다. http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


아, 그리고 바이너리 응용 프로그램을 만드는 방법에 대한 질문을 분명히하려면 : 수많은 프로그래밍 언어 중에서 선택하십시오 (파이썬, 자바, 자바 스크립트와 같이 해석되거나 반 해석되는 커플은 제외하십시오. 이진 파일). 그런 다음 해당 언어를 사용하고 언어를 컴파일하는 방법을 배웁니다.
— 오리온
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.