를 입력하면 echo hello
터미널은 다음과 같이 표시됩니다.
My-Computer:~ user$ echo hello
hello
My-Computer:~ user$
하지만 이런 기능이 있다면
stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }
이렇게 생겼어
My-Computer:~ user$ stringen 18
^\k6JPWVIUdEiudcWSMy-Computer:~ user$
새 줄에 인쇄되지 않는 것을 보시겠습니까? vs.를 사용할 printf
때도 마찬가지입니다 . echo
함수에서 이와 같은 새 행을 생성하려면 어떻게 해야 합니까? 나는 그들이 ;
이 문제를 고칠 것이라고 생각했지만 분명히 그렇지 않았습니다.
예를 들어 이것은 내가 원하는 것을 반환합니다.
variable=$(stringen 18)
echo $variable
울려 퍼지는 것입니까?
답변1
, cat
또는 개행을 추가 tr
하지 않습니다 head
( urandom
작동하지만 무작위이므로 신뢰하지 않습니다). 새 줄을 수동으로 삽입하고 함수 끝에 printf '\n'
또는 를 추가 해야 합니다 echo
.
그런데 일부 쉘에서는 zsh
이와 같은 상황을 방지하기 위해 이를 추가합니다.
답변2
함수가 개행 문자를 인쇄하는지 여부는 전혀 중요하지 않습니다.명령 대체있는 경우 삭제됩니다.
Bash는 명령을 실행하고 명령 대체를 명령의 표준 출력으로 대체하여 확장을 수행합니다.모든 후행 줄 바꿈 제거. (강조는 내 것)
testfunc() { echo hello; } # a newline is printed
output=$(testfunc) # $output does NOT contain a trailing newline
echo "$output" # echo adds a newline
printf "%s" "$output" # no newline
답변3
IMHO 가능해요부분적으로그러나 echo
문제의 또 다른 부분은 영향력입니다. 따라서 배포판이 최근에 출시된 경우 이상적으로는암소 비슷한 일종의 영양왜냐하면 아래에서 볼 수 있듯이 GNU가 "수정"을 적용해야 하는 위치 를 알려주는 것에 대해 불평하는 tr
구문에 명백한 문제가 있기 때문입니다 .tr
원래:
$ stringen() { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }
$ stringen 18
tr: range-endpoints of 'a-Z' are in reverse collating sequence order
아야! 여기에 문제를 해결한 대체 버전이 있습니다(적어도내 거GNU 배포가 tr
성공했습니다):
"안정적인":
$ stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Za-z0-9' | head -c "$1" ; }
$ stringen 18
V068BrYGKIICyLI4QB
$
결론: 집합과 범위를 혼합하지 않는 것이 가장 좋지만 tr
, 집합/범위를 결합할 때는 항상 큰 글자 대비 큰 글자, 소문자 대비 소문자를 유지해야 합니다.
하지만: GNU가 아닌 경우 tr
개행 누락 문제가 여전히 존재할 수 있습니다. 그러나 GNU를 사용하면 수정된 줄에 멋진 개행 트릭이 필요하지 않습니다.
답변4
이 출력을 저장하는 데 변수가 필요하지 않습니다. 직접적이고 간단한 echo
출력:
echo "$(stringen 18)"