"ls *" 명령이 잘못된 옵션에 대한 오류를 생성하는 이유는 무엇입니까?

"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

여기서 와일드카드가 작동하지 않는 이유에 대한 아이디어가 있습니까? 저는 우분투에 있고 터미널에서 일하고 있는데 이것이 어떤 차이가 있는지 모르겠습니다.

감사해요.

답변1

당신이 달릴 때

ls *

와일드카드는 평소와 같이 작동하며 *다음을 포함하여 현재 디렉터리의 모든 파일 이름으로 확장됩니다.

-|h4k3r|-

로 시작 -하므로 ls옵션(예: -a또는 -l)으로 구문 분석해 보세요. |이는 실제로 인식되는 옵션이 아니기 때문에 ls오류 메시지를 표시 invalid option한 다음 종료됩니다(파일 목록 없이).

현재 폴더의 모든 항목을 명시적으로 나열하려면 다음을 시도하십시오.

ls ./*

...이렇게 하면 모든 파일 이름에 접두사가 추가됩니다 ./(항목이 옵션으로 잘못 해석되지 않도록).

ls -- *

...여기서 --"옵션의 끝을 나타내는 구분 기호"가 있습니다. 나머지 인수는 파일 이름입니다.

답변2

여기서 누락된 중요한 개념적 도약은 와일드카드가 수행되는 곳이라고 생각합니다. ls자체적으로는 와일드카드 작업을 수행하지 않습니다. 인수를 제공하지 않으면 사용자가 의미하는 바를 가정하고 .명령줄에 제공한 디렉터리와 마찬가지로 디렉터리를 나열합니다.

와일드카드 작업을 수행하는 쉘입니다. 그런 다음 쉘은 결과를 명령줄 인수로 전달합니다 ls. ls해당 인수를 입력했는지 아니면 전역 확장의 결과인지 확실하지 않습니다. 따라서 다른 명령줄 인수와 마찬가지로 플래그를 구문 분석합니다.

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

여기서 또 다른 흥미로운 데모는 여러 디렉터리를 포함하는 디렉터리를 만드는 것입니다. 그런 다음 이 작업을 수행하면 ls *쉘은 이러한 모든 디렉터리를 인수로 제공하고 ls각 디렉터리 목록을 제공합니다. 이는 .인수를 제공하지 않는다고 가정하는 것이 특별한 동작이 아니라 단순한 기본 동작임을 보여줍니다 .

./*쉘이 전역 확장을 수행하여 모든 것이 쉘 앞에 *오도록 하면 인수가 옵션으로 해석되지 않습니다. 만약 그렇다면 옵션은 옵션 처리 시도를 중단하고 나머지 모든 인수를 나열해야 하는 파일이나 디렉터리로 처리해야 한다는 의미로 해석됩니다. 따라서 IMHO가 더 나은 선택입니다../lsls -- *ls----

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

답변3

일반적으로 이 명령은 ls *현재 작업 디렉터리의 모든 파일과 디렉터리를 나열해야 합니다. 현재 직면하고 있는 문제를 일으킬 수 있는 두 가지 상황이 있습니다.

  1. 이러한 유형의 오류는 디렉토리에 포함된 파일에 --2"or"라는 이름의 디렉토리 와 같이 지원되지 않는 문자가 포함된 경우 -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

답변4

이는 "-|"라는 파일이 있다는 의미입니다. 쉘(bash, ksh 등) 작동 방식으로 인해 모든 와일드카드 표현식은 현재 디렉토리의 내용에 대해 평가됩니다.앞으로명령이 호출되므로 다음과 같은 명령이 있는 경우-|, ls *이 호출 ls file1 file2 ... -| ...되고 이 오류가 발생합니다.

삭제하거나 이름을 바꾸는 방법은 예를 들어 mv './-|' xyz이름을 .xyz

관련 정보