2010-12-10 11 views
20

In bash ich wie ein Skript mit einem hier-doc erstellen kann, um per dieser Seite: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPTSkript in Bash generiert und an Ort speichern erfordern sudo

(
cat <<'EOF' 
#!/bin/bash 
#? [ ]/\ = + < > : ; " , * | 
#/ ? < > \ : * | ” 
#Filename="z:"${$winFn//\//\\} 
echo "This is a generated shell script." 
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"' 
$App 
EOF 
) > $OUTFILE 

Wenn mein $OUTFILE ein Verzeichnis sudo ist erforderlich Privilegien, wo gebe ich den sudo Befehl oder was kann ich noch tun, damit es funktioniert?

+0

Ich nehme eine Lösung ist, die Datei in einem temporären Speicherort zu erzeugen und dann bewegen sich mit Sudo zum richtigen Ort. Ist das der eleganteste Weg? –

Antwort

14

Sie können nicht einfach sudo vor cat setzen, weil> $ OUTFILE versucht, $ OUTFILE im aktuellen Shell-Prozess zu öffnen, der nicht als root läuft. Sie müssen das Öffnen dieser Datei in einem Sudo-Ed-Unterprozess ausführen.

Hier ist eine Art und Weise zu tun, dass:

sudo bash -c "cat >$OUTFILE" <<'EOF' 
#!/bin/bash 
#? [ ]/\ = + < > : ; " , * | 
#/ ? < > \ : * | ” 
#Filename="z:"${$winFn//\//\\} 
echo "This is a generated shell script." 
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"' 
$App 
EOF 
+0

Dies funktioniert für mein minimales funktionierendes Beispiel, aber nicht für mein tatsächliches Skript. Ich habe mein minimales Arbeitsbeispiel ausreichend komplizierter gemacht, kannst du mir mit dem neuen Skript helfen? –

+0

@D W: Ich hätte dein hier stehendes Wort nicht erwähnt, was die Quelle deiner Probleme sein könnte. Das tut mir leid. Versuchen Sie es erneut zu zitieren, wie in meiner aktualisierten Antwort gezeigt. –

+0

@D W: Haben Sie die aktualisierte Antwort versucht? Es funktioniert mit dem neueren Code in Ihrer Frage. Ich bin gerade gegangen und habe es noch einmal aktualisiert, um den Code aus Ihrer Frage zu übernehmen. –

44

Dies ist, wie ich es tun würde:

sudo tee "$OUTFILE" > /dev/null <<'EOF' 
foo 
bar 
EOF 
+0

clevere Verwendung von tee, thx – javadba

+0

Wie verwenden Sie diese Methode, um an eine vorhandene Datei anzuhängen? – MountainX

+5

@MountainX: 'tee -a' hängt an die Datei an. –