it-swarm-ko.tech

"ls *"명령이 유효하지 않은 옵션에 대해 오류를 생성하는 이유는 무엇입니까?

파일을 표시하지 않는 ls "*"에 대해 말하는 스레드가 있지만 실제로 왜 간단한 지 궁금합니다.

ls *

명령은 내 터미널에서 아무것도 출력하지 않습니다.

ls: invalid option -- '|'
Try 'ls --help' for more information.

동안

ls

현재 디렉토리의 모든 파일을

 1                  ferol                      readme.txt
 2                  fichier                    sarku
 2018               GameShell                  Templates
 22223333          '-|h4k3r|-'                 test
 3                  hs_err_pid2301.log         test2
 CA.txt             important.top.secret.txt   toto.text
 CA.Zip             JavaBlueJProject           tp1_inf1070
 countryInfo.txt    liendur                   'tp1_inf1070_A19(2) (1)'
 currency           liensymbolique             tp1_inf1070_A19.tar
 curreny            LOL                        Videos
 Desktop            Longueuil                 'VirtualBox VMs'
 Documents          Music                      words
 douffos            numbers                    Zip.zip
 Downloads          Pictures
 examples.desktop   Public

Globbing이 왜 효과가 없는지에 대한 아이디어가 있습니까? 터미널에서 일하는 우분투에 있는데 차이가 나는지 모르겠습니다.

감사.

34
MaelPJ

달릴 때

ls *

globbing은 평소처럼 적용되며 *는 다음을 포함하여 현재 디렉토리의 모든 파일 이름으로 확장됩니다.

-|h4k3r|-

-이므로 ls은 (를) -a 또는 -l). 같이 |은 (는) 실제로 ls에서 인식하는 옵션이 아니며 오류 메시지 invalid option 그런 다음 파일을 나열하지 않고 종료합니다.

현재 폴더의 모든 내용을 명시 적으로 나열하려면 대신

ls ./*

... 모든 파일 이름 앞에 ./ (항목이 옵션으로 잘못 해석되지 않도록) 또는

ls -- *

...어디 --는 "옵션의 끝을 나타내는 구분자"입니다. 나머지 인수는 파일 이름입니다.

101
JigglyNaga

여기서 중요한 누락 된 개념 도약은 globbing이 수행되는 곳이라고 생각합니다. ls는 절대로 globbing 자체를 수행하지 않습니다. 인수를 제공하지 않으면 .를 의미한다고 가정하고 명령 행에서 지정한 디렉토리와 같이 해당 디렉토리를 나열합니다.

글러브를하는 것은 Shell입니다. 그런 다음 셸은 결과를 여러 명령 줄 인수로 ls에 전달합니다. ls에는 이러한 인수를 입력했거나 glob 확장 결과 인 경우 실마리가 없습니다. 따라서 다른 명령 줄 인수와 마찬가지로 플래그를 구문 분석합니다.

이것은 Windows에서 작동하는 방식이 아니며 Windows가 명령 줄 프로그램을 처리하는 방법의 주요 결함이라고 생각합니다.

여기서 흥미로운 또 다른 데모는 디렉토리가 많은 디렉토리를 만드는 것입니다. 그런 다음 ls *를 수행하면 셸에서 해당 디렉토리를 모두 인수로 제공하고 ls에서 각 디렉토리에 대한 목록을 제공합니다. 이것은 당신이 인수를 제공하지 않았다면 .라고 가정하는 것이 어떤 특별한 행동이 아니라 단순한 기본값이라는 것을 보여줍니다.

./* 대신 *라고 말하면 셸이 모든 확장을 수행하여 앞에 ./가 표시되므로 ls 인수를 옵션으로 해석하십시오. ls -- *를 수행하면 ls-- 옵션을 옵션 처리를 중단하고 나머지 모든 인수를 파일 또는 디렉토리로 처리해야한다는 의미로 해석합니다. 에 대한 목록. 따라서 IMHO, --가 더 나은 선택입니다.

-- 규칙은 대부분의 Unix 명령 행 유틸리티를 따르며 대부분의 언어로 작성된 대부분의 인수 구문 분석 라이브러리의 표준 기능입니다.

4
Omnifarious

일반적으로 ls * 명령은 현재 작업 디렉토리의 모든 파일과 디렉토리를 나열해야합니다. 직면 한 문제로 이어질 수있는 두 가지 경우가 있습니다.

  1. 디렉토리에 포함 된 파일 중 이름이 --2 "또는 -2와 같이 지원되지 않는 문자가있는 경우 이러한 오류가 발생합니다. 예를 들면 다음과 같습니다.

    # ls -la | grep 2$
    drwxrwxr-x  2 test test    4096 Oct 28 14:58 --2
    # ls *
    ls: unrecognized option '--2'
    

    -로 시작하는 파일 이름이 ls 명령에 대한 옵션으로 간주되기 때문입니다.

  2. 그렇지 않은 경우 .bashrc 파일에 별칭이 설정되어 있다고 생각합니다. 예를 들어, alias ls='ls –2' 별칭을 설정하면 ls 명령을 사용할 수 없습니다. -2 인 잘못된 옵션이 필요하기 때문입니다.

0
Not Named