シェルスクリプト総合 その22
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合は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.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0302名無しさん@お腹いっぱい。
2014/02/21(金) 17:29:18.58あと/bin から /usr/bin に移行しつつあるし
0303名無しさん@お腹いっぱい。
2014/02/21(金) 17:37:06.32# exec /bin/csh でいーんじゃないの
0304名無しさん@お腹いっぱい。
2014/02/21(金) 17:45:24.20今どきそんなケースほぼないだろ。
0305名無しさん@お腹いっぱい。
2014/02/21(金) 17:58:45.340306名無しさん@お腹いっぱい。
2014/02/21(金) 18:11:52.15あるマシンでchshした後別のマシンに入ったらうんぬんとか。
0307名無しさん@お腹いっぱい。
2014/02/21(金) 19:30:24.72cshがデフォルトでインストールされてる環境ってどこのやつ?
ちょっと気になったので雑学として聞いておきたいです
0308名無しさん@お腹いっぱい。
2014/02/21(金) 20:22:59.07CentOS, FreeBSD -> ある
Debian, Ubuntu, Arch, Gentoo -> ない
だな Debian は minimal から構築したもので Ubuntuはサーバ版
CentOSはVPNとして借りてるものだから俺がセットアップしたのではないが
0309名無しさん@お腹いっぱい。
2014/02/21(金) 20:36:14.42(正統な意味での)UNIXのライセンスを受けてるUNIX系のOSならば、
ほぼcsh入ってるんじゃないかな
0310301
2014/02/21(金) 20:49:22.89RHELとSolarisがほとんどで
他はだいたいCentOSかFreeBSDかUbuntu。
/bin/cshが無いOSがあるって
まだ気づいてなかった。
0311名無しさん@お腹いっぱい。
2014/02/21(金) 21:38:14.73そーゆー人のためにcsh入れておいてくれるだろうね
0312名無しさん@お腹いっぱい。
2014/02/21(金) 21:42:31.39現在稼働しているあらゆるUnix系OSではzshがデフォルトでインストールされてるの?
0313名無しさん@お腹いっぱい。
2014/02/21(金) 22:09:32.28デフォルトでインストールされてるかの答えになってなくね。
0314名無しさん@お腹いっぱい。
2014/02/21(金) 23:13:18.36zshのことなら、ない環境一杯あるでしょ。
RHELあたりでも、ミニマムだと入らないはず。
いわんや商用UNIXをや。
0315名無しさん@お腹いっぱい。
2014/02/21(金) 23:17:19.51ん?/binがないってこと?
シェル系が/usr/binに移ったってこと?
0316名無しさん@お腹いっぱい。
2014/02/21(金) 23:58:38.37商用UNIXだと入ってないことがスパコンで何度もあったよ
去年某大学の共用スパコンでも入っていなかった
0317名無しさん@お腹いっぱい。
2014/02/22(土) 00:12:01.18スパコンとかこの手の環境だとよくあるね
下手するとcsh推奨とか言い出す
死ね
0319名無しさん@お腹いっぱい。
2014/02/22(土) 00:28:48.57sh、csh、kshあたりは商用UNIXのコードに標準で取り込まれてるんだよ。
0320316
2014/02/22(土) 00:40:44.56それは分かってるんだけど
/usr/localや/optなんかにソフトが大量に入ってるのに
シェルだけはインストールしてくれないんだよ
頼んでもその三つを使えってことで
0321名無しさん@お腹いっぱい。
2014/02/22(土) 01:10:22.94あーでも癖のある商用UNIXじゃbashやzshのビルドは難しいのかな
0322名無しさん@お腹いっぱい。
2014/02/22(土) 01:30:17.61bashやzshだけのビルドはうまくいかなかったおぼえがある
ビルドの失敗だけじゃなくで実行時にfatal errorとか
GNU iconvみたいな依存するライブラリも含めてビルドすれば問題なかったけど
0323名無しさん@お腹いっぱい。
2014/02/22(土) 04:40:21.34自分でビルドってのはその辺の面倒まで見ることを言うんじゃね?
0324名無しさん@お腹いっぱい。
2014/02/22(土) 09:11:42.61zshの話じゃなくcshの話だよ。
0325名無しさん@お腹いっぱい。
2014/02/22(土) 09:13:40.98Solaris とかは /bin は /usr/bin へのシンボリックリンクだね。
0326名無しさん@お腹いっぱい。
2014/02/22(土) 09:17:42.370327名無しさん@お腹いっぱい。
2014/02/22(土) 11:01:57.40「Debian,Ubuntu,Gentoo,Archはない」って書いてあるのでは?
0328名無しさん@お腹いっぱい。
2014/02/22(土) 12:06:00.19>>326
個人的に、そういう構成、マジで誰得なんだ?って思う
0329名無しさん@お腹いっぱい。
2014/02/22(土) 13:21:23.93Archも/binと/sbinが/usr/binになってるな
0330名無しさん@お腹いっぱい。
2014/02/22(土) 13:24:08.27#!/bin/bash って書いちゃってるスクリプトへの対処療法的な措置だろ
0331名無しさん@お腹いっぱい。
2014/02/22(土) 15:09:58.51そんなおまぬけの救済なんてしなくていいのに
0332名無しさん@お腹いっぱい。
2014/02/22(土) 16:57:37.93#! /usr/bin/env bash
だとPATHに自分でコンパイルしたbashとかあった時にそっちが実行されちゃう罠
0333名無しさん@お腹いっぱい。
2014/02/22(土) 18:12:16.67env is /usr/local/bin/env
0334名無しさん@お腹いっぱい。
2014/02/22(土) 19:08:02.270335名無しさん@お腹いっぱい。
2014/02/22(土) 19:15:41.790336名無しさん@お腹いっぱい。
2014/02/22(土) 19:48:12.610337名無しさん@お腹いっぱい。
2014/02/22(土) 21:11:31.17嫌なら rm /bin しとけばいいんじゃね。
0338名無しさん@お腹いっぱい。
2014/02/22(土) 22:35:54.110339名無しさん@お腹いっぱい。
2014/02/22(土) 23:22:31.91商用Unixが駆逐される日も遠くないだろうな
そのときは晴れてシェルがbashとzshに統一されるわけだ
0340名無しさん@お腹いっぱい。
2014/02/23(日) 01:06:17.56>>308はデフォルト環境じゃない状態でのサーバだから参考程度
>>324
>>301や>>307はcshの話だけど>>299や>>304-306や>>312はzshの話
301の場合入ってなくても弾かれるだけだが、299,304-306の場合ログイン不能になるからまじでヤバイ
0341名無しさん@お腹いっぱい。
2014/02/23(日) 22:40:39.22ところで、/usr/binって、/binへ移行していく風潮なかったけ?
その話を見たとき、数年後にはまた、パス関係ではまるのかーと少し意識した記憶がある。
0342名無しさん@お腹いっぱい。
2014/02/23(日) 22:44:06.71最近/binがなくなって/usr/binになった
一応シンボリックリンクとして残っているけど
0343名無しさん@お腹いっぱい。
2014/02/23(日) 23:06:55.05基本は /usr/ 以下に移そう、ほんとに必要なのだけ / 直下に置こう、
っていう方向じゃないの。
0344名無しさん@お腹いっぱい。
2014/02/24(月) 02:25:20.470345名無しさん@お腹いっぱい。
2014/02/24(月) 08:35:23.830346名無しさん@お腹いっぱい。
2014/02/24(月) 08:39:49.500347名無しさん@お腹いっぱい。
2014/02/24(月) 09:06:15.40それは /sbin
0348名無しさん@お腹いっぱい。
2014/02/24(月) 11:07:05.89solaris は /sbin/sh があるので可能だけど。
0349名無しさん@お腹いっぱい。
2014/02/24(月) 11:10:08.04> /sbin/sh がないので
それどのOSの話?
0350名無しさん@お腹いっぱい。
2014/02/24(月) 11:20:46.09たいていの OS。
起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
/bin は少なくともローカルになければならない。
solaris はそうなっていないので、/sbin だけローカルにあれば /bin も NFS に置ける。
というか、/bin -> /usr/bin の symlink だけど。
0351名無しさん@お腹いっぱい。
2014/02/24(月) 11:25:45.58> 起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
それ思い込みじゃね?
0352名無しさん@お腹いっぱい。
2014/02/24(月) 11:41:04.26何故無いんだろう。まずいことでもあるんかな
0353名無しさん@お腹いっぱい。
2014/02/24(月) 17:17:57.92確かUbuntuでnetfs自体行方不明だったから仕方なくrc.localだかにmount -aを書いた覚えがあるけど、
最近はその手の初期化周りを制御するinitdを置き換えるlaunchdとかも出てきてるし今はどうなってるんだろうな?
0354名無しさん@お腹いっぱい。
2014/02/24(月) 17:22:15.070355名無しさん@お腹いっぱい。
2014/02/24(月) 22:05:45.65今は/usr何かを別のファイルシステムでマウントするとかほとんどないからな、さして重要な意味がないのでlinux何かでは一緒くた。
solarisでも今は形骸化してる。
/binだけローカルにあったって、実行できないんだぜ?
0356名無しさん@お腹いっぱい。
2014/02/25(火) 01:07:06.24ありゃ、逆でしたか失礼。
シェルの先頭で変数に入れちゃうから、かわってもそこを変えるだけですむようにはなっているのですがね。
バージョン違いでパスがかわるとめんどうだなぁ。
0357名無しさん@お腹いっぱい。
2014/02/25(火) 01:17:07.19# @ これはOK
find /log/*/*/*.log -type f
# A これがNG
set target="/log/*/*/*.log"
echo ${target}
find "${target}" -type f
0358名無しさん@お腹いっぱい。
2014/02/25(火) 01:23:50.190359名無しさん@お腹いっぱい。
2014/02/25(火) 01:30:20.87echo "$target"
find ${target} -type f
setって何だよ
0360名無しさん@お腹いっぱい。
2014/02/25(火) 01:42:43.840361名無しさん@お腹いっぱい。
2014/02/25(火) 01:44:55.100362名無しさん@お腹いっぱい。
2014/02/25(火) 02:02:27.91どうすればそんなうらやましい立場になれるんだ
0363名無しさん@お腹いっぱい。
2014/02/25(火) 02:03:13.53うちのDebianの/binで調べたら、/usrにリンクしてるのは、ping6だけだった。普通、/libに入れるんじゃないか。
0364名無しさん@お腹いっぱい。
2014/02/25(火) 06:49:13.360365名無しさん@お腹いっぱい。
2014/02/25(火) 08:03:02.89老い先短いんだから平穏無事はともかく時間を急いては勿体無いですよ、先輩。
0366名無しさん@お腹いっぱい。
2014/02/25(火) 17:27:12.85これを、特定の相手からのメールのみ表示するとか、相手によって表示メッセージ変えることとかできますか?
0367名無しさん@お腹いっぱい。
2014/02/25(火) 17:33:51.260368名無しさん@お腹いっぱい。
2014/02/25(火) 22:15:55.65ウェブメールにも対応させることってできますか?
0369名無しさん@お腹いっぱい。
2014/02/25(火) 22:21:28.600370名無しさん@お腹いっぱい。
2014/02/25(火) 22:49:28.41認証させて、ページ内容のHTMLを取得して、
解析したり加工したりして前回との差分を取る関数を作って、
その結果でプロンプトを変えることはできますか?
0371名無しさん@お腹いっぱい。
2014/02/25(火) 22:55:36.700372名無しさん@お腹いっぱい。
2014/02/26(水) 08:11:52.000373名無しさん@お腹いっぱい。
2014/02/26(水) 12:17:53.68プロンプト出すたびに10秒とか1分とかかかりそう。
バックグラウンドで数分おきに監視して、
ファイルに蓄積していくとかすればいいのかな。
0374名無しさん@お腹いっぱい。
2014/02/28(金) 11:38:51.590375名無しさん@お腹いっぱい。
2014/02/28(金) 11:55:22.310376名無しさん@お腹いっぱい。
2014/02/28(金) 12:09:17.240377名無しさん@お腹いっぱい。
2014/02/28(金) 12:25:19.320378名無しさん@お腹いっぱい。
2014/02/28(金) 14:48:39.140379名無しさん@お腹いっぱい。
2014/02/28(金) 14:49:38.130380名無しさん@お腹いっぱい。
2014/02/28(金) 15:51:59.280381名無しさん@お腹いっぱい。
2014/02/28(金) 18:30:50.64cshはまだまだ減益ですね
0382名無しさん@お腹いっぱい。
2014/02/28(金) 18:36:01.060383名無しさん@お腹いっぱい。
2014/02/28(金) 19:54:21.74ターミナルから青空文庫など文章サイトの特定のhtmlにアクセスして、タグを除いた文章のみを抽出し、それをテキストファイルにして保存。
(出来ればそれをTeX文書にして、事前に決めた設定でPDF出力)
2
ターミナルから音楽視聴サイトなどのhtmlにアクセスして視聴できる曲のタイトルを抽出したのちプロンプトに表示。
その後入力を促し、入力に応じてプレイヤーで特定の曲を聴く、もしくはなにもしない。
(そのサイトではタイトルからmp3のurlが推測可能で、タイトルさえ取れればいい)
ということをやるために勉強をしたいのですが、
こういうことをやる為にはシェルスクリプトを勉強すれば大丈夫ですか?
それともCとかPythonとかPerlとかを勉強した方がいいですか?
0384名無しさん@お腹いっぱい。
2014/02/28(金) 19:58:10.34if文でこんなふうに x とかの文字を挟むスクリプトをよく見かけるんですが
if [ "x$hoge" == "xYes" ]
なんでこうするんですかね?普通に
if [ "$hoge" == "Yes" ]
じゃまずい場合があるとか?
0385名無しさん@お腹いっぱい。
2014/02/28(金) 20:05:26.65htmlのパーサはbashじゃちと辛いからPerlとかPythonとかが一番向いてると思う
その用途ならCは要らんな
0386名無しさん@お腹いっぱい。
2014/02/28(金) 20:45:34.67ありがとうございます。
いずれにしろ使える知識なので少しは勉強するつもりですが
上の目的の為にはPerlかPythonを使います。
0387名無しさん@お腹いっぱい。
2014/02/28(金) 21:01:20.16$hoge に空白が入ってきた場合や何も入っていない場合に
if [ "$hoge" == "Yes" ]
だと
if [ == Yes ]
こうなり、
if [ "x$hoge" == "xYes" ]
だと
if [ x == xYes ]
こうなる。
なので、
0388名無しさん@お腹いっぱい。
2014/02/28(金) 21:13:35.450389名無しさん@お腹いっぱい。
2014/02/28(金) 21:34:57.30変数をダブルクォートで囲ってあれば、xとか前につけなくても平気じゃないの?
昔、つけないとヤバイ場合があった記憶があるんだけど思い出せない
0390名無しさん@お腹いっぱい。
2014/02/28(金) 22:03:37.81手元で試したら普通にハイフンで始まっても大丈夫だったな
0391名無しさん@お腹いっぱい。
2014/02/28(金) 22:23:09.550392名無しさん@お腹いっぱい。
2014/02/28(金) 22:26:08.16/usr/bin/[ は == がOK
bashの組み込みの[も == がOK
sh(dashだった)の組み込みの[は == がNG
0393384
2014/02/28(金) 23:21:24.48いや、>>389の言う通り、普通は未定義変数でもダブルクォートしてれば空文字扱いになるよね?
おそらくそうはならない環境のための配慮かと思ったんだけど・・・
誰かこの辺詳しい人いません?
0394名無しさん@お腹いっぱい。
2014/02/28(金) 23:45:51.04http://stackoverflow.com/questions/6852612/bash-test-for-empty-string-with-x
0395名無しさん@お腹いっぱい。
2014/03/01(土) 00:00:04.36おードンピシャなページですわthx
なるほど、[ がビルトインじゃない時代の互換性のためだったのね
じゃあ今の時代では必要なシーンなんてほぼ皆無だろうね
0396名無しさん@お腹いっぱい。
2014/03/01(土) 08:47:18.39社史編纂室に異動させるわ
0397名無しさん@お腹いっぱい。
2014/03/01(土) 14:12:39.58連番のH画像/動画を一気にダウンロードする6
http://toro.2ch.net/test/read.cgi/unix/1349257148/
スレ2個目ぐらいまでが参考になる。
0398名無しさん@お腹いっぱい。
2014/03/01(土) 15:45:04.91ここで言う任意の文字列というのは、$'"/などの記号文字や改行も含む複数行から成る文字列です。
できれば
str="
文字列1
文字列2
・・・
文字列n
"
というstrを作った上、sedなどで一発でできればいいのですが。
0399名無しさん@お腹いっぱい。
2014/03/01(土) 16:38:27.39ビルトインでない [ はビルトインの [ を持っていないシェルのために存在するものちゃうの?
将来的には消してビルトインの方に統一するんちゃうの?
やったら逆やと思うんやけど。
0400名無しさん@お腹いっぱい。
2014/03/01(土) 16:45:16.38sed '/hoge/a --foo--\n--bar--' -i file
0401名無しさん@お腹いっぱい。
2014/03/01(土) 17:00:58.86見ててわかるからおもろいw
■ このスレッドは過去ログ倉庫に格納されています