새 파일에 자신을 반영하는 bash 스크립트를 얻으려면 어떻게 해야 합니까?

새 파일에 자신을 반영하는 bash 스크립트를 얻으려면 어떻게 해야 합니까?

bash 스크립트가 있습니다. 이 스크립트를 추가 파일 없이 /usr/local/bin에 다시 생성하고 싶습니다.

bash_a.sh:

ssh -t -t server-a.com "
cd /var/
irb
..etc
"

나는 다음과 같은 내용을 생각하고 있었습니다.

echo "
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
" > /usr/local/bin/bash_a.sh

아니면 이거:

cp bash_a.sh /usr/local/bin/bash_a.sh
ssh -t -t server-a.com "
cd /var/
irb
..etc
"

답변1

제안에 대해 작은따옴표 및 큰따옴표 트릭을 사용해 보세요.

echo '#!/bin/bash
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
' > /usr/local/bin/bash_a.sh
chmod a+rx /usr/local/bin/bash_a.sh

작은따옴표 안에는 쉘이 데이터를 변경하지 않고 처리합니다. 큰따옴표 안에 쉘은 $variables, 백슬래시, 백틱 및 모든 종류의 항목을 확장합니다. 따라서 일반적으로 가능한 경우 작은따옴표를 사용하십시오.

그러나 작은따옴표 안에는 작은따옴표를 쉽게 사용할 수 없지만, 작은따옴표 안에는 큰따옴표를 사용하는 것이 쉽습니다.

큰따옴표 안에는~할 수 있다큰따옴표를 사용하지만 백슬래시로 이스케이프해야 합니다. 그래서 echo "abc\"def\""인쇄합니다 abc"def".

큰따옴표 안에 작은따옴표도 사용할 수 있지만 확장이 모두 중단되는 것은 아닙니다. 그래서 echo "abc'def'"인쇄합니다 abc'def'.

작은따옴표 안에 작은따옴표를 사용할 수 있지만 다음을 입력해야 합니다. echo 'abc'\''def'\''hij'which prints abc'def'hij.

답변2

답변을 사용하여Bash 스크립트는 자신이 저장된 디렉터리를 알 수 있나요?:

#!/bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
BINDIR=/usr/local/bin
if [[ $DIR != $BINDIR && -w $BINDIR ]]
then
    cp "${BASH_SOURCE[0]}" $BINDIR
fi
... rest of script

이는 if스크립트가 /usr/local/bin에서 실행되거나 복사할 권한이 없는 사용자에 의해 실행되는 경우 스크립트 자체를 복사하는 것을 방지합니다.

관련 정보