2016-09-02 1 views
0

ich die Dinge in eine Datei in einer Weise angehängt werden soll, die sudo bei Bedarf verwendet, hier ist, was ich habe, so weit:Bash: create-Datei mit dem Namen von Funktionsparameter

getAndAppend(){ 
    # create file if doesn't exist, with right permission 
    [[ ! -s $2 ]] && touch "$2" || [[ ! -s $2 ]] && sudo touch "$2" # line 1 
    # append stuff to it 
    [[ -w $2 ]] && curl -sSL $1 >> $2 || sudo bash -c "curl -sSL $1 >> $2" 
    [[ -w $2 ]] && echo -e "\n" >> $2 || sudo bash -c "echo -e \"\n\"" 
} 

file="~/.wot" 
url="https://raw.github.com/n-marshall/system-setup/master/common/configs/.gitignore_global" 

getAndAppend $url $file 

jedoch Linie 1 nicht funktioniert dass die Ausgabe etwa so aussieht wie ~/.wot: No such file or directory Dann wird die Datei natürlich nicht existieren und die folgenden Zeilen können nicht richtig funktionieren.

Wie könnte ich das beheben? Vielen Dank ! Jeder andere Kommentar oder Vorgehensweise ist natürlich willkommen!

+0

BTW, 'Echo -e' ist schlechte Form - jede implementiert Echo Folgende [die POSIX-Spezifikation] (http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html) zu dem Buchstaben wird es nicht unterstützen ('-n' ist nicht erforderlich, aber erlaubt, aber das einzige konforme Der Umgang mit '-e' besteht darin, die zwei Buchstaben' -e' in stdout zu schreiben. Verwenden Sie stattdessen "printf". (Ja, bash's 'echo' ist standardmäßig nicht konform, aber es ist nicht * immer * nicht konform - wenn sowohl' posix' als auch 'xpg_echo' Flags gesetzt sind, verhält es sich wie das Standardmandat). –

+0

BTW, betrachte 'curl -sSL" $ 1 "| sudo tee - "$ 2">/dev/null' wenn Sie Privilegien für das Schreiben in die Datei namens '$ 2' eskalieren müssen - es ist nicht nötig' curl' zu starten (was schließlich Netzwerk IO und hat eine relativ große Angriffsfläche) als root, wenn Sie nur die zusätzlichen Rechte für das Öffnen der Ausgabedatei benötigen. –

+0

Auch Sie vermissen oder missbrauchen Zitate in einer ganzen Reihe von Orten, und einige davon sind aktiv gefährlich. 'sudo bash -c" curl -sSL $ 1 >> $ 2 "' wird sehr schlimme Dinge tun, wenn '$ 1' '' $ (rm -rf $ HOME) ''enthält. Wenn Sie Privilegien für curl eskalieren würden, müsste das "sudo bash -c" curl -sSL "$ 1" >> "$ 2" '_ "$ @" 'sein - welches das Skript mit' ausführt sudo'-Privilegien als konstante (single-quoted) Zeichenkette mit ihren Out-of-Band-Argumenten - um solche Shell-Escapes zu vermeiden. –

Antwort

1
file=~/.wot 

oder

file="$HOME/.wot" 

Zitate verhindern Tilde-Erweiterung.


By the way - Sie können es besser machen als sudo vor jedem Befehl Verputzen, die Ausgabe an die Zieldatei emittieren muss. Bedenken Sie:

# Note that this requires bash 4.1 for automatic FD allocation 
# otherwise, modify it to hardcode a FD number for our backup. 
withOutputToFile() { 
    local orig_stdout retval 
    exec {orig_stdout}>&1 || return 

    if ! exec >"$1"; then 
    if ! exec > >(sudo tee -- "$1"); then 
     exec >&$orig_stdout 
     return 1 
    fi 
    fi 

    shift 
    "[email protected]"; retval=$? 
    exec >&$orig_stdout {orig_stdout}>&- 
    return "$retval" 
} 

Das ist ein Mund voll ist, sicher, aber wenn Sie es haben Sie können es verwenden, jede Funktion zu wickeln:

getAndAppend() { 
    curl "$1" && printf '\n' 
} 

withOutputToFile /path/to/your/file getAndAppend http://example.com/ 
+0

Funktioniert wie ein Charme! Danke und Entschuldigung für das Duplikat –

+0

Gut zu helfen! Und bitte sehen Sie meine Kommentare zu der Frage. –

Verwandte Themen