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

シェルスクリプト総合 その14

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2009/01/29(木) 06:54:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。
0391名無しさん@お腹いっぱい。2009/04/01(水) 18:49:20
>>389
>>387をそのまま書く。
空白入れちゃだめ。
0392名無しさん@お腹いっぱい。2009/04/01(水) 18:59:18
>>391
できました。ありがとうございました(;´∀`)
0393名無しさん@お腹いっぱい。2009/04/01(水) 21:22:43
本日の祭り会場はこちら

【ネット】朝日新聞編集局員(49)、2ちゃんで荒らし行為&差別を助長する書き込み→朝日新聞からの書き込み規制され…★64
http://tsushima.2ch.net/test/read.cgi/newsplus/1238588235/


※ソース(3月31日付けasahi.com)
http://www.asahi.com/national/update/0331/TKY200903310332.html
0394名無しさん@お腹いっぱい。2009/04/02(木) 02:25:42
どこかの鯖のシェルスクリプト見るとパスワード書いてあったりするのかwww
なんだかなあ。
0395名無しさん@お腹いっぱい。2009/04/02(木) 08:47:42
findでひっかけたファイル一覧をforで回したいんですけど、引っかけたファイルにスペースが入っている場合、単語単位でforで回ってしまいます。
この場合って、事前にIFSをイジるしか解決策は無いのでしょうか?
findの-print0とかして、forのデリミタをNULLにしたりとかは出来ないのでしょうか?
0396名無しさん@お腹いっぱい。2009/04/02(木) 08:51:34
>>395
find . -exec sh -c 'for arg in "$@"; do echo "$arg"; done' dummy {} +
0397名無しさん@お腹いっぱい。2009/04/02(木) 09:09:17
>>396
ありがとうございます。
出来ました。
ただ何をやっているのか、理解していないと思われる部分があるので質問させて下さい。

dummyは何をやってるのでしょうか?
僕の理解としては、shの引数としてfindの1結果を渡しているんだと思うんですけど、shにとっての第1引数はdummyなので、
dummy ファイル名
が$@に入ってると思います。
ただ、
$ sh -c 'echo "$@"' arg1 arg2
とすると、arg22がechoされるので、dummyが必要なのは現象からわかるのですが、理由がわかりません。

それと、最後の+はどういう意味でしょう。findのmanでは\;で-execは終われと書いてあるように読めるのですが。

以上、すいませんが、解説お願い出来たらお願いします。
0398名無しさん@お腹いっぱい。2009/04/02(木) 10:55:42
どっちもマニュアル嫁だな

sh(1)より:

-c string If the -c option is present, then commands are read from string. If there are
arguments after the string, they are assigned to the positional parameters,
starting with $0.

find(1)より:

-exec command {} +
This variant of the -exec action runs the specified command on the selected files,
but the command line is built by appending each selected file name at the end; the
total number of invocations of the command will be much less than the number of
matched files. The command line is built in much the same way that xargs builds
its command lines. Only one instance of `{}' is allowed within the command. The
command is executed in the starting directory.
0399名無しさん@お腹いっぱい。2009/04/02(木) 11:33:43
forで回したいという要求に合ってない気がするが
空気読んで黙っておくよ
0400名無しさん@お腹いっぱい。2009/04/02(木) 11:47:12
ファイル名にシングルクォートが含まれていないと仮定するなら、

for files in `find . -printf "'%p' "`
do
echo "$files"
done


findに、「シェルで再利用可能なクォートを施した状態でprint」という
機能がない以上、完全な対応は無理。なので、>>396 のように sh -c を -exec する
方法しかない。
0401366NGNG?2BP(0)
お礼遅れてすいません!ありがとうございましたm(_ _)m
0402名無しさん@お腹いっぱい。2009/04/06(月) 02:09:11
LANGが日本語じゃなくてもshだと日本語が表示されるのと、
LANGが日本語じゃないとcshでは表示されない理由を教えてださい

[root@yama ~]# csh -c "setenv LANG C ; echo '日本語'"

[root@yama ~]# sh -c "export LANG=C ; echo '日本語'"
日本語
[root@yama ~]#
0403名無しさん@お腹いっぱい。2009/04/06(月) 02:24:30
% csh -c "setenv LANG C ; echo $LANG"
% sh -c "export LANG=C ; echo $LANG"
0404名無しさん@お腹いっぱい。2009/04/06(月) 07:46:03
>>403 は何がしたいんだ?
>>403 は $LANGがコマンドラインのシェルによって先に展開されてしまうから
shやcsh上での動作をテストしたことにはならない。

>>402 が聞いているのは >>403 とは全く別の問題。

だが、cshはスレ違いなので、これで終了。

ハイ次

0405名無しさん@お腹いっぱい。2009/04/06(月) 08:43:19
↑うぜえよおっさん
0406名無しさん@お腹いっぱい。2009/04/06(月) 17:45:12
solaris10を使用しています。
・やりたいこと
# zlogin <対象ノード>
$ df -h
$ exit
※ログインパスは無し
対象ノードへログインし、ディスク構成をとってきたい。
シェルスクリプト中でのログイン処理はどのように書いたらいいですか?
0407名無しさん@お腹いっぱい。2009/04/06(月) 17:47:46
>>406
ふつうに、
# zlogin 対象ノード df -h
でいいじゃん。
0408名無しさん@お腹いっぱい。2009/04/06(月) 18:22:46
>>407
!!!!
出来ました。ありがとうございました。
てっきりヒアドキュメントやらを駆使するのかと....
0409名無しさん@お腹いっぱい。2009/04/09(木) 20:07:15
シェルの特別パラメータMAILに、/var/mail/ユーザー名、をセットして
printenvもしましたが、メールを出して何分経ってもメッセージが出ません。
他に何か設定がいるのでしょうか?
0410名無しさん@お腹いっぱい。2009/04/09(木) 20:41:57
おまえはなにをいっているんだ
0411名無しさん@お腹いっぱい。2009/04/09(木) 21:27:47
済みませんが詳しくご存知の方のみ回答をお願いします
0412名無しさん@お腹いっぱい。2009/04/09(木) 22:03:08
ちんこかゆい
0413名無しさん@お腹いっぱい。2009/04/09(木) 23:21:26
>>409
質問の仕方が悪すぎるので出直してください。
0414名無しさん@お腹いっぱい。2009/04/10(金) 01:43:53
iccをよりgcc互換に近づけるために引数の加工をしようと思っているんだが、うまくいかない。
$@に渡ってくる外からの引数をfor文でまわして一部の引数を取り去るということをやろうとしている。
ダブルクウォートを含んだ引数のクウォートがなくなってしまったり、
シングルクウォートもなくなってしまうので混じって呼び出されていると処理の仕方が分からない。
よりよい引数群の加工の仕方、サブプロセスへの引数の渡し方を教えてほしい。

#!/bin/bash
#...(前略)
OPTIONS=""
# some options are needed to disregard
for i in "$@"
do
case $i in
-fmerge-all-constants)
;;
-mpreferred-stack-boundary=*)
;;
*)
ii=`echo $i | sed -e 's/\"/\\\"/g'`
OPTIONS="${OPTIONS} \"$ii\""
esac
done
0415後半2009/04/10(金) 01:44:36
#(1)本来の渡し方
#exec -a "/opt/intel/Compiler/11.0/074/bin/intel64/icc" /opt/intel/Compiler/11.0/074/bin/intel64/iccbin "$@";
#(2)普通に実行して戻り値も処理する
/opt/intel/Compiler/11.0/074/bin/intel64/iccbin "$@";
#(3)目的の実行法
#/opt/intel/Compiler/11.0/074/bin/intel64/iccbin $OPTIONS;
#(4)だが引数がおかしくなるのでこう渡している
#echo $OPTIONS | xargs /opt/intel/Compiler/11.0/074/bin/intel64/iccbin
last=$?
#iccbinがエラーだったときの処理
#...
0416名無しさん@お腹いっぱい。2009/04/10(金) 02:54:40
bashを使っていいんなら、配列を使えばどう?
・0から始まるインデックス変数を用意
・iccに渡したい引数なら、arg[インデックス]="$i"
・最後に、icc "${arg[@]}"
0417名無しさん@お腹いっぱい。2009/04/10(金) 04:06:51
>>416
早速書き換えてみた。スゲー!
長い間悩まされてたMySQLやapacheなどの大物がまたビルドできるようになったよ。ありがとう。
0418名無しさん@お腹いっぱい。2009/04/10(金) 06:45:45
>>414
bashで解決したみたいだけど、
このスレ的に /bin/sh での解決方法書いておくね。

$#を一旦セーブしておいて、
forで回しながら setで "$@" の後ろに必要な引数だけを追加し、
最後に shift 「セーブしてあった$#」で最初の引数を消す
というのがポイント。


#!/bin/sh

argc=$#
for i in "$@"
do
case $i in
-fmerge-all-constants)
;;
-mpreferred-stack-boundary=*)
;;
*)
set - "$@" "$i"
;;
esac
done

shift $argc
exec gcc "$@"
0419名無しさん@お腹いっぱい。2009/04/10(金) 07:53:01
>>418

>bashで解決したみたいだけど、
>このスレ的に /bin/sh での解決方法書いておくね。

どうでもいいです。
さらに、間違っているし。 

酢布?
0420名無しさん@お腹いっぱい。2009/04/10(金) 08:08:07
>>418 = 正解

>>419 が 「>>418 = 正解」を見て、
何を「間違っている」と勘違いしたかに興味あるな。

$# 引数の個数を覚えておいて、
同じ "$@" を干渉しないように使い回して
あとで shift する、って結構高度な技が使われてるよ。

高度過ぎて >>419 には「間違ってる」ように見えたかな(笑)
0421名無しさん@お腹いっぱい。2009/04/10(金) 08:23:55
>>420
>高度過ぎて >>419 には「間違ってる」ように見えたかな(笑)



うざいなぁ
418 = 420なの? 顔真っ赤なんだよねw

>exec gcc "$@"

すごく低度な感じ。だれも、そんなこと聞いてない。

まずは、謝ってくれ
0422名無しさん@お腹いっぱい。2009/04/10(金) 08:33:41
>>421
まさかそんなところに突っ込んだの?( )笑

icc に変えればいいだけじゃん。
多分 >>418 の環境には iccがないから、テスト的に gcc でテストしただけだろ。

本当は >>419 は本気で >>418 がどこか間違ってると勘違いしてて、
>>420 で指摘されてとっさに苦し紛れに 「exec gcc "$@"」とか言い訳したんだろな(笑)
0423名無しさん@お腹いっぱい。2009/04/10(金) 08:35:37
<丶`∀´>ウリは謝罪と賠償を要求ニダ
0424名無しさん@お腹いっぱい。2009/04/10(金) 08:37:53
>>419
for i in "$@" の ループ中に $@ をいじってるのを見て
反射的に間違っていると思った、に一票

(for の引数はループ前にしか評価されないから問題なし)

多分図星。
0425名無しさん@お腹いっぱい。2009/04/10(金) 08:46:38
指摘するときにMD5を添えなかった>>419の負け
0426名無しさん@お腹いっぱい。2009/04/10(金) 09:05:40
酢布って何?
0427名無しさん@お腹いっぱい。2009/04/10(金) 10:01:16
シェルスクリプトの画面出力と併行して実行ログを残したいんですが
どんなスクリプトの記述がありますか?
teeやscriptを入れると実行が止まってしまう
0428名無しさん@お腹いっぱい。2009/04/10(金) 10:18:00
全体を
{
} 2>&1 | tee hoge.log
とか
(
) 2>&1 | tee hoge.log
とかで囲ったら止まるの?
0429名無しさん@お腹いっぱい。2009/04/10(金) 10:44:26
screen
0430名無しさん@お腹いっぱい。2009/04/10(金) 11:19:24
もちろん、>>428 でも screenでも実行が止まってしまいます
0431名無しさん@お腹いっぱい。2009/04/10(金) 11:20:12
エスパーでも呼べ
0432名無しさん@お腹いっぱい。2009/04/10(金) 11:26:21
画面出力を保存すればいいよ
0433名無しさん@お腹いっぱい。2009/04/10(金) 11:53:51
デジカメで
0434名無しさん@お腹いっぱい。2009/04/11(土) 00:25:58
DVとかHDMIで出力して録画でもいいと思う。
0435名無しさん@お腹いっぱい。2009/04/11(土) 00:39:58
シリアルターミナルにしてシリアルプリンタ直結もいい
0436名無しさん@お腹いっぱい。2009/04/11(土) 00:42:02
そもそもttyというのは(ry
0437名無しさん@お腹いっぱい。2009/04/11(土) 14:04:29
やっぱりダム端末だなwww
0438名無しさん@お腹いっぱい。2009/04/11(土) 22:45:58
viで全角文字を入力することはできますか?
0439名無しさん@お腹いっぱい。2009/04/11(土) 23:09:26
>>438
もちろん、できません。というか、半角文字であってもできません。シェルスクリプトでは。
0440名無しさん@お腹いっぱい。2009/04/12(日) 02:07:24
全角文字がそもそもキーボードから入力できない現実。
0441名無しさん@お腹いっぱい。2009/04/12(日) 03:29:13
>>422
>>421
>まさかそんなところに突っ込んだの?( )笑

全く話にならないねw
はらいてー ぷけら
0442名無しさん@お腹いっぱい。2009/04/12(日) 03:30:32
>>422
もう、書き込まないで一生ろむってろっっwww

趣旨があってねーYO。ぷぷぷ
0443名無しさん@お腹いっぱい。2009/04/12(日) 09:21:49
自分の発する笑い声をあえて手を動かして文字にするところにその人の必死さが滲み出るよね
0444名無しさん@お腹いっぱい。2009/04/12(日) 11:28:35
数スレ前だったと思うが、ズレた指摘をする人がいたのを思い出した。
たしか、
for file in *
do
ある処理 "$file"
done

みたいな感じで、「ある処理」の部分を質問していた。
で、質問自体は解決していた。
解決後に、「それじゃダメ」みたいなことをいう人がいて、
何レスか続いたあと、結局「* じゃドットファイルが処理されない」ことを
言いたかったらしい。でも、質問者はforループ内の「ある処理」の部分について
質問したかっただけで、forの部分は質問のために参考に書いただけ
(実際のスクリプトではおそらく違うのだろう)

今回荒してる >>419 = >> 441 と同じ匂いがする。
0445名無しさん@お腹いっぱい。2009/04/12(日) 11:36:34
頭の病気だからスルーしる
0446名無しさん@お腹いっぱい。2009/04/12(日) 17:03:02
PGはそんなものだよ。細かい所が取り柄。女にはモテないけど。orz
0447名無しさん@お腹いっぱい。2009/04/12(日) 17:57:53
ドットファイルっていうのは、隠しファイル的な意味があって * に含まれないことが
利点なのだから、特別な処理をするわけでもない一般的なスクリプト中では
単純に * と書くことが良い。







などと、さらにズレてて無意味なレスをしてみる。
0448名無しさん@お腹いっぱい。2009/04/14(火) 00:22:50
女にモテるためには細かい事気にしないのも大事。
0449名無しさん@お腹いっぱい。2009/04/14(火) 13:21:52
女にモテるためには細かい事に気を配るのも大事
0450名無しさん@お腹いっぱい。2009/04/14(火) 14:44:57
C言語マスターすればモテモテ
0451名無しさん@お腹いっぱい。2009/04/14(火) 15:53:16
それはない
0452名無しさん@お腹いっぱい。2009/04/14(火) 22:14:33
女にモテるためには細い方がイイ
0453名無しさん@お腹いっぱい。2009/04/15(水) 00:32:23
はじめてのCぐらいは読んでヤリかたをマスターしておくのがマナー。
ガリが嫌いな女も居るぉ。
0454名無しさん@お腹いっぱい。2009/04/15(水) 09:41:51
お願いです先達の皆様

ファイルの作成日付を取得する方法を教えてください。
sh使ってます。
0455名無しさん@お腹いっぱい。2009/04/15(水) 09:50:55
↓これだけしか記録されていないので不可能。

st_atime: ファイルのデータが最後にアクセスされた時刻。
st_mtime: ファイルのデータが最後に修正された時刻。
st_ctime: ファイルステータスが最後に変更された時刻 (inode データの修正)。
0456名無しさん@お腹いっぱい。2009/04/15(水) 10:55:13
じゃあ最終更新日付でいいので、取得出来るコマンドはありますか?
0457名無しさん@お腹いっぱい。2009/04/15(水) 10:58:12
>>454
ctimeは「ファイルの作成日付」だと広く混同されているので、
「ファイルの作成日付を取得してくれ」と要求した人が
本当は「ctimeを取得してくれ」という意味で言ったのなら、
ctimeを取得すれば桶。
だから ls -lc (ls -lc --fu # for GNU) (ls -lcT # for *BSD)( ls -lce for solaris)
0458名無しさん@お腹いっぱい。2009/04/15(水) 11:15:50
いけました。

lsだとフォーマットが一定しないのでlsでやりたく無かったんですが(年が入ったり入らなかったりする)、
ls -lc 等だとその問題もないみたいです。
ありがとうございました。
0459名無しさん@お腹いっぱい。2009/04/15(水) 11:22:41
tcsh -fc 'filetest -C filename'
↑この方が環境依存性は小さくなる。
0460名無しさん@お腹いっぱい。2009/04/15(水) 11:37:32
tcshよりperlの方が入ってる可能性高いんじゃね?
0461名無しさん@お腹いっぱい。2009/04/16(木) 20:01:06
tcshは入ってないほうが多いだろうな。
perl入れてるなら何でも入れてもいいと思う。
0462名無しさん@お腹いっぱい。2009/04/18(土) 04:32:11
UNIXシェル入門を読んでいるけど、汎用的に書くって想像したよりかなり大変なんだね
CUIで困らない程度に使えるレベルなんだけど、どういう順序でshスクリプトを学習するのがいいのでしょうか?
1 普段、使っているbashの仕様を理解する。例題をヒントにいくつか、書いてみる。
2 ちょっとした自動化できる作業は、意識的にshスクリプトを書いて、どんどん試してみる
3 別のOSを用意し、どちらの環境でも汎用的に使えるスクリプトを書く。普段、良く使うプログラムのいろいろな設定ファイルも極力同一のものにしてみる
4
5

3以降の先は、まったく想像つかないんだけど
0463名無しさん@お腹いっぱい。2009/04/18(土) 05:36:49
bash捨ててdashで書く…
bashにもBash POSIX Modeってのがあるか。
コマンド類はまぁ気合で。
#busyboxあたりにposix互換モードがあると便利なのになぁ。
0464名無しさん@お腹いっぱい。2009/04/18(土) 10:07:33
>>462
shとbashの違い以前に、どこまで古いバージョンに対応するかという問題
もあるし、完全に汎用なシェルスクリプトを追求して、時間コストや労力
に見合う結果を得られるのだろうか。

結局、対応したいOSやバージョン、そこから限定されるシェルの種類とバ
ージョンを設定して、その範囲で動作するものを作るしかないし、動作確
認はその限定された環境で行えばよいのではないだろうか。

仕事なのか趣味なのかによっても違うだろうし。
0465名無しさん@お腹いっぱい。2009/04/18(土) 10:44:46
>>463
bashのPOSIX Modeでbashismは防げない。
でも、dashもPOSIX互換を標榜しつつ、細かいところで
POSIXの機能がなかったりする。
困ったね。
0466名無しさん@お腹いっぱい。2009/04/18(土) 11:09:11
そもそもposixに対応することと「汎用的に書く」ことは全然別の話。
Solarisの/bin/shのように、posix非対応のシェルが標準シェルになってるし、
posix準拠を基準にしてしまうと、「汎用的」ではなくなってしまう。
だから、posixは忘れるのが吉。
0467名無しさん@お腹いっぱい。2009/04/18(土) 12:03:03
>>466
手間がかかるけど、posix規格(または、何かの規格)を意識して書く事は、いいことでしょ?
個人的には方向性も大きく違っていないと思っているんだけど
もちろん、どうしても例外的な事例が発生して、それをどうするんだというのは、あるんだろうけど
Solarisは目の前に現れたら考える

とりあえず、総合すると自分がよく使うOSに対応して、ある要請があったら、そのOSの対応を考えて、
随時対処していく感じが労力と時間を考慮すると現実的になんですかね

100行程度の高機能ではない簡易スクリプトをとりあえず自分の狭い世界観で汎用的に
書くことを想定としています

shスクリプトを学習したい理由は、
・shの機能を通じて、UNIXを理解したいこと
・頻出する作業は自動化して労力を軽減したいこと
 例え、コーディングのほうが結果的には労力かかったとしても
 自分はまだ学習レベルなので労力が結果的にトントンなら大成功
汎用的に書きたい理由は、
・本でそう奨励しているから(?)w
・「汎用的に」書くって響きがかっこいいじゃん
・プログラマなら、ケースバイケースで汎用的書けないと恥ずかしいでしょ
・まあ、多少なりとも汎用性を意識して書くことは、悪いことにはならないよな

馬鹿ってかっこいいなあw
0468名無しさん@お腹いっぱい。2009/04/18(土) 12:41:57
前の案件で1000行くらいのbashのバッチ10本くらい作ったら
後任者が全く理解できずに大惨事になってると風の噂で聞いたので反省している
文字のエンコードするのにiconv何発もかましたうえに\\\\\\\\とかやってるからなぁ
0469名無しさん@お腹いっぱい。2009/04/18(土) 12:47:53
>>468
やっつけ仕事ではなく、ちゃんと他人が読むためのわかりやすいコードを書いたんでしょ?
もちろん、ポイントポイントでコメントでの解説付きで
0470名無しさん@お腹いっぱい。2009/04/18(土) 12:51:34
反省する必要ないよ。後任者が理解できないことで
前任者のすごさをアピールできる。

もちろん、コメントなど書いてはいけない。
0471名無しさん@お腹いっぱい。2009/04/18(土) 12:59:24
Cでそれやったら無能かつ自分勝手な前任者ってことになるんだから、
bashだって同じだろ
0472名無しさん@お腹いっぱい。2009/04/18(土) 13:22:58
3年前に己が書いた1000行くらいのbashのバッチがあったとして
一部修正することになって、ソースを読み込むことになったら、どのくらいの時間で
読めるものだろうか
また、他人が一部修正を任されることになって、読み込むことになって、どのくらいの時間で
読めるものだろうか
0473名無しさん@お腹いっぱい。2009/04/18(土) 13:23:06
>>469
コメントどころか基本設計詳細設計まである
要は複雑なshellの経験者って簡単に集められないから
なんでもshellでやるのもよくないねみたいな
0474名無しさん@お腹いっぱい。2009/04/18(土) 13:36:10
うそーん
0475名無しさん@お腹いっぱい。2009/04/18(土) 13:40:18
自分には解って他人には解りにくいコードをわざと用いること。
コメントもドキュメントも残さないこと。

リストラ時代の保身テクニックですな。
0476名無しさん@お腹いっぱい。2009/04/18(土) 13:52:46
>>473
そこまでやっているなら、問題ないと思うけどなあ
bashのバッチで書かずに何でやるのよ?
学習するチャンスだし、峠を越えたら、あとあと楽になりそうなんだが
今ならPython?

その反省を踏まえて、1から再設計するなら、どういう比率でどの言語でやるんですか?
0477名無しさん@お腹いっぱい。2009/04/18(土) 13:54:18
>>475
それで褒められるのはdjbみたいな教祖様だけだろ。
まあ、djb信者以外は誰も褒めないけどさ。
0478名無しさん@お腹いっぱい。2009/04/18(土) 14:07:00
>>476
シェルスクリプトなんて(大幅に譲歩して)100行を越えたら
別のスクリプト言語で書き直すべきだと思う。
それこそ、PythonでもRubyでも良いからさ。
0479名無しさん@お腹いっぱい。2009/04/18(土) 14:09:06
GNUのconfigureに言ってくれ
0480名無しさん@お腹いっぱい。2009/04/18(土) 14:54:27
>>478
わかる気もするけど
Pythonをちょっとやったけど、クラス化、パッケージ化とか、ちゃんと理解していないんだよなあ
比較的に若い言語というのもあって、他の言語の良いところを取り入れて、すごく書きやすいし、保守しやすいしでいいんだけど、
Pythonで使える概念を全部使って書かれたものを、設計を理解して、他人が保守するとなると大変そうだよね

LL言語でもPerl派、Ruby派、Python派といるだろうし
使用する言語を感情論では決めるべきではないけど
Python派「Rubyを使うなら、コメントどころか基本設計詳細設計まであるbashのバッチでいいじゃん」という意見もあるだろうし
>>473の選択でよかったんじゃないかと思う

もちろん、LL言語でいくのもありだと思うし、後任者の労力的には大差ないと思うけどさ
0481名無しさん@お腹いっぱい。2009/04/18(土) 14:58:54
シェルスクリプトで書いてあって理解できないなら他のでも無理だとおもうヨ
0482名無しさん@お腹いっぱい。2009/04/18(土) 23:05:09
単純な機能ごとに処理を区切って関数化し、相応の名前を付けて書けば
どんな言語だろうと大枠で理解できるよね。過不足なくコメントも付けてさ。

んで、\\\\ みたいなトリッキーな処理は、ちょっと詳しく説明をコメントで
書いてあげればいいはず。

これで理解できなければ後任者が無能、逆に上記のように作られてなくて、
C言語でいうところの、全部がグローバル変数だったり、main関数だけの
ような構造であれば前任者が無能。

ネット関連の超有名企業に勤めてるんだが、エラー処理もロクにない
クソスクリプトばっかりで笑ってしまうorz
0483名無しさん@お腹いっぱい。2009/04/18(土) 23:15:01
シェルスクリプトでは基本的に全部がグローバル変数なわけだが。

あと、「詳しく説明をコメントで書く」って言うけど、
書くなら当然英語で書くと言う意味で言ってるんだよね?

エラー処理をちゃんとやらなくても済んでしまうのがシェルスクリプトのいいところ。
0484名無しさん@お腹いっぱい。2009/04/18(土) 23:47:59
全部グローバル変数なのは仕様だから仕方ないけど、書き方ってもんがあるじゃん。
# 漏れは、局所化したいだけの理由でlocalが書けるbashスクリプトにしちゃうことあるけど。

英語でコメント書かないといけない理由は分からん。

エラー処理してなくてショボイ不具合が結構出るのも納得いかん。
0485名無しさん@お腹いっぱい。2009/04/19(日) 00:42:21
>>483, 484
昔は、loop 系は sub-shell 起こすから loop 内部で宣言した
変数は loop 外から参照できないってのがあったんだが
0486名無しさん@お腹いっぱい。2009/04/19(日) 00:54:53
今でも、whle とかに | 使うとサブシェルになるね。
ならない高機能シェルもあるけどさ。
ループ外で変数が取得できないのは意外と不便w
0487名無しさん@お腹いっぱい。2009/04/19(日) 01:29:35
shってシンプルだが癖は強いからなあ。
ベル研系の言語はどれもそうだな。
副作用禁止で退屈なコード書きましょうと教育された世代には
厳しいもんがあるよ
0488名無しさん@お腹いっぱい。2009/04/19(日) 01:42:00
純正だしw
0489名無しさん@お腹いっぱい。2009/04/19(日) 03:39:34
>>487
awkやRATFORは当時凄くシンプルで仕様の美しい言語。
0490名無しさん@お腹いっぱい。2009/04/19(日) 08:27:53
>>484
> 英語でコメント書かないといけない理由は分からん。

当然社内に外国人担当者もいる。
書いたスクリプトが海外の支社に回ることもある。
コンソールなど日本語が通らない環境でもスクリプトを読みたい時がある。
シェルによってはコメントに日本語が入ったスクリプトをLANG=Cで実行すると発狂する
日本語だと、EUCかUTF-8かJISかSJIS(←これはないが)か悩む必要がある。
0491名無しさん@お腹いっぱい。2009/04/19(日) 11:04:10
偽英語で意味不明のコメント書かれるよりは…
コメント書くために時間かけられるよりは…
時間書けるのを避けるために嘘コメントが残るよりは…
というわけで、母国語のコメント推奨。

必要な時に翻訳すれば良い。
■ このスレッドは過去ログ倉庫に格納されています