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에서 실행되거나 복사할 권한이 없는 사용자에 의해 실행되는 경우 스크립트 자체를 복사하는 것을 방지합니다.