トップページunix
1002コメント330KB

シェルスクリプト総合 その25©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2015/08/14(金) 23:42:01.51
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
05755702016/04/27(水) 19:13:45.99
なるほど、dummy 以降が -c で与えたコマンドへの引数になることを利用するわけですね。

ちなみに
screen -t "$1" -X screen bash
は冗長で
screen -t "$1" bash
でいいみたいでした。
0576名無しさん@お腹いっぱい。2016/04/27(水) 21:07:51.80
-c の次の次の引数からが $0 以降になるとは知らなかったなぁ。 勉強になったわ。
これは -c AAA BBB CCC DDD ... のとき、BBB 以降は実行されないけど BBB が $0 として、
CCC DDD ... が引数としてセットされた状態でプロセスが開始され、実際に実行される内容の
AAA 内に展開されずに渡された "$@" があるので CCC DDD ... が実行されるってことかな。

ちなみに cd の部分は 'cd "'"$PWD"'"; "$@"' の方がいいかな。
( パスに空白が入っていてもエラーにならないがダブルクォーテーションが入っていたらNGではあるが。 )
0577名無しさん@お腹いっぱい。2016/05/12(木) 21:13:45.79
コマンド応答が返ってくるまでの表示に文字を回転させてりしてみたくなった。
例えば、「*」がくるくると回っていたり・・・
0578名無しさん@お腹いっぱい。2016/05/13(金) 00:30:46.45
ええね
0579名無しさん@お腹いっぱい。2016/05/13(金) 19:21:12.15
>>577
難しい…どなたかヒントを
0580名無しさん@お腹いっぱい。2016/05/13(金) 20:19:09.81
>>579
なんだよ、すごい目算があって開発宣言したと期待してたのに

まず、文字回すのは無理
/|\-を同じ位置で順番に繰り返す出す程度

あと、コマンド実行中は通常シェルはwait状態で止まってしまうので
コマンドをバックグラウンドで起動してシェルを動かし続けるか
別プロセスを同時に起動してそいつに表示させる必要がある
どっちもコマンドラインで明示しなきゃならん
普通に起動して同じことをさせるにはシェルの改造くらいしか思いつかん
それともzshくらいになるとすごいモジュールがあったりするのだろうか
0581名無しさん@お腹いっぱい。2016/05/13(金) 20:43:34.11
OpenGLでぐりぐり回そうぜ
0582名無しさん@お腹いっぱい。2016/05/13(金) 20:57:15.29
bash 依存だけど、こんなんでどう

sleep 10 & {
tput civis
while kill -0 %- &>/dev/null
do
for c in {-,/,\|,\\}
do
printf '%c\r' $c
sleep 0.1
done
done
tput cvvis
}

途中で interrupt されるとカーソルが見えないままになるけど
0583名無しさん@お腹いっぱい。2016/05/14(土) 20:15:01.86
npm見れば解決しそう
05845342016/05/21(土) 22:04:30.88
>>535
お陰さまで最低限現場の記述ルールに則ったものは普通に作れるようになりましたm(_ _)m
0585名無しさん@お腹いっぱい。2016/05/23(月) 00:15:19.48
>>559
超遅レスだかインフラでも
そんな事言わないあり得ない偏見すごいな
>>558
が伝えたいニュアンスは分かるけど
端的に考え方を言い表したいがために
登場場面が根本的に違う2つの用語だけで
端的に伝えようとするセンスが酷い
それにそもそも元の話と何かズレてるし
後輩育成とかは絶対に任せられないタイプ
0586名無しさん@お腹いっぱい。2016/05/23(月) 08:05:15.40
ログファイルのローテート処理のお勧め教えれ
元ファイルをコピーしてヌルを上書きすると
一瞬ログの内容ロストするから
0587名無しさん@お腹いっぱい。2016/05/23(月) 08:55:28.11
>>586
ログを出す側で制御 (SIGHUPとかで出力ログファイルを開きなおす) してくれないとその問題は防げない。

mkfifo で FIFO ファイル作ってログローテーション用後続スクリプトに一旦渡す方法やパイプで後続スクリプトに
渡してローテーションする方法も考えられるけど、FIFO のバッファがいっぱいになるとメインプロセス側が処理
待ち(write がブロック)したり、後続スクリプトの異常終了で SIGPIPE 食らってメインプロセスが死んだりする
のでお勧めできないそうな。
0588名無しさん@お腹いっぱい。2016/05/23(月) 16:33:22.23
syslogdを kill -STOP; ... ; kill -CONT じゃダメなん?
0589名無しさん@お腹いっぱい。2016/05/23(月) 17:04:28.65
logrotateでええやろ
05905872016/05/23(月) 23:22:16.85
>>588
syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
なのでそれをやっても、リネームした古いファイルの方に書き続けてしまう。
例えば /var/log/messages に書き続けている状態でファイルを mv して messages.1 にしても、syslogdは
messages.1 の方に書き続ける。
kill -HUP するとファイルハンドルを閉じて /var/log/messages を開くので、ここでようやく messages 側に書き始めるわけ。
# STOP/CONT は意味がない。 logrotate では syslogd のログについては HUP しかしない。

>>589
logrotate の samba のログ設定には copytruncate って書いてあるでしょ?
つまり logrotate が >> 586 の言う「コピーしてファイルを空にする」処理をやっている。
samba は syslogd のような開きなおす処理をしてくれないからこの実装にせざるを得ない。
0591名無しさん@お腹いっぱい。2016/05/24(火) 04:38:11.44
>>590
kill -HUP に対応してないsyslogdだったら、という話だろ。

kill -STOP してからログファイルを別ファイルにcpして、元のログは > file でゼロにする。
それで -CONT すればいいという話。

>syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
というのは当然知ってるだろ。
0592名無しさん@お腹いっぱい。2016/05/24(火) 08:44:45.64
スレ違いになりつつあるが、便乗して質問。
STOP -> truncate -> CONT って安全?
TCP/UDPで待ち受けしているプログラムで syn やメッセージ取りこぼしたりとかしない?
fork する奴にも使える?
0593名無しさん@お腹いっぱい。2016/05/24(火) 09:37:37.23
>>592
TCPなら再送含めてOSがうまくやる
UDPだとバッファあふれたら消える
もともと消えるの前提だから再送はアプリの自己責任
forkしたら止まるのは当たり前だが指定したプロセスだけ
プロセスグループを指定したら該当するやつ全部
どの辺が疑問なのかむしろ知りたいわ
05945922016/05/24(火) 20:11:40.98
>>593
THX

> どの辺が疑問なのかむしろ知りたいわ
logrotate コマンドの copytruncate の欄に SIGSTOP すると良い、とは書かれていない
あたり、何か不都合があるんじゃないかと思うんだがどーよ?
0595名無しさん@お腹いっぱい。2016/05/24(火) 22:53:24.96
>>594
そいつとtcpもudpもforkも関係ないのになんで出てきた?
0596名無しさん@お腹いっぱい。2016/05/25(水) 08:40:27.70
tcp 再送は5分までいけるが、ロードバランサー/L7swの監視の場合にはファイルコピーしている
ちょっとした間にサービス停止として検知される可能性があるな。
0597名無しさん@お腹いっぱい。2016/05/25(水) 15:06:05.26
>>596
5分って、どこの標準か興味がある。
0598名無しさん@お腹いっぱい。2016/05/27(金) 20:10:08.30
>>586
普通は単純にリネームしてタッチする
0599名無しさん@お腹いっぱい。2016/05/28(土) 12:10:25.23
タッチして逮捕されたらリネームじゃないのか。
0600名無しさん@お腹いっぱい。2016/05/29(日) 01:58:44.16
つ 座布団
0601名無しさん@お腹いっぱい。2016/05/29(日) 20:46:35.04
ユニックスの入門本が一冊欲しいのですが何がいいでしょうか
特定のコマンドやシェルのノウハウとかではなく
多くの場面で通用する本当に基礎的な知識を学びたいと思っています
私自身はいずれシェルを書きたいと思っていますが
LS、CPコマンドなどの使い方を知りたいわけではないということです
0602名無しさん@お腹いっぱい。2016/05/29(日) 20:57:27.92
>>601
UNIXスーパーテキスト
ってまだ売ってたっけ?
0603名無しさん@お腹いっぱい。2016/05/29(日) 21:40:46.70
>>601
古い本だけど砂原秀樹さんほかの『プロフェショナルBSD』
UNIXのコマンドはこういうふうに使うという根本的なことの理解に役立つ
0604名無しさん@お腹いっぱい。2016/05/29(日) 22:26:33.91
スレチにも回答してあげるとは優しいやつばっかやな
0605名無しさん@お腹いっぱい。2016/05/29(日) 23:19:55.20
>>601
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

名著です。

これを挙げると古いとか文句を付ける馬鹿がいますが、無視してください。
0606名無しさん@お腹いっぱい。2016/05/29(日) 23:20:36.49
あげ
0607名無しさん@お腹いっぱい。2016/05/30(月) 00:14:11.32
>>604
お前の心が汚れているだけだ
0608名無しさん@お腹いっぱい。2016/05/30(月) 03:08:51.89
shell から emacs 起動して終了すると、
[1] Done emacs
って出るよな?これって何が出しているんだろう?出来れば止めたい。
0609名無しさん@お腹いっぱい。2016/05/30(月) 04:52:05.02
>>608
set +m しておくと出なくなるよ。(出してるのはシェル自身)
0610名無しさん@お腹いっぱい。2016/05/30(月) 09:25:10.53
vim7.4使ってますが、書き込み時、sh -n みたいな、構文・文法チェックを
する方法はないでしょうか?
vimプラグインのsyntasticも試してみたのですが、.vimrcの記述のせいか
うまく動いてないようで。

何か簡単でうまい方法ありましたら、ご紹介ください。
0611名無しさん@お腹いっぱい。2016/05/30(月) 10:19:27.79
>>609
どうもです。なるほどシェルが出しているのですか。
でも、なぜ emacs しか出ないのでしょう?

教えていただいた set +m 「ジョブ制御の無効」は bash のみでしょうか?
私は tcsh なのですが、tcsh でも同様の事は可能でしょうか?
0612名無しさん@お腹いっぱい。2016/05/30(月) 18:00:07.40
ひとつ質問

シェルで2つの日時を元に所要時間を求めたい場合ぐぐるといろいろ方法はありますが
これが便利なコマンド一発で用意されていないのは需要がないと言うか
需要があった人が最終的に誰でも使える簡単な形にせずに終わらせたってことなんでしょうか?
0613名無しさん@お腹いっぱい。2016/05/30(月) 18:55:30.71
>>612
広く使われるほどの需要はなかった
0614名無しさん@お腹いっぱい。2016/05/30(月) 19:36:20.17
dateコマンドのオプションに互換性がなかったから。
GNU date限定とかならいいんだけど
0615名無しさん@お腹いっぱい。2016/05/30(月) 21:40:48.25
内部的にUNIX時間で持てば差分計算は簡単なような
0616名無しさん@お腹いっぱい。2016/05/31(火) 08:52:48.30
>>615
32bitマシンが絶滅するまでは難しいな。
あと20年普通に残りそうだし
0617名無しさん@お腹いっぱい。2016/05/31(火) 21:45:59.92
内部的にUNIX時間で持つってどういうこと?
内部というのは環境変数やシェル変数という意味?
0618名無しさん@お腹いっぱい。2016/05/31(火) 23:23:59.98
256bit機が普及するまで32bit機はなくならないだろうね。
0619名無しさん@お腹いっぱい。2016/05/31(火) 23:24:37.85
>>617
epochからの時間ってことじゃない?
>>616
difftime(3)て32bitと64bitで違うのかな
0620超音波テロの被害者2016/06/01(水) 16:02:45.59
超音波テロの被害にあっています。
卑劣極まりない被害にあっています。

何が起こったかわからないときから、
わかってみれば、
まだ世の中に知られていない超音波テロ。

世の中の多数の振動源・発信源が
システム化され、 ネットワークを通して、
超音波・音波を集中させて
対象を攻撃するらしい。

超音波による物理的な力で、
ものが飛び、ものが壊れる。
それが人間の体に対してまで。

形のあるもの、ないもの、壊され、奪われ、
聞こえる声、音。超音波テロの加害者の声。
卑猥な内容、卑劣な内容、脅しやいたぶり。
0621超音波テロの被害者2016/06/01(水) 16:03:08.53
身体の表面を突き抜け、内臓を攻撃される。
頭蓋骨を突き抜け、意識を失わされる。
臓器不全やがん、命に関わることまで。
人間の身体を壊そうとする超音波テロ。

日本国中、どこにいても超音波で襲われる。
車に乗っている人間が襲われる。
歩いている人間が襲われる。
自宅で超音波の攻撃を受ける。

人や社会が超音波で襲われ、
罪もない人が超音波で襲われ、
卑劣な被害にあっています。
被害を訴えても信じてもらえない。

「見続けるのがいやだから、殺して終わる」、
「証拠隠滅だ」という超音波テロの加害者の声とともに
強烈な超音波の攻撃。

叫ばされ、いたぶられ、それを口実にまた攻撃され、
超音波テロの、残酷残虐で、卑劣な攻撃の被害にあっています。
心の底から被害を訴え、祈っています。

天に神に届きますように。
0622名無しさん@お腹いっぱい。2016/06/01(水) 17:45:47.97
>620
これなんつーシェルのスクリプトですか?
0623名無しさん@お腹いっぱい。2016/06/02(木) 07:52:05.22
/bin/jpsh
0624名無しさん@お腹いっぱい。2016/06/02(木) 08:00:02.53
/bin/chouonpa/itaburare
0625名無しさん@お腹いっぱい。2016/06/05(日) 11:03:53.19
ディレクトリを指定する時って、「/dir/」が正しいのか、「/dir」
にすべきか、最後の/をつけるかつけないかでどんな違いがあるのか
いつもすごく気になる。
0626名無しさん@お腹いっぱい。2016/06/05(日) 13:34:06.57
>>625
rsync や ln 、mv あたりはありなしで挙動がかわる。
ln や mv はオプションで一応制御できるけど
0627名無しさん@お腹いっぱい。2016/06/09(木) 19:13:38.61
json形式のデータをSQLのjoinみたいにキーで結合したいのですが
いいスクリプト知りませんか?
jqはできそうな感じなんだけど、サンプルのページが見当たらなくて
0628名無しさん@お腹いっぱい。2016/06/09(木) 21:10:02.49
>json形式のデータをSQLのjoinみたいにキーで結合したいのですが

cpanモジュール使うべし。
力技でゴリゴリでもできるかもしらんが、時間の無駄
0629名無しさん@お腹いっぱい。2016/06/09(木) 22:45:45.43
>>627
データがどんなもんか分からないので何とも言えないけど例えば
[
{"id": 1, "name": "Tom", "gender": 1},
{"id": 2, "name": "Alice", "gender": 2},
{"gid": 1, "gender": "male"},
{"gid": 2, "gender": "female"}
]
なんてJSONファイルがあって gender と gid で join する場合、

jq '
map(
(select(has("id")) | { k: .gender, v: { id: .id, name: .name }}),
(select(has("gid")) | { k: .gid, v: { geder: .gender }})
)
| group_by(.k)
| map((map(.v) | add))
' data.json

かなぁ。
06306292016/06/10(金) 01:11:22.91
あー、しまった、思いっきり間違えた…

jq '
(map(select(has("gid")) | {(.gid|tostring): .gender}) | add) as $g
|
map (select(has("id")) | .gender = $g[(.gender|tostring)])
' data.json
0631名無しさん@お腹いっぱい。2016/06/10(金) 01:28:18.48
[
{
"id": 1,
"name": "Tom",
"gender": "male"
},
{
"id": 2,
"name": "Alice",
"gender": "female"
}
]
できました、できましたけど書き方わからないです><

>>628
cpan使うのが主流なんですか?
0632名無しさん@お腹いっぱい。2016/06/10(金) 01:54:22.40
>>631
json 形式のデータを DB に insert する方法を調べた方がいいかも
0633名無しさん@お腹いっぱい。2016/06/10(金) 14:14:19.71
>>631

いやそういうわけではなくて、pythonでもrubyでもいいけど
JSONとかXMLとかYAMLなどの定形式な文書からスライスして取
り出すなら、すでにある専用モジュールとか使ったほうが断然
速いってはなし。俺はperlしかわからんのでcpanモジュール。

perlなら
use JSON::XS;
して、

my $json = 'json.txt'
my $data = decode_json($json); #jsonからperlのハッシュに変換

あとは、ハッシュの内容をダンプしてデータ構造みながら
必要なデータだけを拾う。

print %$data{features}->[$cnt]->{properties}->{title} .
0634名無しさん@お腹いっぱい。2016/06/10(金) 16:33:17.98
使うべしって言った割にショボ過ぎ
0635名無しさん@お腹いっぱい。2016/06/10(金) 22:15:34.82
スレ的にもここはあくまでシェルスクリプトでやるべきだろ

なんでもありなら今はPythonの方がメジャー
もしくはRubyとか
0636名無しさん@お腹いっぱい。2016/06/10(金) 23:07:20.19
場違いだったらすまん。
gomプレイヤーとかのソフト立ち上げるとスクリプトエラー出るんだけどどうしたらいい?
http://imgur.com/9hlJu8w
0637名無しさん@お腹いっぱい。2016/06/11(土) 00:12:44.31
スレチ
0638名無しさん@お腹いっぱい。2016/06/11(土) 00:34:35.87
スクリプトエラーとやらがでる

にちゃんでスクリプトで検索

シェルスクリプトとかよくわからんけどスクリプトって入ってるからここに書けば誰か完璧な答えを出してくれるはず


ゆとり、ここに極まれり
0639名無しさん@お腹いっぱい。2016/06/11(土) 03:40:49.78
引数を受けて同名のサブディレクリ直下にある全てのシェルスクリプト(.sh)を実行するってどう書けばいいんでしょうか?
0640名無しさん@お腹いっぱい。2016/06/11(土) 03:41:43.14
bash環境です。同名とは引数に指定された文字です
0641名無しさん@お腹いっぱい。2016/06/11(土) 03:53:01.79
find 引数 -name *.sh -exec {};
こんな感じなのだろうか。
0642名無しさん@お腹いっぱい。2016/06/11(土) 04:14:09.33
ありがとうございます
こんな感じで良いのかな?

find 引数 -maxdepth 0 -name *.sh -exec bin/sh -c ' {} ' \;
0643名無しさん@お腹いっぱい。2016/06/11(土) 10:22:42.97
シェルスクリプトじゃないけどrun-partsが似たような仕事するね
0644名無しさん@お腹いっぱい。2016/06/12(日) 05:31:11.76
for sh in $dir/*.sh; do $sh; done
0645名無しさん@お腹いっぱい。2016/06/12(日) 11:11:52.76
Cygwin(bash)で特定の拡張子の映像ファイルをforループ文でまわして処理したいと思っています

for input in *
do
 (処理)
done

これだと映像ファイルだけでなく全てのファイルが対象になってしまいます。
そうではなくて WMV、MP4、AVI、MPEG、MPGといった映像ファイルだけを
処理するにはどうしたらいいでしょうか?
0646名無しさん@お腹いっぱい。2016/06/12(日) 11:15:55.66
>>645
そもそもなんでファイルを振り分けてないのか?
0647名無しさん@お腹いっぱい。2016/06/12(日) 11:25:58.85
>>646
ffmpegで処理してるので映像ファイルの種類は分けなくても良かったりします
あ、ただ変換後の拡張子は統一するようスクリプトを書かないといけませんね
0648名無しさん@お腹いっぱい。2016/06/12(日) 11:44:06.36
>>645

for input in $(ls -1 *.{wav,mp4,avi,mpeg,mpg} 2>/dev/null)
do
 (処理)
done

とか。
0649名無しさん@お腹いっぱい。2016/06/12(日) 11:52:44.28
>>648
これじゃダメな場合があるんだっけ?

for input in *.wav *.mp4 *.avi *.mpeg *.mpg
do

done
0650名無しさん@お腹いっぱい。2016/06/12(日) 12:07:38.74
.wavファイルがないとinputには"*.wav"がそのまま入る
だけど、ループの中で処理する時に
[ -f "$input" ] || continue
とでもしとけばいいよね
0651名無しさん@お腹いっぱい。2016/06/12(日) 12:36:44.21
>>648
>>650
なるほど、そういう方法がありましたか。
ありがとうございますm(_ _)m

>>649
>>650さんのご指摘通りその拡張子のファイルが無いとそのまま入っちゃうって問題がありますね
0652名無しさん@お腹いっぱい。2016/06/13(月) 20:14:40.91
テキストファイルの最終行に改行がないときだけ
改行を追加するようなスクリプトってどう書けばいいでしょうか?
0653名無しさん@お腹いっぱい。2016/06/13(月) 22:21:10.97
>>652
それ、自分が前悩んで作ったのがある。誰か改善してくれ
#!/bin/sh
file=$1
test -f $file || exit 0

# if size -eq 0; then exit 0
if [ ! -s $file ]; then
 exit 0
fi

# if the last character is not \n, then echo
if [ "$(tail -c 1 $file | cat -A)" != "$" ]; then
 echo
fi
if ! tail -n 1 $file | grep '^$' > /dev/null ; then
 echo
fi
0654名無しさん@お腹いっぱい。2016/06/13(月) 22:23:13.08
test -n "$(tail -n1 TXT)" && echo > TXT
06556522016/06/13(月) 22:28:48.20
すまない。>>653はmbox形式のファイルにメールを追加するために作ったスクリプトだった
だから>>652さんの求めているスクリプトとはちょっと違った_o_
0656名無しさん@お腹いっぱい。2016/06/13(月) 22:49:39.12
>>654
ファイルがぶっ壊れちゃったじゃないか(#゚Д゚) ゴルァ!!
なんつって
0657名無しさん@お腹いっぱい。2016/06/13(月) 22:58:56.61
>>653
ありがとうございます
最終文字を取り出して調べるというわけですね
いじれそうです
たぶんGNUのtailが必須じゃないかと思うのですが、
非GNU環境でも動くようにはならないでしょうか
0658名無しさん@お腹いっぱい。2016/06/13(月) 23:07:30.48
>>654
ありがとうございます
ただ、これは目的の動作ではありません
末尾に空行が欲しいのではなく、
改行文字で終わっていない最終行に改行をつけたいのです
0659名無しさん@お腹いっぱい。2016/06/14(火) 00:26:19.34
>>652

#!/bin/sh
echo wq | ed "$1"
0660名無しさん@お腹いっぱい。2016/06/14(火) 00:51:00.50
>>652

for f in *.txt
do
[ $(tail -1 "$f" | wc -l) -eq 0 ] && echo >> "$f"
done
0661名無しさん@お腹いっぱい。2016/06/14(火) 00:57:30.09
>>652

for f in *.txt
do
{ tail -1 "$f" | read; } || echo >> "$f"
done
0662名無しさん@お腹いっぱい。2016/06/14(火) 02:14:34.40
edかex使ったほうが楽なんじゃないか
0663名無しさん@お腹いっぱい。2016/06/14(火) 02:55:20.33
659 と 661 の違いは空ファイル(サイズ0)の場合。
ed はそのままだけど、tail -1 ... | read では newline が追加される。
0664名無しさん@お腹いっぱい。2016/06/14(火) 17:09:51.68
>>659-663
みなさんありがとうございます
edは思いつきませんでした
どこでもあるかと思ったらないのもありますね。exはありそうです
改行のない最終行がwcにカウントされないとか
改行がないとreadがエラーコード返すとか
すごくためになりました
空ファイルの動作の差についてはサイズを調べて分岐すればいいですね
0665名無しさん@お腹いっぱい。2016/06/15(水) 01:17:10.55
>>652
sed -i -e '$a\' file
http://unix.stackexchange.com/questions/31947/how-to-add-a-newline-to-the-end-of-a-file
0666名無しさん@お腹いっぱい。2016/06/15(水) 02:02:23.61
ed や sed で追加する場合は元々ファイルの末尾に "\n" があるファイルの
タイムスタンプを更新してしまうんだな
0667名無しさん@お腹いっぱい。2016/06/15(水) 14:17:26.63
おまえら知らんだろうけど、俺の家のそばの歩行者信号はUNIXのコンソールみたいに
青になるまで(赤になるまで)ドット(.)の点滅がひとつずつ消えていくんだぜ・・?

夜なんか見るとKDEみたいな感じですげえカッコイイぜ。
0668名無しさん@お腹いっぱい。2016/06/15(水) 14:54:39.46
眼科行けよ・・・
0669名無しさん@お腹いっぱい。2016/06/15(水) 14:58:10.28
日常生活の夜景にKDEを妄想する病気か。
IT土方の後遺症
0670名無しさん@お腹いっぱい。2016/06/15(水) 17:06:08.30
>>665
おお、これはシンプルですね
空ファイルでもちゃんと対応できています
man見てもそんな動作するとは明示されてないのですが
安定した仕様と考えていいのでしょうか
0671名無しさん@お腹いっぱい。2016/06/15(水) 19:20:41.67
$ <- 最終行
a <- add. 置換ならsが有名. pでprint
\ 何もない シェルスクリプトでも改行またぐときに使うやつ

類似した構文
seq 20 | head
seq 20 | sed -n '1,10p'
0672名無しさん@お腹いっぱい。2016/06/15(水) 21:22:12.46
それだったら

seq 20 | sed 10q

の方が良いかもしんない
0673名無しさん@お腹いっぱい。2016/06/16(木) 01:11:19.56
>>652
http://stackoverflow.com/questions/10082204/add-a-newline-only-if-it-doesnt-exist
awk
{ rm file;awk 1 >file; }<file

bash
[[ $(tail -c1 file) && -f file ]]&&echo ''>>file
0674名無しさん@お腹いっぱい。2016/06/16(木) 14:28:12.81
>>673
おお、awkは明白でわかりやすいですね
改行抜きで読んだ各行を改行付きでprintするわけですね
その意味ではawkで完璧なcatはできないのかな
紹介していただいたページには他にもいろいろ解法があっておもしろいです
ありがとうございます
0675名無しさん@お腹いっぱい。2016/06/16(木) 15:35:18.42
grep + moreutils の sponge

$ grep '' file | sponge file
■ このスレッドは過去ログ倉庫に格納されています