ファイルの最後に「>>」以外の行を追加する別の簡単な方法はありますか?


21

最近、短い文章をtree_holeファイルにエコーしています。

私はecho 'something' >> tree_holeこの仕事をしていました。

しかし、私はこれを頻繁に行ったため、の>代わりにを間違って入力するとどうなるか常に心配していました>>

そこで、bashrcで独自のグローバルbash funcを作成しました。

function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th

しかし、ファイルの最後に行を追加する別の簡単な方法があるかどうか疑問に思っています。他の機会に頻繁に使用する必要があるかもしれないからです。

何かありますか?


9
>を入力するたびに回避策を使用していることを忘れないでください。エイリアスrm="rm -i"を作成し、他の環境でrm *確認の質問を待って書き込みました。あなたは危険な習慣を学んでいます!
ウォルターA

9
@WalterA er、彼の「回避策」は彼に>>の代わりに>をタイプさせません、彼は単に「th some_sentence」を実行します。エイリアスが定義されていない場合は何もしません。
Random832

1
@ Ranom832は、彼の次善策を修正します。警告は、noclobberのような「ソリューション」に対するものです。彼が通常のシェルでnoclobberのようなものを使うとき、彼は一時的なルートで何かを追加したいときに使うかもしれません。
ウォルターA

7
@ Random832&WalterA私は通常、これを見ても何も言わないが、たまにフレンドリーな通知が役に立つかもしれないと思った。Zenのユーザープロファイルにはあま​​り詳細がないため、彼の「回避策」が正しい形式であることを本当に知っているかどうかはわかりません。たぶんあなたは彼らの「回避策」またはOPの「回避策」を言うべきです。おそらく、あなたは個人的に禅を知って、あなたはそれゆえことを知っている彼が、その場合には、ノイズはご容赦ください、正しいです。大したことではありませんが、私がそれについて言及するのにそのフォームを使用した場合、私はそれをあまり高く評価しなかったことを知っているので、私はそれを言及します。
セラダ

1
@Zen、あなたは>>ではなく>を誤って入力することが心配だと書きました。Celadaの計画は、お客様の環境のリスクを取り除くものであり、お客様に適したソリューションです。隣人(noclobberを持っていないかkshを使用している人)を助けているときに、1つまたは2つの文字に注意を失った場合、誤って彼のファイルの1つを上書きする可能性があります。自分の環境でnoclobber警告を受け取るたびに、神またはCeladaに感謝し、自分に言います:ああ、慎重にしてください!、頭を振って2秒待ちます。
ウォルターA

回答:


47

シェルのnoclobberオプションを設定します。

bash-3.2$ set -o noclobber
bash-3.2$ echo hello >foo
bash-3.2$ echo hello >foo
bash: foo: cannot overwrite existing file
bash-3.2$ 

3
これが決定的な答えです。を使用して強制的にファイルを上書きできることに注意してください>|zshデフォルトでこの動作を有効にします。
オリオン

1
@orion zshでどのように有効化/無効化しますか?明示的に無効にしたことは覚えていませんが、zshでは上書きは正常に機能します。
ムル

2
それはだsetopt noclobbersetopt clobber。正確に「デフォルト」ではないようで、ディストリビューションに同梱されている設定ファイルに依存します。
オリオン

@muruはset [+-]C現代のシェルで動作するはずです
-mikeserv

3
set +o noclobberbashの@Zen またはset +C
ルスラン

7

あなたが心配している場合は、あなたのファイルがによって損傷される>オペレータあなただけ追加するファイルの属性を変更することができます
はext2 / ext3ファイル/ ext4のファイルシステム:chattr +a file.txt
ではXFSのファイルシステムを:echo chattr +a | xfs_io file.txt

関数が必要な場合は、既に自分用に関数を作成しました(出力のログ記録のためにサービスファイルで使用しました)。目的に応じて変更できます。

# This function redirect logs to file or terminal or both!
#@ USAGE: log option data
# To the file     -f file
# To the terminal -t
function log(){
        read -r data       # Read data from pipe line

        [[ -z ${indata} ]] && return 1    # Return 1 if data is null

        # Log to /var/log/messages
        logger -i -t SOFTWARE ${data}

        # While loop for traveling on the arguments
        while [[ ! -z "$*" ]]; do
                case "$1" in
                        -t)
                                # Writting data to the terminal
                                printf "%s\n" "${data}"
                                ;;
                        -f) 
                                # Writting (appending) data to given log file address
                                fileadd=$2
                                printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd}
                                ;;
                        *)
                                ;;
                esac
                shift           # Shifting arguments
        done
}

2
このスクリプトにはいくつかの問題があります。1)一般$に、グロビング、単語分割、および関連する空白の問題を防ぐために、パラメーターの展開(で始まるもの)を二重引用符で囲む必要があります。オンラインShellCheckアプリは、この問題やbashスクリプトのさまざまな問題をキャッチできます。関連するメモで"$@"より安全です$*
PM 2Ring

3
2)通常、入力内のバックスラッシュが次の文字をエスケープしないようにreadする-rオプションを指定してコマンドを呼び出す必要があります。3)システム変数にはALL UPPER CASEが使用されるため、bashスクリプトではスクリプト変数名に小文字を使用するのが一般的です。したがって、独自の変数に大文字を使用すると、コードを読む人を混乱させ、スクリプトで後で使用したいシステム変数を誤って上書きしてしまう可能性があります。また、スクリプトのソースを指定すると、後続のコマンドの変数が上書きされます。
PM 2Ring

3
4)echo固定文字列の印刷には便利ですが、特にGNUシステムでは、任意のデータで予期しないことを実行できます。それはですはるかに使用する方が安全printf。詳細については、unix.stackexchange.com / questions / 65803 /…、特にStéphaneChazelasの回答を参照してください。
PM 2Ring

3
@PM 2Ring、今日私はあなたから多くのことを学びました。どうもありがとう。できるだけ早く修正します。
Sepahrad Salour

1
いい仕事だ、セパラード!
PM 2Ring

3

tee追加オプションとともに使用します。

foo | tee -a some-file
# or
tee -a some-file <<EOF
blah blah
EOF
# or 
tee -a some-file <<<"blah blah"

5
良い考え、+ 1ですが、OPが>キャラクターを忘れることを心配しているなら、彼らは-aオプションを忘れることを心配しているかもしれないと思います!
セラダ

@Celadaそうだと思います(ただし、オプションを忘れるよりも、繰り返されるキーストロークのセットで1つのキーストロークが欠落することによる誤植が発生する可能性が高いです)。
ムル

0

上書きするためにファイルを開くことができる多くのプログラムは、たとえばgnu ddなど、追加するためにそれらを開くことができます。

dd conv=notrunc oflag=append of=file

stdinまたはif= パラメータaddで指定されたファイルを読み取って2>/dev/null、バイトカウントを抑制することができます。


3
それは...その答えとして、それを投稿する前に、あなたのコードをテストするために™をお勧めします
PM 2Ring

1
推薦ddは悪い考えです。dd確実にその出力にその入力を書き込みませんそのうちの一つは、通常のファイルやブロックデバイスではないとき、ない
ジル「SO-停止されて悪」

@gilles、カウントが指定されていない場合、ddはcatと同じように、利用可能なすべてのデータをコピーします。
-Jasen

-1

私はsed(バックアップコピーでも-後の拡張を参照してください-i)を使用したい:

sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole

なぜ私は驚かないのですか...あなたはセッドマニアです、コスタス。:)(これはところで、褒め言葉だ)
PM 2Ring

@ PM2Ringはい、私は非常に危険です!:P
コスタ

もちろん機能する方法は、ファイルのコピーを作成し、新しいテキストを最後に追加してから、元のファイルを削除して、コピーの名前を元の名前に変更することです。これは、(1)ディレクトリへの書き込みアクセス権がない場合は機能せず、(2)リンクを切断し、(3)ファイルが大きい場合はリソースを消費します。あなたが「危険な」という言葉育てたことはおかしいです
G-マンは「元に戻すモニカ言う

-1

他の方法でいつでもファイルを検索できます...

seq 10000000 >f
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
wc -l f; tail f

...奇妙な外観のシーケンスが印刷されます:

10000000
10000001
10000002
10000003
10000004
10000005 f
9999996
9999997
9999998
9999999
10000000
new line!
new line!
new line!
new line!
new line!

しかし、それはちょっとばかげています。

より便利な例は次のようになります。

 apnd() if    shift
        then  wc -l  >&2
              printf "$@"
        fi    <>"$1" >&0

次のように呼び出すことができます。

 apnd /path/to/file          \
      "${printf_fmt_string}" \
       arbitrary list of strings

そして、追加アクションが実行fileされるstderr直前にの行数が書き込まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.