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.