2010-12-10 11 views
20

W bash mogę utworzyć skrypt z tu-doc jak tak jak na tej stronie: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPTwygenerować skrypt w bash i zapisać go w miejscu wymagającym 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 

Jeśli moja $OUTFILE jest katalogiem wymagające sudo przywilejów gdzie umieścić polecenie sudo lub co jeszcze mogę zrobić, aby działało?

+0

Przypuszczam jednym rozwiązaniem jest, aby wygenerować plik do tymczasowej lokalizacji, a następnie przenieść go z sudo do właściwej lokalizacji. Czy to jest najbardziej elegancki sposób na zrobienie tego? –

Odpowiedz

14

Nie możesz po prostu umieścić sudo przed kotem, ponieważ> $ OUTFILE próbuje otworzyć $ OUTFILE w bieżącym procesie powłoki, który nie działa jako root. Potrzebujesz otwarcia tego pliku, aby zdarzyło się w sudoku-pod-procesie.

Oto jeden ze sposobów, aby to zrobić:

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

To działa dla mojego minimalnego przykładu roboczego, ale nie dla mojego aktualnego skryptu. Mój minimalny przykład roboczy wystarczająco się komplikuje, czy możesz mi pomóc w nowym skrypcie? –

+0

@D W: Nie wypytałem twojego słowa, które mogło być źródłem twoich problemów. Przepraszam za to. Spróbuj ponownie ją zacytować, jak pokazano w mojej zaktualizowanej odpowiedzi. –

+0

@D W: czy wypróbowałeś zaktualizowaną odpowiedź? Działa z nowszym kodem w pytaniu. Właśnie poszedłem i zaktualizowałem go ponownie, aby rzeczywiście uwzględnić kod z twojego pytania. –

44

To w jaki sposób to zrobić:

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

sprytne użycie tee, thx – javadba

+0

Jak użyć tej metody do dołączenia do istniejącego pliku? – MountainX

+5

@MountainX: 'tee -a' dołącza do pliku. –