X



シェルスクリプト総合 その26 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
垢版 |
2017/03/20(月) 12:07:26.41
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
http://echo.2ch.net/test/read.cgi/unix/1439563321/
0135名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 15:04:11.72
>>130
VBのツールの置き換えは仕事だぞ
趣味はお金払ってでもするものだけどな
ただUnixワークステーションとか買えねえよ
0141名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 17:53:50.03
開発経験者が趣味でシェルスクリプト書くって普通だと思う
てっきり営業とか企画とか別分野の人がシェルスクリプト書いたのかと思った
0148名無しさん@お腹いっぱい。
垢版 |
2017/04/26(水) 01:01:14.37
くだらない話題で申し訳ないんすけど
シェルスクリプトで使う変数の規則とかってどう決めてます?
自分は_HOGEがいいかなって思ってるんですけど、マジョリティはどうかなと(ここがマジョリティかどうかは別だけど)
0150名無しさん@お腹いっぱい。
垢版 |
2017/04/26(水) 08:25:15.17
>>148
とくに名前に規則は設けず、関数内で local 宣言でできるだけ隔離。
気にはなるけど、個人的には実際に問題になったことが無いし、export しなければ大丈夫じゃないか?
0151名無しさん@お腹いっぱい。
垢版 |
2017/04/26(水) 08:45:28.91
>>150
シェル内に影響するよ
スクリプトならシェルスクリプト内までその変数が生きる
0152名無しさん@お腹いっぱい。
垢版 |
2017/04/26(水) 08:52:37.57
localって業務用なら使うべきなんだろうがいまいち慣れないんだよなぁ
スコープ分けは基本ってのは分かっちゃいるんだがシェルスクリプトはどうもlocal使ったら負けな気がする
すげぇどうでもいいんだけどな
0154名無しさん@お腹いっぱい。
垢版 |
2017/04/27(木) 08:52:30.15
おまえらただのニートじゃなさそうだな
0156名無しさん@お腹いっぱい。
垢版 |
2017/04/27(木) 08:59:38.21
>>155
ジョークだろなんでそんなにおこる?
0158名無しさん@お腹いっぱい。
垢版 |
2017/04/27(木) 09:25:43.77
>>157
こりゃ一本取られたな
0159名無しさん@お腹いっぱい。
垢版 |
2017/05/06(土) 16:52:42.42
echo "${hoge[@]}" | xargs -P 10 -n 1 -J{} echo {} >> test.txt
てやると、期待するファイル内容は
aaa
bbb
ccc
...
なのに
aaa
bbccc
...
となってしまいます。
これを回避するいい方法ないですか?
0161名無しさん@お腹いっぱい。
垢版 |
2017/05/06(土) 19:56:59.36
Debian GNU/Linuxでのbashなのですが、指定時間指定ユーザのログインが無ければ
シャットダウンするシェルスクリプト
https://pastebin.com/pJ3v4TYY
を勉強を兼ねて作ってみました。
正常に動作していますが、何か変なところありますか?
0162名無しさん@お腹いっぱい。
垢版 |
2017/05/06(土) 21:11:07.00
cronでやってそうだけど
ログインしてたらループ抜けないようになってるから
1日経つと重複起動すると思う

あと指定時刻なのか一定時間なのかはっきりした方がいい

動いてると思ってるならいいんでないの
0163名無しさん@お腹いっぱい。
垢版 |
2017/05/06(土) 21:31:34.54
>>162
一定時間です。

/etc/rc.localってcronで1日ごとに起動されるのでしょうか。
PC電源投入後Linux起動時にただ一度だけ実行されると思っているのですが
0165名無しさん@お腹いっぱい。
垢版 |
2017/05/06(土) 23:44:25.36
>>161
常駐しないでlastとかでログインしなくなってから何分経ったか毎回計算した方がシンプルじゃない
なんだっけvarの下になんかあったよね
0168名無しさん@お腹いっぱい。
垢版 |
2017/05/07(日) 03:40:10.15
>>161
ダメってわけじゃないけど、"$1"と比較するなら grep は要らないはず(12行目)

>>163
一度だけ起動であってる
重複起動とか言ってる人は無知か勘違いなので無視していい

>>165
varの下のなんかってwtmpのこと?
wtmpは確実に更新されるわけじゃないし時間の計算も面倒になるので
>>161の方がシンプルだろうね
0174161
垢版 |
2017/05/07(日) 22:15:23.57
みなさんありがとう。

>>168
> "$1"と比較するなら grep は要らないはず(12行目)
他ユーザがログインしていても無視してシャットダウンする仕様にしたいのです。
> 一度だけ起動であってる
了解

>>171
> 15分でシャットダウンって考えられない
トイレとかの時、5分ほどかかる自分環境自動バックアップの処理を走らせ
画面ロックして席を立ちます。
席に戻ったらまた作業に戻るのですが、とっさの用事で席に戻れない時は
電源が切れていて欲しいのです。
10分だと下痢の時短いかも。20分もいらない。だから15分。

画面ロック(ログイン状態)の時に電源切断するのは気持ち悪いので
ログオフ状態の時に切れるようにしたいのです。
(そのため、バックアップ処理完了後は自動でログオフされるようにしています)

ちなみにWindowsではそういう自作ServiceをCで書いて走らせています。
Linuxは簡単ですね。
0177名無しさん@お腹いっぱい。
垢版 |
2017/05/08(月) 07:30:05.34
Windows簡単だと思うけどな
Cならコンパイルとかの環境が必要だけど所詮慣れだし
Cなんか使わずにVBScript使えばいいんじゃないの
0182名無しさん@お腹いっぱい。
垢版 |
2017/05/15(月) 06:37:29.43
時間のかかるパイプライン処理中に現在の中間処理内容を
メッセージ表示させることはできませんか?
echo で標準出力に表示させようとしてもそれは次のパイプラインに渡って画面に表示されませんよね?
標準エラー出力で表示させるしかないでしょうか?
0183名無しさん@お腹いっぱい。
垢版 |
2017/05/15(月) 07:04:43.49
tee
0186名無しさん@お腹いっぱい。
垢版 |
2017/05/15(月) 23:50:07.04
でもteeの仕様って、一方をファイルじゃなく、stderrあたりに
しておいてくれれば、もっと汎用性上がったのにね
0188名無しさん@お腹いっぱい。
垢版 |
2017/05/16(火) 06:24:05.92
teeの出力先をstderrにすると、中間処理をモニタすることしかできなくなるのでは?
ファイルに書けばモニタも出来るし汎用的
0189名無しさん@お腹いっぱい。
垢版 |
2017/05/16(火) 07:42:47.01
>186
デフォルトでstderrに吐くと、teeのエラーを吐く場所がなくなるからでは? (例えば ls | tee --wrongoption とかの場合)
モニタしたければ tee /dev/stderr でよい。
0192名無しさん@お腹いっぱい。
垢版 |
2017/05/19(金) 20:34:10.11
シェルってオブジェクト指向で書けないの?
暗黙的ルール多すぎだろ
0195名無しさん@お腹いっぱい。
垢版 |
2017/05/20(土) 03:14:17.14
シェルはパイプで渡していくと
関数型っぽいけど
0202名無しさん@お腹いっぱい。
垢版 |
2017/05/23(火) 14:55:53.34
$ls>hoge.txt
だとカレントディレクトリのリストができますけど、
さらに深堀りして、そこにあるフォルダ(ディレクトリの中身)も表示させるには
どうすればいいのでしょうか?

それから、
フォルダかファイルの名前 ディレクトリ名(/Users/namae/nanntyaca/hogehoge.txt)
のようなふうに二つを並べて吐き出させたいのですがどうすればいいでしょうか?
0204名無しさん@お腹いっぱい。
垢版 |
2017/05/23(火) 15:30:08.76
>>203
ありがとうディレクトリのリストができました。
ディレクトリのリストから、htmlのリストを作ろうとすると、どうするのが
いいのでしょうか?クリックすると当該ディレクトリに飛ぶようにしたい
だけなのです。考えていたのはtexのファイルにするということなのですが。
0205名無しさん@お腹いっぱい。
垢版 |
2017/05/23(火) 15:38:50.01
ハイパーリンク作るまでやるならshの範疇じゃない気がするが
なんでも聞かずに少しはぐぐったらどうよ
0208名無しさん@お腹いっぱい。
垢版 |
2017/05/26(金) 02:49:12.98
>>207
テキストファイルをhtmlにするには拡張子を変えただけでいいらしいです。
>>207さんが教えてくれてのはhtmlをtxtファイルにするための
ものだと思います。markdownでリストを作ろうと思います

ありがとうございました
0209名無しさん@お腹いっぱい。
垢版 |
2017/05/26(金) 03:27:01.73
横から

Content-type: text/html
htmlはtextの中でどう書くかというルールに過ぎない
拡張子なんてのはexplorer.exeとかのソフトがどのアプリケーションソフトを起動するかのヒント程度
名前などどうでもいい

w3m . -dump_sourceは、.(このディレクトリ)をhtmlで書き出せ、と命令してる
0210名無しさん@お腹いっぱい。
垢版 |
2017/05/26(金) 07:39:50.94
>>207さん
やりたかったことがそのままできるコードを教えてくれてありがとうございます。
それなのに申し訳ありません。>>209さんが教えてくれるまでその意義をわからず、
失礼なことを書きました。
>>209さん
本当にありがとうございます。
0211名無しさん@お腹いっぱい。
垢版 |
2017/06/02(金) 10:47:53.61
シェルスクリプトの本で、こんな便利なことができるという感じの
スクリプトを紹介するような感じでできてる本というのでお薦めの本は
あるでしょうか?
0213sage
垢版 |
2017/06/02(金) 20:17:29.65
(head ; tail ) < file
で、先頭10行・末尾10行が出るのはどういう仕組み?
FreeBSD+ash、bash で確認。
man にはそれらしい記述がないように見える。
0214名無しさん@お腹いっぱい。
垢版 |
2017/06/02(金) 21:17:20.29
ちなみに GNU coreutils の head, tail だと

seq 10 | { head -1; tail -1; }
1

となる。以下の場合は

seq 10240 | { head -1; tail -1; }
1
10240

となる。これは head コマンドが一定量のデータをバッファリングした
まま処理を終了してまうから。BSD系のコマンドでは未使用なデータは
パイプバッファに戻してくれるので tail コマンドで読み出すことができる。
0219名無しさん@お腹いっぱい。
垢版 |
2017/06/06(火) 12:55:43.92
>>214
BSDは知らないけど、普通stdioで読む単位は4096byteとかだから
headがそれを読んでexitした場合残りをtailが読むことになる
入力データが4096byte以下ならheadしか受け取れないが、大きければ
headとtailがそれぞれ入力を受け取れる
パイプに戻すとかいうインタフェースはunixにはない
0220213
垢版 |
2017/06/13(火) 13:42:47.20
どうもです。
要は head と tail でディスクリプタを共有してて、未 read の部分を tail が読んでいるんだと思うんだけど、
親子じゃないプロセスでディスクリプタ共有なんてできるんでしたっけ、と思って驚いた
(できてるから、できるんだろうけど)。

ちなみに tcsh でもできた。

ただ、下記の ★1 と ★2 で結果が違うのはどうしてなんでしょう。
コマンドかファイルかで、stdio のバッファリングの違いってあったっけ。

$ seq 100 > seq100.txt
$ seq 10024 > seq10024.txt
$ cat seq100.txt | { head -1 ; tail -1 ; } # ★1
1
$ { head -1 ; tail -1 ; } < seq100.txt # ★2
1
100
$ cat seq10024.txt | { head -1 ; tail -1 ; }
1
10024
$ { head -1 ; tail -1 ; } < seq10024.txt
1
10024
0221213
垢版 |
2017/06/13(火) 13:51:01.95
>>214
> ちなみに GNU coreutils の head, tail だと
> seq 10 | { head -1; tail -1; }
> 1
> となる。
なお、FreeBSD でも
$ jot 10 | { head -1; tail -1; }
1
でした。

head・tail で共有しているのはディスクリプタだけであって、
stdio バッファの共有はしていないので、戻すってのが ungetc(3) 的な
ものを指しているのであれば、戻したとしても tail がそれを読めるわけでは
ないと思っています。
0223213
垢版 |
2017/06/13(火) 15:13:53.06
★1も★2 も seq 100 なのに、なぜ結果が違うのか、というのが疑問なのであります。
0226名無しさん@お腹いっぱい。
垢版 |
2017/06/14(水) 09:15:41.39
>>223
要するに>>224の通りなんだけど
&#11088;1の書き方の場合、標準入力がパイプになるので(lseekできないので)tailには何も渡らない
&#11088;2の場合標準入力は通常ファイルseq100.txtなのでtailはlseekして読み直すから読める
0229名無しさん@お腹いっぱい。
垢版 |
2017/07/01(土) 20:45:46.61
流石に上手いわ
0230名無しさん@お腹いっぱい。
垢版 |
2017/07/01(土) 23:39:20.14
>>228
惚れる。UNIX の基本コマンドだけじゃん
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況