2010-12-10 9 views
20

In bash posso creare uno script con un qui-doc in questo modo come da questo sito: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPTGenera lo script in bash e salvarlo in posizione richiedono 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 

Se il mio $OUTFILE è una directory che richiede sudo privilegi dove inserisco il comando sudo o cos'altro posso fare per farlo funzionare?

+0

Suppongo che una soluzione è quella di generare il file in una cartella temporanea e quindi spostarlo con sudo nella posizione corretta. È il modo più elegante per farlo? –

risposta

14

Non si può mettere sudo prima di cat perché> $ OUTFILE tenta di aprire $ OUTFILE nel processo di shell corrente, che non viene eseguito come root. È necessario che l'apertura di tale file avvenga in un sottoprocesso sudo-edito.

Ecco un modo per farlo:

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

Questo funziona per il mio esempio di lavoro minimo ma non per il mio script effettivo. Ho reso il mio esempio di lavoro minimo sufficientemente più complicato, puoi aiutarmi con il nuovo script? –

+0

@D W: Avevo annullato la quotazione della tua parola qui, che potrebbe essere stata la fonte del tuo problema. Mi dispiace per quello Prova a citarlo nuovamente, come mostrato nella mia risposta aggiornata. –

+0

@D W: hai provato la risposta aggiornata? Funziona con il codice più recente nella tua domanda. Sono appena andato e aggiornato di nuovo per includere effettivamente il codice dalla tua domanda. –

44

Ecco come lo farei:

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

uso intelligente di tee, thx – javadba

+0

Come si utilizza questo metodo per aggiungere a un file esistente? – MountainX

+5

@MountainX: 'tee -a' si aggiunge al file. –