2016-09-02 12 views
0

から名前のファイルを作成し、私は必要に応じてsudoを使用する方法でファイルに物事を追加したいが、ここで私がこれまで持っているものです。バッシュ:関数のパラメータ

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 

しかしライン1は動作しません。出力は次のようになります~/.wot: No such file or directory もちろんファイルは存在せず、次の行は正しく動作しません。

どうすれば修正できますか?ありがとうございました !もちろん、他のコメントやアプローチも歓迎します!

+0

が悪い形である - いずれかが実装エコー文字列の[POSIX spec](http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html)に従ってください。( '-n'は必須ではありませんが、許可されていますが、 '-e'を扱う方法は、2つの文字' -e'をstdoutに書き出すことです)。代わりに 'printf'を使うことを考えてください。 (そうです、bashの 'echo'はデフォルトでは非準拠ですが、' posix'と 'xpg_echo'フラグが両方とも標準の動作として設定されている場合は*常に*非準拠ではありません)。 –

+0

ところで、 'curl -sSL" $ 1 "|もしあなたが '$ 2'で指定されたファイルに書き込む権限をエスカレートする必要があれば、' sudo tee - "$ 2">/dev/null'を実行する必要があります。余分な特権が必要な場合は、その出力ファイルを開くことです。 –

+0

また、たくさんの場所で引用符を紛失したり誤解したりしています。そのうちのいくつかは積極的に危険です。 'sudo bash -c" curl -sSL $ 1 >> $ 2 "' $ 1'に '$(rm -rf $ HOME) 'が含まれていれば、非常に悪いことになるでしょう。あなたがcurlの特権をエスカレートしようとしていたなら、 'sudo bash -c 'curl -sSL" $ 1 ">>" $ 2 "' _" $ @ "'でなければなりません。そのようなシェルエスケープを避けるために、引数をout-of-bandで指定する定数(一重引用符で囲まれた)文字列としての「sudo」特権。 –

答えて

1
file=~/.wot 

又は

file="$HOME/.wot" 

引用はチルダ膨張を防ぎます。ところで


- あなたは先のファイルへの出力を放出する必要があるすべてのコマンドの前にsudoを左官よりも良い行うことができます。考えてみましょう:

確か、一口だが、あなたはそれを持っていたら、あなたは任意の関数ラップするために使用することができ
# 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" 
} 

: `、BTWエコー-e`を

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

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

魅力的な作品!ありがとう、重複して申し訳ありません –

+0

喜んで助けてください!そしてその質問に関する私のコメントを見てください。 –