Wie bringe ich ein Bash-Skript dazu, sich selbst in eine neue Datei zu echoen?

Wie bringe ich ein Bash-Skript dazu, sich selbst in eine neue Datei zu echoen?

Ich habe ein Bash-Skript. Ich möchte, dass sich dieses Skript in /usr/local/bin neu erstellt, ohne dass hierfür eine zusätzliche Datei erforderlich ist.

bash_a.sh:

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

Ich dachte an so etwas in der Art:

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

Oder dieses:

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

Antwort1

Probieren Sie für Ihren Vorschlag den Trick mit einfachen und doppelten Anführungszeichen aus:

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

In einfachen Anführungszeichen behandelt die Shell die Daten unverändert. In doppelten Anführungszeichen erweitert die Shell $variables, Backslashs, Backticks und alle möglichen Dinge. Verwenden Sie daher grundsätzlich, wenn möglich, einfache Anführungszeichen.

Innerhalb einfacher Anführungszeichen können Sie jedoch nicht ohne weiteres einfache Anführungszeichen verwenden, wohingegen dies problemlos möglich ist.

In doppelten AnführungszeichendürfenVerwenden Sie doppelte Anführungszeichen, müssen Sie ihnen jedoch mit einem Backslash entkommen lassen. Es wird also echo "abc\"def\""gedruckt abc"def".

Innerhalb von Anführungszeichen können Sie auch einfache Anführungszeichen verwenden, diese verhindern jedoch nicht die gesamte Erweiterung. Daher echo "abc'def'"wird gedruckt abc'def'.

Sie können einfache Anführungszeichen innerhalb einfacher Anführungszeichen verwenden, müssen aber Folgendes eingeben: „ echo 'abc'\''def'\''hij'which prints“ (das gibt aus) abc'def'hij.

Antwort2

Mit der Antwort inKann ein Bash-Skript erkennen, in welchem ​​Verzeichnis es gespeichert ist?:

#!/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

Dadurch ifwird verhindert, dass das Skript versucht, sich selbst zu kopieren, wenn es von /usr/local/bin ausgeführt wird oder von einem Benutzer ausgeführt wird, der keine Kopierberechtigung dorthin hat.

verwandte Informationen