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/
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 の基本コマンドだけじゃん
0235名無しさん@お腹いっぱい。
垢版 |
2017/07/31(月) 07:52:04.50
# 使用しているのは GNU/Linux なので微妙にスレチかもしれないです。
GNU/Linux では /bin/sh が /bin/bash へのシンボリックリンクになっています。
私が利用している Fedora 26, Linux Kernel 4.11.11 では
bash$ readlink -e `which sh`
/usr/bin/bash
でした。(Fedora では /bin 全体が /usr/bin へのシンボリックリンクです。そういう方針です)

ファイルシステム等と共にシェルスクリプトの高速化を図ろうと,
Bourne Shell 互換で GNU bash より低機能で処理が高速な GNU dash を
/bin/sh へのシンボリックリンクにしました。
bash# rpm -qa | grep -E "^dash"
dash-0.5.9-2.fc26.x86_64
bash# unlink `which sh` && ln -s /usr/bin/dash /usr/bin/sh

再起動すると Xorg およびディスプレイマネージャは正常に起動したのですが,
ログイン後デスクトップ環境(Xfce4)が起動しません。
エラーログを取得しようにもコンソールl(/dev/tty1とか)にさえログインできず,
結局外部から /bin/sh を /usr/bin/bash に割り当て直して無事ログインできました。
原因はデスクトップ環境を構築しているシェルスクリプトのどこかに bash 独自の機能を要する文法があると思われます。
そこで質問なのですが,実際にログインプロセスを踏まずにそれを再現できるシェルスクリプトの作り方を教えてください。
長くて申し訳ないです。よろしくおねがいします。
0236名無しさん@お腹いっぱい。
垢版 |
2017/07/31(月) 07:59:41.19
内緒で妻のパソコンでインターネットして
ヌードとかHな写真を見まくっていたのですが、なんと
bネにかの表紙に血ゥていたエロ画荘怩ェパソコンの血繧�ノ
表示されたままになって元に戻せません!
前はプーさんの画像だったのに、今はアソコにバイブを挿した豊丸の画像です・・・。。
再起動しても表示されたままなんです。
早く直さないと妻が夜勤から帰ってきてしまします!(看護婦なので・・・・)
至急助けてください!!!
OSはウィンドウズXPです。
よろしくお願いします。
0239名無しさん@お腹いっぱい。
垢版 |
2017/07/31(月) 08:57:00.00
>>235
再現する方法を模索するのではなく、再起動せずに切り分けすればいいだけでは?
tty でログインできなかったって点からすると、/usr/bin/sh を差し替えた後に再起動せずに
su - 一般ユーザ名 でテストするのが一番手っ取り早そう。

display-manager(gdmや同等のソフト) を停止した状態で tty でログイン(安全をみて tty1 と
tty2 など複数個所でログイン済にしておく)、 /usr/bin/sh を差し替えて再起動せずに
display-manager を起動してログインテストすればいいんじゃないでしょうか。
0246名無しさん@お腹いっぱい。
垢版 |
2017/07/31(月) 16:15:55.29
/bin/shを差し替えるなんてFedora側で想定した使い方じゃないんだから
そもそもそんなことやっちゃいけない
0247名無しさん@お腹いっぱい。
垢版 |
2017/08/01(火) 02:25:49.77
>>245
ありがとうございます。
5000 箇所くらい不適合が見つかりました。
パッケージ管理されているシェルスクリプトも多くあり,
全部直すとシステムの破壊も(今更かもしれないですが)心配なのでやはり bash のままにしようかなとも考えています。

>>246
その通りなんですが dash は bash の4倍早いと聞いたのでつい……。
0254名無しさん@お腹いっぱい。
垢版 |
2017/08/03(木) 07:34:52.42
あれは必死に直した結果達成したもので、同じような努力をそのdistroで
やらないとできない

そういやFreeBSDも昔base systemからperl排除するという大きな仕事を
やってたなあ
0258名無しさん@お腹いっぱい。
垢版 |
2017/08/04(金) 03:14:55.27
シェルから特定のプログラムの標準入力にデータを流すにはどうしたらいいでしょうか。

何がしたいかというと、
stdinからのデータを処理するIPCで、サーバーサイドのプログラムに
シェル側からstdinに流してレスポンスがちゃんとできているかをチェックしたいのです。

サーバープログラムは stdin をistreamで処理するように組んでおり、
stdinで入ってくるデータはEOFで一区切りとし、EOFを検出後に
EOFフラグをクリアして、再度stdinにデータが流れてくるまでブロッキングするというループになっています。

本来はクライアントサイドからstdinへデータを流しますが、
サーバーサイドだけで簡単にチェックするために、

サーバーサイドはmy-server.elfとし、
$ ./my-server.elf
で起動状態にしておきます。
ここに対して、
コマンドライン上から テキストデータ+EOFを何度か送る方法はないでしょうか?
cat hoge | ./my-server.elf
とかだと、1回しかテストできないので、どうしたらいいでしょうか。
my-server.elfのプロセスIDはわかるので、そこに対してデータを送る方法があれば教えてください。
0260名無しさん@お腹いっぱい。
垢版 |
2017/08/04(金) 08:14:54.70
EOFってクリアできるものなの? よくわからんが
$ mkfifo /tmp/foo
$ exec < /tmp/foo
$ exec ./my-server.elf
で cat hoge > /tmp/foo とかどうよ
0263名無しさん@お腹いっぱい。
垢版 |
2017/08/09(水) 11:18:15.17
1<br>2<br>3<br>4<br>



1
2
3
4

にシェルで置き換えるコマンド教えれ
今viで開いて置き換えてます・・・
0268名無しさん@お腹いっぱい。
垢版 |
2017/08/09(水) 14:41:10.39
ありがとうございます
sedで出来ました

というか所定の文字列(今回は<br>)を改行に置き換えることと
改行を所定の文字列に置き換えることを混同していました

たしか後者はsedなどでできずperlとかでやった覚えがあります
まったくもって私の勘違いでした・・・
■ このスレッドは過去ログ倉庫に格納されています

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