한 줄에 파일/디렉토리 목록을 인쇄하는 방법은 무엇입니까 echo
?
공백을 개행 문자로 바꿀 수 있지만 파일 이름에 공백이 포함되어 있으면 작동하지 않습니다.
$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg
$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg
를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 ls -d1
를 사용하여 이 작업을 수행하는 것도 가능합니까 echo
?
답변1
echo
printf
어떠한 경우에도 임의의 데이터를 출력하는 데 사용할 수 없습니다.echo
이것은 텍스트 출력을 위한 손상된 유틸리티를 POSIX로 대체합니다.
printf '%s\n' small*jpg
다음과 같이 할 수도 있습니다.
printf '%s\0' small*jpg
목록을 NUL로 구분된 레코드로 출력합니다(예를 들어 GNU를 사용하여 사후 처리할 수 있습니다 xargs -r0
. 개행 문자는 파일 이름의 공백이나 문자만큼 유효하다는 점을 기억하세요).
POSIX가 등장하기 전에는 ksh를 대체하는 유틸리티가 printf
있었습니다 . zsh가 이를 복사하고 한 줄에 하나의 인수를 인쇄하는 옵션을 추가했습니다.print
echo
-l
print -rl -- small*jpg
ksh93은 인쇄와 유사한 -f
옵션을 추가합니다. 또한 복사되었지만 다른 ksh 구현에서는 복사되지 않았습니다.print
printf
zsh
print -f '%s\n' -- small*jpg
인수가 제공되지 않으면 이러한 모든 함수는 여전히 빈 줄을 인쇄합니다. 더 나은 접근 방식 println
은 다음과 같은 함수로 작성하는 것입니다.
println() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
}
존재하다 zsh
:
println() print -rC1 -- "$@"
답변2
echo
인수로 받은 문자열을 구분하려면 공백만 사용하세요.
귀하의 질문이 태그되었으므로세게 때리다, 내용은 다음과 같습니다 help echo
( bash
강조):
ARG 표시,단일 공백 문자로 구분됨그런 다음 표준 출력에서는 개행 문자가 옵니다.
다른 구현 문서에서도 비슷한 설명을 찾을 수 있습니다. 예를 들어echo
~에서coreutils
, GNU/Linux에서 찾을 수 있습니다:
echo
각 문자열 사이에 공백을 두고 마지막 문자열 뒤에 줄 바꿈을 추가하여 주어진 각 문자열을 표준 출력에 씁니다.
파일 이름을 별도의 줄에 인쇄 하려면 echo
단일 문자열로 제공해야 합니다.
$ touch "small1.jpg" "small2.jpg" "small photo 1.jpg" "small photo 2.jpg"
$ (set -- small*.jpg; IFS='
'; echo "$*")
small1.jpg
small2.jpg
small photo 1.jpg
small photo 2.jpg
여기서는 특수 매개변수의 동작을 활용합니다 *
. 큰따옴표 안에는 다음과 같이 확장됩니다.한 단어여기서 위치 인수 배열의 요소는 IFS
변수의 첫 번째 문자(개행 문자로 설정)를 사용하여 연결됩니다.
이 (...)
구문은 서브쉘 환경에서 명령을 실행하는 데 사용됩니다. 일반적으로 우리는 메인 쉘에 영향을 미치고 싶지 않습니다.
하지만 다음 echo
에 설명된 대로 모든 제한사항은 여전히 적용됩니다.스티븐의 대답이므로 이 경우에는 사용하지 않는 것이 좋습니다.