source

변수의 값을 명령어의 표준 입력에 전달하려면 어떻게 해야 합니까?

ittop 2023. 4. 12. 23:00
반응형

변수의 값을 명령어의 표준 입력에 전달하려면 어떻게 해야 합니까?

어느 정도 안전해야 하는 셸 스크립트를 작성하고 있습니다.즉, 명령어 파라미터에 의해 안전한 데이터를 전달하지 않고, 가능하면 임시 파일을 사용하지 않는 것이 좋습니다.명령어의 표준 입력에 변수를 전달하려면 어떻게 해야 합니까?

또는 가능하지 않은 경우 이러한 작업에 임시 파일을 올바르게 사용하려면 어떻게 해야 합니까?

Bash에서 표준 입력에 값을 전달하는 방법은 다음과 같습니다.

your-command <<< "$your_variable"

항상 변수 표현식 주위에 따옴표를 넣어야 합니다.

이 방법은 아마 에서만 동작할 수 있으므로 주의해 주십시오.bash에서는 동작하지 않습니다.sh.

심플하지만 오류 발생 가능성이 높다: 사용echo

다음과 같은 간단한 방법으로 효과를 볼 수 있습니다.

echo "$blah" | my_cmd

이것은, 다음의 경우에 올바르게 동작하지 않는 것에 주의해 주세요.$blah포함하다-n,-e,-E또는 백슬래시가 포함되어 있는 경우(복사본)echo가 없어도 문자 그대로의 백슬래시를 유지하다-e디폴트로는 에스케이프 시퀀스로 처리되며,이러한 문자가 없어도 대응하는 문자로 대체됩니다.-e(옵션의 XSI 확장이 유효하게 되어 있는 경우).

보다 고도의 어프로치:printf

printf '%s\n' "$blah" | my_cmd

이것은 위의 단점은 없습니다.가능한 모든 C 문자열(NUL을 포함하지 않는 문자열)은 변경되지 않고 인쇄됩니다.

주의:echo "$var" | command동작이란, 표준 입력이 에코 된 회선으로 한정되는 것을 의미합니다.단말기도 접속하고 싶은 경우는, 보다 세련되게 할 필요가 있습니다.

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

즉, 첫 번째 행은 다음과 같은 내용이 됩니다.$var하지만 나머지는 그 곳에서 올 것이다.cat표준 입력을 읽습니다.명령어가 너무 화려하지 않은 경우(명령줄 편집을 켜거나 다음과 같이 실행)vim그러면 됩니다.그렇지 않으면, 당신은 정말 화려해질 필요가 있다 - 내 생각에expect또는 그 파생상품 중 하나가 적절할 수 있다.

명령줄 표기는 실질적으로 동일하지만 두 번째 세미콜론은 괄호에는 없지만 괄호에는 필요합니다.

(cat <<END
$passwd
END
) | command

cat는 실제로 필요하지 않지만 코드를 보다 효율적으로 구조화할 수 있으며 괄호 안의 더 많은 명령어를 명령어 입력으로 사용할 수 있습니다.

이 견고하고 휴대하기 쉬운 방법은 이미 댓글에 등장했습니다.그것은 단독 답변이어야 한다.

printf '%s' "$var" | my_cmd

또는

printf '%s\n' "$var" | my_cmd

주의:

  • echo, 이유는 다음과 같습니다.왜 더 좋은가?
  • printf "$var", 인수는 '어리다'와 같은 여러 가지 입니다.%s ★★★★★★★★★★★★★★★★★」\n해석됩니다.변수를 올바르게 전달하려면 형식을 해석해서는 안 됩니다.
  • 일반적으로 변수는 후행 새 줄을 포함하지 않습니다.의 명령어(with 전 the the the 。%s)는 변수를 그대로 전달합니다.그러나 텍스트와 함께 작동하는 도구는 불완전한 줄을 무시하거나 불평할 수 있습니다(텍스트 파일이 새 줄로 끝나는 이유 참조).따라서 후자의 명령어가 필요할 수 있습니다.%s\n을 사용하다다음 중 하나:

    • Bash ('Bash')<<<"$var" my_cmd는 줄 바꿈을 .)
    • 이 비어 있지 . stdin은 stdin이 아닙니다.my_cmd변수가 비어 있거나 정의되어 있지 않은 경우에도 마찬가지입니다.

마틴의 답변은 마음에 들었지만, 변수가 무엇이냐에 따라 약간의 문제가 있습니다.이것.

your-command <<< """$your_variable"""

에는 '있다'가 포함되어 것이 좋습니다." ★★★★★★★★★★★★★★★★★」!.

Martin의 답변에 따르면 Here Strings라고 하는 Bash 기능이 있습니다(이 기능은 보다 광범위하게 지원되는 Here Documents 기능의 변형입니다).

3.6.7 여기서의 문자열

이 문서의 변형 형식은 다음과 같습니다.

<<< word

워드가 확장되어 표준 입력의 명령어로 제공됩니다.

Here Strings는 Bash 전용이므로 휴대성을 향상시키려면 PoltoS의 답변에 따라 원본 Here Documents 기능을 사용하는 것이 좋습니다.

( cat <<EOF
$variable
EOF
) | cmd

또는 위의 간단한 변형:

(cmd <<EOF
$variable
EOF
)

you you you you you you you you 、 you 、 you 、 you you 、 。( ★★★★★★★★★★★★★★★★★」)다른 명령어로 리다이렉트 하는 경우는 제외합니다.

이것을 시험해 보세요.

echo "$variable" | command

만약 당신이 복제로 여기 왔다면, 당신은 아마도 다음과 같은 것을 하려고 했던 초보자일 것이다.

"$variable" >file

또는

"$variable" | wc -l

그런 걸 말한 게 분명해

echo "$variable" >file
echo "$variable" | wc -l

(진짜 초보자도 인용구를 잊어버립니다.적어도 인용문을 이해할 때까지 생략할 특별한 이유가 없는 한 인용문을 사용합니다.)

언급URL : https://stackoverflow.com/questions/4775548/how-to-pass-the-value-of-a-variable-to-the-standard-input-of-a-command

반응형