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'これにより、 が出力されます。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 から実行されている場合、またはそこにコピーする権限を持たないユーザーによって実行されている場合に、スクリプトが自分自身をコピーしようとするのを防ぎます。

関連情報