developer tip

고양이 방법 <

copycodes 2020. 10. 21. 08:14
반응형

고양이 방법 <> 코드가 포함 된 파일?


다음을 사용하여 코드를 파일로 인쇄하고 싶습니다 cat <<EOF >>.

cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

하지만 파일 출력을 확인하면 다음과 같이 표시됩니다.

!/bin/bash
curr=1634
if [  -lt 4477 ]; then
   curr=406;
   echo   > /sys/class/backlight/intel_backlight/brightness;
fi

나는 작은 따옴표를 넣어 보았지만 출력에는 작은 따옴표도 포함됩니다. 이 문제를 어떻게 피할 수 있습니까?


최소한의 변경 만 필요합니다. 여기서 문서 구분 기호를 작은 따옴표로 묶으십시오 <<.

cat <<'EOF' >> brightup.sh

또는 동등하게 백 슬래시 이스케이프 :

cat <<\EOF >>brightup.sh

인용하지 않으면 here 문서는 변수 대체를 거치고 백틱이 평가됩니다.

전부가 아닌 일부 값을 확장해야하는 경우 방지하려는 값을 개별적으로 이스케이프해야합니다.

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

생산할 것이다

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

@fedorqui가 제안한대로 다음은 관련 섹션입니다 man bash.

여기 문서

이러한 유형의 재 지정은 구분 기호 만 포함 된 행 (후행 공백 없음)이 표시 될 때까지 현재 소스에서 입력을 읽도록 쉘에 지시합니다. 그 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.

여기 문서의 형식은 다음과 같습니다.

      <<[-]word
              here-document
      delimiter

매개 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어에서 수행되지 않습니다. 단어의 문자가 따옴표로 묶인 경우 구분 기호는 단어에서 따옴표를 제거한 결과이며 여기 문서의 행은 확장되지 않습니다. 단어가 인용되지 않으면 here-document의 모든 행은 매개 변수 확장, 명령 대체 및 산술 확장의 대상이 됩니다. 후자의 경우 문자 시퀀스 \는 무시되며 \, $ 및`문자를 인용하는 데 \를 사용해야합니다.


또는 EOF 마커를 사용하여 확장이 수행되지 않도록 초기 마커를 인용해야합니다.

#-----v---v------
cat <<'EOF' >> brightup.sh
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

IHTH


이것은 작동해야합니다. 방금 테스트했고 예상대로 작동했습니다. 확장, 대체 또는 수행 한 작업이 없습니다.

cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want. 

다음을 사용하는 것도 작동합니다.

cat <<< ' > file
 ... code ...'

또한, << EOF대체 및 변수 확장 등과 같은 heredocs를 사용할 때 발생한다는 점에 주목할 가치가 있습니다. 그래서 다음과 같이합니다.

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

항상 변수 $HOME$PWD. 따라서 홈 디렉토리가 /home/foobar이고 현재 경로가 /home/foobar/bin이면 file다음과 같습니다.

cd "/home/foobar"
echo "/home/foobar/bin"

예상 대신 :

cd "$HOME"
echo "$PWD"

참고 URL : https://stackoverflow.com/questions/22697688/how-to-cat-eof-a-file-containing-code

반응형