에코를 다루는 사람 *


15

*를 다루는 사람

echo *

에코가 별이나 셸이 돌보는 것을 보았고 filename 목록을 반환합니까?

는 어때

cp temp temp*

14
그건 다양하다. 유닉스 쉘 또는 Windows 쉘?
user1686

@grawity Unix 쉘. 미안하지만 언급하지 않았습니다.
faressoft

유닉스의 경우 아래 답변이 정확합니다. (Windows에서는 개별 프로그램에 의해 이루어 지지만 일반적으로 main () 전에 런타임 라이브러리에 의해 자동으로 수행됩니다.)
user1686

답변:


24

배쉬 (또는 당신이 무엇을 쉘로 사용)은 모든 입력을 읽을 수있는 제일 먼저, 그리고 같은 특수 문자를 해석 시작 ?하고 *. CWD* 에서 일치하는 항목으로 확장 되므로 별표가 해당 일치 항목으로 대체됩니다.

대부분의 경우, 이것은 상당히 진보적이지만 때때로 혼란스러운 사례가 발생할 수 있습니다.

다음을 고려하세요. 디렉토리에는 다음 내용이 있습니다.

  • 테스트 (일반 파일)
  • test1 (디렉토리)
  • test2 (디렉토리)
  • test3 (디렉토리)

당신이 입력하면 mv *뭔가 겉보기 이상한 일이 발생합니다 : test3거기에 있지만 나머지는 사라졌습니다. 처음에는 이상하지만 bash가 실제로 무엇을 전달하는지 이해하면 의미가 있습니다 mv. 별표로 인해 bash는 mv *로 해석 되며 mv test test1 test2 test3mv가 해당 목록을 가져 오면 마지막 인수는 모든 파일이 이동 된 대상이라고 가정합니다.

나열된 명령은 다음과 같습니다.

  • echo *가난한 사람으로 기능 할 수 있습니다 ls. 쉘은 별표를 해당 디렉토리에있는 모든 것으로 확장하고 이미 알고 있듯이 echo말 그대로 bash가 전달한 모든 것을 말 그대로 에코로 표시합니다.
  • cp temp temp*mvtemp라는 디렉토리가 하나만 있지 않으면 위에서 설명한 명령 과 약간 다르게 작동합니다 .이 경우 소스와 대상 이름이 동일합니다. 즉, 아무 것도하지 않습니다.

8
*대신 에 사용 하는 것에 대해 "가난한"것은 없습니다 ls. 예를 들어, for f in *; do이다 이상 신뢰할 수있는 for f in $(ls)파일 이름이 공백 또는 글로브의 문자가 포함 된 경우. 그러나 CWD에 파일이 없으면 실패하므로 해당 사례를 확인해야합니다.
rici

1
@rici 그게 다야 shopt nullglob.
CVn

3
에 관해서는 echo *, 그 트릭 경우에 따라 당신구할 수 있습니다 .
CVn

2
Chiming in :: 원하지 않는 스위치를 트리거하는 임의의 폴더에 "-"가 붙은 파일. rm ./-stupidfile이 작동한다는 것을 알기 전까지는 제거하는 것이 그리 재미 있지 않습니다.
ǝɲǝɲbρɯͽ

1
@ ǝɲǝɲbρɯͽ 좌표계에서 위치를 나타내는 파일 이름이 -1024x-1024에서 1024x1024 인 파일을 포함하는 디렉토리의 내용을 한 번 삭제해야 할 때 알았습니다. 그때는 탈출에 대해 처음 알게되었습니다.
Jarmund

5

이미 언급했듯이, 쉘은 확장 *되어 echo쉘이 현재 디렉토리에서 찾은 것을 인수로받습니다. 그러나 확장으로 인해 아무 것도 발생하지 않는 경우, 즉 디렉토리에 숨겨지지 않은 파일이없는 경우에는 *그대로 유지됩니다 (비표준 옵션이와 같은 일부 쉘에 사용되지 않는 한)라는 명령에 그대로 전달됩니다 bash. 전자는 아무것도 인쇄하지 않지만 후자는 인쇄하기 echo *때문에 가난한 사람처럼 행동하지 않습니다 .ls*

마찬가지로 이름이로 시작하는 파일이 하나 이상없는 경우 현재 디렉토리에 cp /tmp/temp temp*이름이 지정된 파일을 만듭니다 .temp*temp

마지막으로 *어떤 경우에도 변경 사항을 전달하지 않으려면 작은 따옴표 '*', 큰 따옴표 "*"또는 백 슬래시를 사용하여 확장되지 않도록 보호 할 수 있습니다 \*.


4

Bash에서는 쉘이이를 처리합니다. 당신도 시도한다면*반향없이 도

참고-주석에 따라 * ENTER를 실행할 때 디렉토리를 만들고 touch 명령을 사용하여 파일을 만들고 파일을 만들지 않고 적어도 첫 번째 파일이 알파벳순인지 확인하십시오. 경로에있는 스크립트 또는 명령

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

그래서 ls * 진부의 비트가

Windows에서는 *명령으로 처리되므로dir *.* 진부하지 않습니다.

참고-일부 의견을 보면 *를 실행 한 다음 ENTER를 실행할 위험이 있습니다. 디렉토리 목록에서 첫 번째 인 rm이라는 파일이 있으면 그 이후의 파일이 삭제되므로 위험합니다. 또한 디렉토리 목록의 첫 번째 파일이 경로의 스크립트 이름 인 경우 파일이 실행되지 않습니다.


4
rm물론 이라는 파일이있을 수 있습니다 .
Volker Siegel

1
... 그리고 또 다른 하나는 -rf
ǝɲǝɲbρɯͽ

1
@ ǝɲǝɲbρɯͽ 파일 이름이 -rf? 나는 시도 touch -rf하고 touch \-rf있지만, 그것을 만들 수 없습니다.
barlop

@ barlop 위에서 언급했습니다. gui (gedit와 같은)는 잘 처리하지만 쉘 (적어도 bash)은 이것을 통과하기 때문에 ./ 앞에 필요합니다. 우연히 그런 파일을 만들면 rm은 힌트를 주려고하지만 그렇지 않은 경우 : 일회용 아이가있는 임시 폴더에만 있기를 바랍니다.
ǝɲǝɲbρɯͽ

@ ǝɲǝɲbρɯͽ 나는 당신이 의미하는 바를 전혀 이해하지 못합니다. 이름이 지정된 파일을 어떻게 만들 수 있는지 묻습니다 -rf. (나는 rm이라는 파일과 -rf라는 파일의 위험과 *를 입력하고 중요한 폴더에 enter를 넣는 문제를 이해하지 않을 것입니다.)
barlop

-1

기술적으로 작성하는 내용은 정확하지만 링크가 없으면이 답변은 실제로 질문에 대한 답변을하지 않습니다. 관련 세부 사항을 통합하십시오.
CVn

@ MichaelKjörling 나는 링크에 관한 것에 동의하지만 OP는 단순히 쉘이나 명령 자체가 인수를 처리했는지 묻습니다. 글렌의 대답은 단순히 껍질이 그것들을 처리한다는 것을 나타내므로 질문에 대한 대답입니다.
slhck

@slhck 이것이 NAA로 표시되지 않은 이유 입니다. 링크를 제거한 후 문제를 해결하는 것이 남아 있습니다. 그렇다고 이것이 내 의견으로는 좋은 대답 은 아닙니다 . (나는 지금 나의 초기 의견이 달리 해석 될 수 있다는 것을 안다. 왜냐하면, 나는 사과한다. 그러나 나는 그것이 그것을 그대로두기에 충분한 가치가 있다고 생각한다.)
CVn

@ MichaelKjörling Agreed. 난 그냥 사람들에 대한 코멘트를 남겼 NAA로 플래그를 (그리고 것입니다).
slhck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.