내가 아는 한, bash에서 권장되는 패턴은 항상 쉘 변수를 인용하는 것입니다.
예 "$VAR"
를 들어 $VAR
.
대신 따옴표가 해석될 변수에 제공하는 것과 동일한 안전성을 어떻게 얻을 수 있습니까?떨어져서?
예를 들어 다음과 같습니다.
ssh server.com<<CODE
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
코드가 작동하려면 $COUNT
및 를 이스케이프해야 합니다 $TARGET
.
그러나 이 특정 사례에 대해 "$COUNT" 또는 "$TARGET"이 제공하는 것과 동일한 보안을 어떻게 달성할 수 있습니까?
고쳐 쓰다
문제가 있는 부분만 붙여넣었습니다.
변수가 구분된 문서 외부에 정의된 다른 줄이 있으므로 <<'CODE'
.
더 완전한 예:
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo $SOME_VALUE > test_file.txt # <--- does not work if I use <<'CODE'
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
답변1
이 문서에서는 큰따옴표가 유지되는 것 같습니다. 예를 들어 다음 명령을 고려해보세요.
cat <<HEREDOC
"this will still be quoted"
HEREDOC
그러면 출력으로 다음과 같은 인용 문자열이 생성됩니다.
"this will still be quoted:
따라서 평소와 같이 변수를 참조할 수 있어야 합니다.
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo "$SOME_VALUE" > test_file.txt
TARGET="target dir"
COUNT="\$( ls /foo/bar/\$TARGET | wc -l )"
echo "\$COUNT" > count.txt
CODE
명령 대체에서 변수를 참조하는 방법은 다음 게시물을 참조하세요.Bash에서 $(명령 대체) 내에서 인용
SOME_STRING
코드 조각을 그대로 복사했지만 대신 변수를 사용하려고 했던 것 같습니다 SOME_VALUE
. 다음은 로컬에서 실행하여 예상 결과를 얻을 수 있는 약간 수정된 코드 조각입니다.
mkdir -p "/foo/bar/target dir"
SOME_STRING="SOME VALUE"
ssh localhost<<CODE
echo "$SOME_STRING" > test_file.txt
TARGET="target dir"
COUNT="\$( ls "/foo/bar/\$TARGET" | wc -l )"
echo "\$COUNT" > count.txt
CODE
답변2
지난 며칠 동안 우리는 이 문제에 대해 많은 다른 의견을 가지고 있는 것 같습니다.
이 경우 여기에 있는 문서를 인용하세요.
ssh server.com <<'CODE'
TARGET="target dir"
COUNT= $( ls /foo/bar/$TARGET | wc -l )
echo $COUNT > count.txt
then
fi
CODE
'CODE'
(only와 반대) CODE
은 변수를 확장하거나 명령 대체를 수행하지 않고도 here 문서가 작성된 대로 유틸리티에 전달되도록 합니다.
여기 문서에도 구문 오류가 있습니다(주변 공백 =
및 불일치 if
) then
. 또한 평소와 같이 확장을 $COUNT
큰따옴표로 묶어야 합니다 $TARGET
.
ssh server.com <<'CODE'
TARGET="target dir"
COUNT=$( ls "/foo/bar/$TARGET" | wc -l )
printf '%s\n' "$COUNT" >count.txt
CODE
원격 디렉터리의 파일 수를 계산하려는 경우 다음 명령을 사용합니다.
ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \;' | wc -l
이렇게 하면 올바르게 계산됩니다 /path/to/dir
.
결과를 원격 파일에 쓰려면:
ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \; | wc -l >file'
원격으로 실행해야 하는 코드가 매우 복잡한 경우 서버에서 스크립트를 만들어 실행하는 것이 더 나을 수 있습니다. 스크립트에 전달해야 하는 변수는 명령줄에서 전달할 수 있습니다.
ssh server ./script.sh "$SOME_VARIABLE"
스크립트:
#!/bin/sh
VAR="$1"
# do stuff