답변:
대답은 ls
외부 실행 파일입니다. 를 실행하여 위치를 확인할 수 있습니다 type -p ls
.
ls
그렇다면 왜 쉘에 내장되어 있지 않습니까? 왜 그래야합니까? 쉘의 역할은 사용 가능한 모든 명령을 포함하는 것이 아니라 실행할 수있는 환경을 제공하는 것입니다. 일부 현대 쉘이 echo
, printf
그리고하지 않는 내장 매크로, 그들의 동류 기술적으로 내장 명령해야하지만, 그들은 (주로 꽉 루프에서)를 반복해서 실행 성능 향상을 위해 이렇게 만들어집니다. 그것들을 내장하지 않으면, 쉘은 호출 할 때마다 새로운 프로세스를 분기시키고 실행해야하는데 이는 매우 느릴 수 있습니다.
최소한 ls
외부 실행 파일을 실행하려면 exec 시스템 호출 제품군 중 하나를 실행해야합니다. 당신은 수 분기없이이 작업을 수행하지만, 당신이 사용하는 것을 기본 쉘을 대체 할 것이다. 다음을 수행하여 해당 인스턴스에서 어떤 일이 발생하는지 확인할 수 있습니다.
exec ls; echo "this never gets printed"
쉘의 프로세스 이미지가 교체되었으므로 현재 쉘에 더 이상 액세스 할 수 없습니다. ls를 실행 한 후 쉘을 계속 실행할 수 있으려면 명령을 쉘에 빌드해야합니다.
포킹은 기본 쉘이 아닌 프로세스를 대체 할 수있게하므로 나중에 쉘을 계속 실행할 수 있습니다.
echo
, printf
등
cd
외부 실행 파일이 아닌가?
cd
POSIX 호환 운영 체제에서 실행 파일 ( 여기 참조 ). 그러나 현재 프로세스에서 실제로 chdir ()을 수행하려면 쉘에 내장해야합니다.
강타 참조 설명서 상태 :
내장 된 명령은 별도의 유틸리티로는 얻을 수 없거나 불편한 기능을 구현하는 데 필요합니다.
즉, 쉘은 다음과 같은 경우 내장 명령 만 포함 하도록 설계되었습니다 .
이 ls
명령은 위의 요구 사항에 맞지 않습니다.
그러나 여기 ls
에는 bash 인터프리터와 동일한 프로세스에서 실행되는 내장 기능으로 구현되는 것을 막는 프로그래밍 제약이 없습니다 . 쉘 내장으로 명령이 실행 되지 않는 설계 이유 는 다음과 같습니다.
첫 번째 이유와 관련하여-쉘이 가능한 한 독립적이고 탄력적이기를 원합니다. 쉘 ls
이 "아직 시도하지 않고 응답하지 않는"NFS 마운트에 걸리는 것을 원하지 않습니다.
두 번째 이유와 관련하여-많은 경우 Busybox를 사용하는 시스템 또는 다른 ls
구현 을 가진 다른 파일 시스템에 쉘을 사용할 수 있습니다 . 또는 ls
구현 이 다른 OS에서 동일한 셸 소스를 사용하십시오 .
세 번째 이유와 관련하여- 쉘 인터프리터와 동일한 프로세스에서 find . -type d | xargs ls -lad
구현하기가 어렵거나 불가능한 표현식 ls
입니다.
네 번째 이유와 관련하여-일부 ls
명령을 완료하는 데 시간이 오래 걸릴 수 있습니다. 그 동안 쉘이 계속해서 다른 작업을 수행하기를 원할 수 있습니다.
참고 : 비슷한 질문에 대한 답변으로 Warren Young 의이 유용한 게시물 을 참조하십시오 .
ls
. 가능하지만 복잡 할 것입니다.
bash
출력 alias | grep ls
. 입력cat /etc/passwd | while read a; do echo "$a"; done
ls
별도의 프로세스가 필요하지 않습니다. 실제로 별도의 프로세스가 필요한 명령은 거의 없습니다. 권한을 변경해야하는 명령 만 있습니다.
일반적으로 쉘은 명령을 내장으로 구현해야하는 경우에만 명령을 내장으로 구현합니다. 명령과 같은 alias
, cd
, exit
, export
, jobs
, ... 그러므로 읽거나 껍질의 일부 내부 상태를 수정하고 할 필요가 별도의 프로그램이 될 수 없습니다. 이러한 요구 사항이없는 명령은 별도의 명령 일 수 있습니다. 이런 식으로 어떤 쉘이나 다른 프로그램에서 호출 할 수 있습니다.
bash의 내장 목록을 보면 다음 내장 만 별도의 명령으로 구현할 수 있습니다. 이들 중 일부의 경우 기능이 약간 손실 될 수 있습니다.
command
— 그러나 PATH
제대로 설정되지 않고 스크립트 command
를 설정하는 데 사용하는 상황에서는 유용성이 떨어 집니다.echo
— 효율성을위한 내장 기능입니다.help
— 별도의 데이터베이스를 사용할 수 있지만 셸 실행 파일에 도움말 텍스트를 포함하면 셸 실행 파일을 독립적으로 만들 수 있다는 이점이 있습니다.kill
— 기본 제공 기능에는 두 가지 장점이 있습니다. 프로세스 ID 외에도 작업 지정을 인식 할 수 있으며 별도의 프로세스를 시작할 수있는 리소스가 충분하지 않은 경우에도 사용할 수 있습니다.printf
—와 같은 이유로 echo
그리고 -v
출력을 변수에 넣는 옵션을 지원합니다 .pwd
— 기본 제공 기능은 논리적 현재 디렉토리 추적 기능을 추가로 제공합니다 (기호 링크를 확장하지 않고 그대로 유지).test
— 효율성을 위해 기본 제공되며 bash는 /dev/fd/…
일부 운영 체제에서 호출 되는 파일로 마술을 수행합니다 .몇몇 껍질은 상당수의 추가 내장을 제공합니다. 거기에 띠 긴급 수리 독립형 바이너리 (때 일부 외부 명령을 사용할 수 없습니다) 할 수 있도록 설계 쉘입니다. ls
라는 내장 -ls
도구와 -grep
및 같은 다른 도구가 -tar
있습니다. 새시의 내장 기능은 본격적인 명령보다 기능이 적습니다. Zsh는 zsh / files 모듈 에 유사한 내장 기능을 제공 합니다 . 에는 ls
없지만 와일드 카드 확장 ( echo *
)이 있으며 zstat
비슷한 기능을 수행 할 수 있습니다.
사람들이 여기서 놓친 것은 ls
Linux 에서 GNU 프로그램의 복잡성 때문이라고 생각합니다 . 데비안 시스템 ls
에서 bash
와 dash
쉘 의 실행 파일 크기를 비교하면 크기 가 상당히 크다는 것을 알 수 있습니다.
graeme@graeme:~$ ls -lh /bin/{ls,bash,dash}
-rwxr-xr-x 1 root root 953K Mar 30 2013 /bin/bash
-rwxr-xr-x 1 root root 115K Dec 25 20:25 /bin/dash
-rwxr-xr-x 1 root root 108K Jul 20 22:52 /bin/ls
ls
GNU 버전의 모든 기능을 포함하면 bash
실행 파일 크기가 10 % 증가합니다. 그것은 전체 dash
껍질 과 거의 같은 크기입니다 !
대부분의 쉘 내장은 외부 실행 파일이 할 수없는 방식으로 쉘과 통합되기 때문에 (질문은 지적 cd
하지만 다른 예는 kill
bash 작업 제어와 통합 하는 bash 버전입니다 ) 또는 구현하기가 매우 간단한 명령이기 때문에 선택됩니다. 크기 보수 대 큰 속도를 제공 ( true
및 false
간단한로 가져 약이다).
GNU ls
는 개발주기가 길 었으며 결과를 표시하는 방법 / 방법을 사용자 정의하는 옵션을 구현할 수 있습니다. 기본적으로 내장 ls를 사용하면이 기능이 손실되거나 쉘 복잡성과 크기가 크게 증가합니다.
이것은 당신이 찾고있는 것을합니다 :
printf "%s\n" *
또한 파일 이름을 배열에 저장할 수 있습니다.
files=(`printf "%s\n" *`) #items are separated by whitespace
echo ${#files[*]} files
for index in ${!a[*]}
do printf "%d: %s\n" $index ${a[$index]};
done
그러나 이름의 공백
은 신경 쓰지 않습니다. 변수에 전달되고 공백을 신경 쓰십시오.
printf "%s\n" * | while read a; do echo $a; done
ls
외부 프로그램입니다echo *
또는echo * .*
(쉘 옵션에 따라) 분기하지 않고 파일을리스트 꽤 좋은 작업을 수행합니다.