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 if
wird 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.