トップページunix
1001コメント297KB

シェルスクリプト総合 その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/
0268名無しさん@お腹いっぱい。2014/02/19(水) 17:29:23.50
>>266
同じ構成の画面を、設定ファイルを指定して使い回すためです

>>267
ありがとうございます。
テキストにでも書き出して、そこから読み直してみます。
0269名無しさん@お腹いっぱい。2014/02/19(水) 17:49:40.79
>>267
だから、なぜ普通に起動せずにsourceで実行するのかを聞いてるんだが。
0270名無しさん@お腹いっぱい。2014/02/19(水) 18:00:57.53
>>268
init.dとかのスクリプト見て真似てみたら。
関数にして呼び出す。
0271名無しさん@お腹いっぱい。2014/02/19(水) 22:59:42.02
普通に出来るけど

$ cat hoge.sh
echo "hoge.sh is called with $1"
if [ "$1" = "fuga.txt" ] ; then
fuga="fuga2.txt"
. ./hoge.sh $fuga
fi

$ . ./hoge.sh fuga.txt
hoge.sh is called with fuga.txt
hoge.sh is called with fuga2.txt
02722652014/02/20(木) 09:12:57.78
みなさんありがとうございます。

どうやら変数の入れ方の様です。

fuga.txtに
trans_2=fuga2.txt
があって、

read input_key #ここで2を入力
eval input_trans='$trans_'input_key
echo $input_trans

これで
fuga2.txt
と出力されるのですが、
. ./hoge.sh $input_trans
とすると、引数を読まない感じです。
直前に
$input_trans=”fuga2.txt”
といれると動きます。

端末から直接書き込めないので、スマホで打ってるので、
読みにくくて申し訳ないです。
0273名無しさん@お腹いっぱい。2014/02/20(木) 11:48:12.75
なんでman見ないんだ?
. にはオプショナル引数は渡せない。無視される。

>>271
basherは「普通に」と言うな
02742652014/02/20(木) 13:03:57.32
>>273
なるほど。ありがとうございます。

manはききませんでした。
cygwinなので、インストールをスキップされてるのかもしれないです。
0275名無しさん@お腹いっぱい。2014/02/20(木) 14:55:50.29
>fuga.txtに
>trans_2=fuga2.txt
>があって、

もしかしてfuga.txtもsourceする?
そこに原因がある気がする
0276名無しさん@お腹いっぱい。2014/02/20(木) 19:07:54.76
>>273
でも、今は「普通=bash」だから仕方ないですよね・・・
0277名無しさん@お腹いっぱい。2014/02/20(木) 19:23:08.95
ログインシェルとシェルスクリプトシェルを混同すんな
ログインシェルならtcshユーザだってそこそこ居るんだぞ
0278名無しさん@お腹いっぱい。2014/02/20(木) 19:40:30.63
さすがに今はいないよ
0279名無しさん@お腹いっぱい。2014/02/20(木) 20:02:25.81
そもそもtcshがまだ存在するということに驚くというか
動いているところを見たことはない
0280名無しさん@お腹いっぱい。2014/02/20(木) 20:04:39.54
冬だからな
0281名無しさん@お腹いっぱい。2014/02/20(木) 20:54:06.58
>>278
俺 csh なんだけど…。
実体は tcsh の csh モード。
0282名無しさん@お腹いっぱい。2014/02/20(木) 20:56:14.43
そもそもみんなログインシェルは
何をきっかけに乗り換えるものなんだ?

俺にはまだきっかけが来ない。
0283名無しさん@お腹いっぱい。2014/02/20(木) 21:23:05.80
>>282
俺は最初に与えられたのが tcsh で、暫くそれ使ってたが、人の書いたシェルスクリプトを修正したり
しているうちに sh の文法の方が詳しい状態になったから bash に移行したわ。
部屋の模様替えみたいな気分でやってみればいいんじゃね?
0284名無しさん@お腹いっぱい。2014/02/20(木) 21:34:22.21
ふと思いたってbashからzshに乗り換えた。今ではもう戻れない
0285名無しさん@お腹いっぱい。2014/02/20(木) 21:41:08.58
csh->tcsh->bash->zsh->csh
堂々巡りでもうどうでも良く
0286名無しさん@お腹いっぱい。2014/02/20(木) 21:44:27.47
なんか俺は多分 csh の全機能の 10 分の 1 くらい
しか使ってないだろうから、csh は機能が足りないと
か不便だとか言えなくてなあ。
0287名無しさん@お腹いっぱい。2014/02/20(木) 22:02:13.11
.cshrcが50kBもあるw
0288名無しさん@お腹いっぱい。2014/02/21(金) 00:01:47.64
>>278
な?そこそこ居るだろ?
0289名無しさん@お腹いっぱい。2014/02/21(金) 00:31:42.46
このスレ、この板にいてなおcsh使いがいるとか・・・tcshならともかく
自分で使う分には勝手だけど、くれぐれも後輩に広めんなよ
0290名無しさん@お腹いっぱい。2014/02/21(金) 00:34:46.45
ログインシェルとしての欠点を教えてくれ
欠点って.cshrcがcshスクリプトだから.cshrcのカスタムに拘ると死ぬくらいじゃねーの?
0291名無しさん@お腹いっぱい。2014/02/21(金) 00:37:33.91
実行結果の違いでも出して論じてくれるなら見てて楽しい
でも、そうでないなら・・
0292名無しさん@お腹いっぱい。2014/02/21(金) 00:39:27.04
cshって補完機能をカスタムできるんですか?
0293名無しさん@お腹いっぱい。2014/02/21(金) 00:42:49.85
うーん?cshもけっこういろいろあって、オリジナルのcshはかなり低機能だったけど、
最後にみたcshは補間機能とかけっこう充実してた記憶が
0294名無しさん@お腹いっぱい。2014/02/21(金) 01:03:08.94
>>293
すいません、csh系のシェルについて聞いたつもりでした。
tcshとかだとできるんですかね?
0295名無しさん@お腹いっぱい。2014/02/21(金) 04:20:50.14
ログインシェル云々の話が出てるけど、ログインシェルを普段使うシェルとは
別ものにしてる人っていんの?ログイン後にわざわざ切り替えてんの?ありえねー
俺なんか$HOME下にビルドした最新のzshを躊躇なくログインシェルにしてるわ
0296名無しさん@お腹いっぱい。2014/02/21(金) 08:14:31.18
>>290
stderrだけをリダイレクト出来ない
0297名無しさん@お腹いっぱい。2014/02/21(金) 08:25:11.31
foreachを1行で書けない
0298名無しさん@お腹いっぱい。2014/02/21(金) 16:10:18.18
>>295
zshのログインシェルでviをたちあげcshスクリプトを書く、とかそういうことじゃないの
0299名無しさん@お腹いっぱい。2014/02/21(金) 16:59:25.85
chshでシェル変えちゃうとそのシェルがないときにログイン不能になるから
.bashrcに/usr/bin/zshって書くべし
みたいなことをFreeBSDのマニュアルかなんかに書いてた気がする
0300名無しさん@お腹いっぱい。2014/02/21(金) 17:07:53.80
俺は/etc/shellsにzshがないから仕方なくcshrcにexec zshしてる鯖があるな
0301名無しさん@お腹いっぱい。2014/02/21(金) 17:16:01.62
>>295
俺は毎日他社の違うサーバにrootアカウントで入る日々だから
ログインしたら1発目のコマンドが
# /bin/csh ; exit
だ。
元のログインシェルが何か調べもしない。
OSの素性を調べるのもそれから。
そのあと好みの環境変数等を全部手打ちして
それからOSの素性を調べてから作業に入る。
0302名無しさん@お腹いっぱい。2014/02/21(金) 17:29:18.58
今どきLinux系なら/bin/cshがないことも多いと思うけど
あと/bin から /usr/bin に移行しつつあるし
0303名無しさん@お腹いっぱい。2014/02/21(金) 17:37:06.32
>>301
# exec /bin/csh でいーんじゃないの
0304名無しさん@お腹いっぱい。2014/02/21(金) 17:45:24.20
>>299
今どきそんなケースほぼないだろ。
0305名無しさん@お腹いっぱい。2014/02/21(金) 17:58:45.34
chshが存在と/etc/shellsの確認するだろ
0306名無しさん@お腹いっぱい。2014/02/21(金) 18:11:52.15
NIS使ってるときとかの話じゃね。
あるマシンでchshした後別のマシンに入ったらうんぬんとか。
0307名無しさん@お腹いっぱい。2014/02/21(金) 19:30:24.72
>>301
cshがデフォルトでインストールされてる環境ってどこのやつ?
ちょっと気になったので雑学として聞いておきたいです
0308名無しさん@お腹いっぱい。2014/02/21(金) 20:22:59.07
手元のマシンだと /bin/csh は
CentOS, FreeBSD -> ある
Debian, Ubuntu, Arch, Gentoo -> ない
だな Debian は minimal から構築したもので Ubuntuはサーバ版
CentOSはVPNとして借りてるものだから俺がセットアップしたのではないが
0309名無しさん@お腹いっぱい。2014/02/21(金) 20:36:14.42
とてつもなく古い製品で無ければ、
(正統な意味での)UNIXのライセンスを受けてるUNIX系のOSならば、
ほぼcsh入ってるんじゃないかな
03103012014/02/21(金) 20:49:22.89
>>307
RHELとSolarisがほとんどで
他はだいたいCentOSかFreeBSDかUbuntu。
/bin/cshが無いOSがあるって
まだ気づいてなかった。
0311名無しさん@お腹いっぱい。2014/02/21(金) 21:38:14.73
まあ会社のサーバなら管理者が
そーゆー人のためにcsh入れておいてくれるだろうね
0312名無しさん@お腹いっぱい。2014/02/21(金) 21:42:31.39
>>304
現在稼働しているあらゆるUnix系OSではzshがデフォルトでインストールされてるの?
0313名無しさん@お腹いっぱい。2014/02/21(金) 22:09:32.28
>>308
デフォルトでインストールされてるかの答えになってなくね。
0314名無しさん@お腹いっぱい。2014/02/21(金) 23:13:18.36
>>313
zshのことなら、ない環境一杯あるでしょ。
RHELあたりでも、ミニマムだと入らないはず。
いわんや商用UNIXをや。
0315名無しさん@お腹いっぱい。2014/02/21(金) 23:17:19.51
>>302
ん?/binがないってこと?
シェル系が/usr/binに移ったってこと?
0316名無しさん@お腹いっぱい。2014/02/21(金) 23:58:38.37
>>314
商用UNIXだと入ってないことがスパコンで何度もあったよ
去年某大学の共用スパコンでも入っていなかった
0317名無しさん@お腹いっぱい。2014/02/22(土) 00:12:01.18
>>316
スパコンとかこの手の環境だとよくあるね
下手するとcsh推奨とか言い出す
死ね
03183162014/02/22(土) 00:16:16.51
>>317
csh推奨というかtcshなしbashなしで
sh,csh,kshしか入ってなかった前の職場orz
0319名無しさん@お腹いっぱい。2014/02/22(土) 00:28:48.57
そりゃ、商用UNIXの製品にオープンソース系のコードをほいほい取り込めないからなあ。
sh、csh、kshあたりは商用UNIXのコードに標準で取り込まれてるんだよ。
03203162014/02/22(土) 00:40:44.56
>>319
それは分かってるんだけど
/usr/localや/optなんかにソフトが大量に入ってるのに
シェルだけはインストールしてくれないんだよ
頼んでもその三つを使えってことで
0321名無しさん@お腹いっぱい。2014/02/22(土) 01:10:22.94
コンパイラあるんだったら自分でビルドするのはどうなんだろう
あーでも癖のある商用UNIXじゃbashやzshのビルドは難しいのかな
0322名無しさん@お腹いっぱい。2014/02/22(土) 01:30:17.61
>>321
bashやzshだけのビルドはうまくいかなかったおぼえがある
ビルドの失敗だけじゃなくで実行時にfatal errorとか
GNU iconvみたいな依存するライブラリも含めてビルドすれば問題なかったけど
0323名無しさん@お腹いっぱい。2014/02/22(土) 04:40:21.34
コンパイラ自体がそれらのコードを受け付けない場合も辛いが、
自分でビルドってのはその辺の面倒まで見ることを言うんじゃね?
0324名無しさん@お腹いっぱい。2014/02/22(土) 09:11:42.61
>>314
zshの話じゃなくcshの話だよ。
0325名無しさん@お腹いっぱい。2014/02/22(土) 09:13:40.98
>>315
Solaris とかは /bin は /usr/bin へのシンボリックリンクだね。
0326名無しさん@お腹いっぱい。2014/02/22(土) 09:17:42.37
イマドキは /system/bin/sh だったり、、
0327名無しさん@お腹いっぱい。2014/02/22(土) 11:01:57.40
>>324
「Debian,Ubuntu,Gentoo,Archはない」って書いてあるのでは?
0328名無しさん@お腹いっぱい。2014/02/22(土) 12:06:00.19
>>325
>>326
個人的に、そういう構成、マジで誰得なんだ?って思う
0329名無しさん@お腹いっぱい。2014/02/22(土) 13:21:23.93
>>325
Archも/binと/sbinが/usr/binになってるな
0330名無しさん@お腹いっぱい。2014/02/22(土) 13:24:08.27
/binが/usr/binのシンボリックリンクになってるのは過去の互換性というか
#!/bin/bash って書いちゃってるスクリプトへの対処療法的な措置だろ
0331名無しさん@お腹いっぱい。2014/02/22(土) 15:09:58.51
>>330
そんなおまぬけの救済なんてしなくていいのに
0332名無しさん@お腹いっぱい。2014/02/22(土) 16:57:37.93
しかし
#! /usr/bin/env bash
だとPATHに自分でコンパイルしたbashとかあった時にそっちが実行されちゃう罠
0333名無しさん@お腹いっぱい。2014/02/22(土) 18:12:16.67
$ type env
env is /usr/local/bin/env
0334名無しさん@お腹いっぱい。2014/02/22(土) 19:08:02.27
bashも/usr/local/binへインストールされているのがおにあい。
0335名無しさん@お腹いっぱい。2014/02/22(土) 19:15:41.79
FreeBSDでは実際/usr/local/bin/bashに入るしね
0336名無しさん@お腹いっぱい。2014/02/22(土) 19:48:12.61
#! /usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin bash
0337名無しさん@お腹いっぱい。2014/02/22(土) 21:11:31.17
>>328
嫌なら rm /bin しとけばいいんじゃね。
0338名無しさん@お腹いっぱい。2014/02/22(土) 22:35:54.11
rmは怖いからunlink使うことにしてる
0339名無しさん@お腹いっぱい。2014/02/22(土) 23:22:31.91
ミッションクリティカルな分野とかスパコンとかでも、徐々にLinuxが浸透しつつあるし
商用Unixが駆逐される日も遠くないだろうな
そのときは晴れてシェルがbashとzshに統一されるわけだ
0340名無しさん@お腹いっぱい。2014/02/23(日) 01:06:17.56
>>314>>327
>>308はデフォルト環境じゃない状態でのサーバだから参考程度

>>324
>>301>>307はcshの話だけど>>299>>304-306>>312はzshの話
301の場合入ってなくても弾かれるだけだが、299,304-306の場合ログイン不能になるからまじでヤバイ
0341名無しさん@お腹いっぱい。2014/02/23(日) 22:40:39.22
bashはGPLだしそのあたりがまずいこともあるはず何だよな。
ところで、/usr/binって、/binへ移行していく風潮なかったけ?

その話を見たとき、数年後にはまた、パス関係ではまるのかーと少し意識した記憶がある。
0342名無しさん@お腹いっぱい。2014/02/23(日) 22:44:06.71
少なくともFedoraとArchは逆だな
最近/binがなくなって/usr/binになった
一応シンボリックリンクとして残っているけど
0343名無しさん@お腹いっぱい。2014/02/23(日) 23:06:55.05
>>341
基本は /usr/ 以下に移そう、ほんとに必要なのだけ / 直下に置こう、
っていう方向じゃないの。
0344名無しさん@お腹いっぱい。2014/02/24(月) 02:25:20.47
rootが何かしないと変更されないものはusrだっけ。usrをnfsでmountする時はどうするんだろ。
0345名無しさん@お腹いっぱい。2014/02/24(月) 08:35:23.83
その辺はFHSでも読んでくれ。
0346名無しさん@お腹いっぱい。2014/02/24(月) 08:39:49.50
FHSだとNFSまでの最低限は/binに入れるだったのでは。
0347名無しさん@お腹いっぱい。2014/02/24(月) 09:06:15.40
>>346
それは /sbin
0348名無しさん@お腹いっぱい。2014/02/24(月) 11:07:05.89
/sbin/sh がないので /sbin だけじゃ NFS マウントできないのでは?
solaris は /sbin/sh があるので可能だけど。
0349名無しさん@お腹いっぱい。2014/02/24(月) 11:10:08.04
>>348
> /sbin/sh がないので
それどのOSの話?
0350名無しさん@お腹いっぱい。2014/02/24(月) 11:20:46.09
>>349
たいていの OS。
起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
/bin は少なくともローカルになければならない。
solaris はそうなっていないので、/sbin だけローカルにあれば /bin も NFS に置ける。
というか、/bin -> /usr/bin の symlink だけど。
0351名無しさん@お腹いっぱい。2014/02/24(月) 11:25:45.58
>>350
> 起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
それ思い込みじゃね?
0352名無しさん@お腹いっぱい。2014/02/24(月) 11:41:04.26
手元のUbuntu見ると、確かに/sbin/shは無いな
何故無いんだろう。まずいことでもあるんかな
0353名無しさん@お腹いっぱい。2014/02/24(月) 17:17:57.92
/etc/fstabに書かれたNFSなどは初回は無視されて、それマウントするのがinit.dのnetfsとかのシェルスクリプトだっけか
確かUbuntuでnetfs自体行方不明だったから仕方なくrc.localだかにmount -aを書いた覚えがあるけど、
最近はその手の初期化周りを制御するinitdを置き換えるlaunchdとかも出てきてるし今はどうなってるんだろうな?
0354名無しさん@お腹いっぱい。2014/02/24(月) 17:22:15.07
もういいかげんスレ違いじゃね。
0355名無しさん@お腹いっぱい。2014/02/24(月) 22:05:45.65
/sbin/shは昔はもっと意味があったのだよ
今は/usr何かを別のファイルシステムでマウントするとかほとんどないからな、さして重要な意味がないのでlinux何かでは一緒くた。
solarisでも今は形骸化してる。
/binだけローカルにあったって、実行できないんだぜ?
0356名無しさん@お腹いっぱい。2014/02/25(火) 01:07:06.24
>>343
ありゃ、逆でしたか失礼。
シェルの先頭で変数に入れちゃうから、かわってもそこを変えるだけですむようにはなっているのですがね。
バージョン違いでパスがかわるとめんどうだなぁ。
0357名無しさん@お腹いっぱい。2014/02/25(火) 01:17:07.19
シェルで@はOKですが、AがNGです。 シェルの中でfindコマンドは*(アスタリ スク)は使用できないのでしょうか? echoで表示は出来ているのですが。。。

# @ これは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.19
引用符外してみたらどうでしょ
0359名無しさん@お腹いっぱい。2014/02/25(火) 01:30:20.87
target='./log/*/*/*.log'
echo "$target"
find ${target} -type f

setって何だよ
0360名無しさん@お腹いっぱい。2014/02/25(火) 01:42:43.84
cmd.exeっていうシェルの環境変数設定コマンド
0361名無しさん@お腹いっぱい。2014/02/25(火) 01:44:55.10
これが社史編纂室系か
0362名無しさん@お腹いっぱい。2014/02/25(火) 02:02:27.91
社史を編纂しながらシェルスクリプトを作っていく、か

どうすればそんなうらやましい立場になれるんだ
0363名無しさん@お腹いっぱい。2014/02/25(火) 02:03:13.53
>>355
うちのDebianの/binで調べたら、/usrにリンクしてるのは、ping6だけだった。普通、/libに入れるんじゃないか。
0364名無しさん@お腹いっぱい。2014/02/25(火) 06:49:13.36
オレあと3年で定年だから社史編纂室みたいなところで平穏無事に時間だけ早く3年経って欲しいわ
0365名無しさん@お腹いっぱい。2014/02/25(火) 08:03:02.89
>>364
老い先短いんだから平穏無事はともかく時間を急いては勿体無いですよ、先輩。
0366名無しさん@お腹いっぱい。2014/02/25(火) 17:27:12.85
bashで、メールが来た時 You have mailって出ますよね。
これを、特定の相手からのメールのみ表示するとか、相手によって表示メッセージ変えることとかできますか?
0367名無しさん@お腹いっぱい。2014/02/25(火) 17:33:51.26
できません。
■ このスレッドは過去ログ倉庫に格納されています