シェルスクリプト総合 その19
■ このスレッドは過去ログ倉庫に格納されています
0001シェルスクリプトライター
2011/12/10(土) 20:06:40.38スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合は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 でトレースしましょう。
前スレ
シェルスクリプト総合 その18
http://hibari.2ch.net/test/read.cgi/unix/1308195527/
次スレは >>970 で。
0274名無しさん@お腹いっぱい。
2012/01/31(火) 19:11:12.350275名無しさん@お腹いっぱい。
2012/01/31(火) 19:29:02.960276名無しさん@お腹いっぱい。
2012/01/31(火) 20:30:08.94$ open -a /Application/TextEdit.app foo.txt
$ open -a /Application/Emacs.app/Contents/MacOS/Emacs foo.txt
こんなコマンド。
0277名無しさん@お腹いっぱい。
2012/01/31(火) 21:06:38.950278名無しさん@お腹いっぱい。
2012/01/31(火) 21:16:36.010279名無しさん@お腹いっぱい。
2012/02/01(水) 11:43:16.32open .
でカレントディレクトリをGUIで開かせるってのが一番使うかな
0280名無しさん@お腹いっぱい。
2012/02/01(水) 12:05:32.980281名無しさん@お腹いっぱい。
2012/02/01(水) 12:58:13.470282名無しさん@お腹いっぱい。
2012/02/01(水) 16:07:29.43さいしょから samefile なり samesame でよいのでは
0283265
2012/02/01(水) 17:06:16.13みんなありがとう!
こうかな?
0284265
2012/02/01(水) 17:09:15.950285名無しさん@お腹いっぱい。
2012/02/01(水) 18:13:12.63>>269は全然わかってないマヌケな素人だから、奴の指摘は全部無視していい。
サイズなんて調べる必要ない。
0286名無しさん@お腹いっぱい。
2012/02/01(水) 23:15:24.01man testを見てみると、以下の2つのオプションの説明があります。
1.-nオプションのところ
True if the length of string is nonzero.
2.stringオプションのところ
True if string is not the null string.
これらの違いは、何があるのでしょうか?それとも同じなのでしょうか?
出来ればサンプルスクリプトで説明していただけると助かります。
0287名無しさん@お腹いっぱい。
2012/02/02(木) 00:06:01.320288名無しさん@お腹いっぱい。
2012/02/02(木) 00:19:26.32直接引用しろ。うちでは等価って書いてある
0289名無しさん@お腹いっぱい。
2012/02/02(木) 01:32:54.28何シェルがいいですか。
0290名無しさん@お腹いっぱい。
2012/02/02(木) 01:40:36.62http://www.freebsd.org/cgi/man.cgi?query=test&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html
-n string True if the length of string is nonzero.
string True if string is not the null string.
違い
test -n $nonexistent; $? <= バグ? test -z $nonexistent; $?と矛盾する
test $nonexistent; $?
0291名無しさん@お腹いっぱい。
2012/02/02(木) 03:44:03.15>>1
特記ない限り bourne shell ということは、それを選択すれば無難ということ。
Linux オンリーなら bash だろうけど。
0292名無しさん@お腹いっぱい。
2012/02/02(木) 06:26:43.33そんな貴方に、Windows Power Shell。
0293名無しさん@お腹いっぱい。
2012/02/02(木) 08:40:58.52なんだよ、矛盾するって。
0294名無しさん@お腹いっぱい。
2012/02/02(木) 08:59:55.630295名無しさん@お腹いっぱい。
2012/02/02(木) 09:17:20.91なんかUNIXのシェルより強力って書いてあるのが多いけどマジ?
0297名無しさん@お腹いっぱい。
2012/02/03(金) 10:31:06.580298名無しさん@お腹いっぱい。
2012/02/03(金) 20:58:42.500299名無しさん@お腹いっぱい。
2012/02/04(土) 08:30:04.97シェルそのものの機能は確かに強力だけど
肝心のコマンド資産がなさ過ぎて実用シェルとしてはなあ…
0300名無しさん@お腹いっぱい。
2012/02/04(土) 08:42:10.790301265
2012/02/04(土) 22:16:58.57最終的にこれで出来ました!
みなさんありがとうお(^ω^)
http://cl.ly/152U342e2o212b2B1q3j
0302名無しさん@お腹いっぱい。
2012/02/09(木) 07:27:17.71それを参考にシステムコールや動的ライブラリをロード・実行する機能を持ったシェルが作られたとしても
自分はあんまり使いたいと思わんな。そういう機能の需要と言うか必要性はあるのかどうか
0303名無しさん@お腹いっぱい。
2012/02/09(木) 14:49:30.97その手の機能が欲しいときはぶっちゃけLL使えばよくね、と俺は思ってしまう
それよりもシェルとしては以下の点がネックで、cmd.exeに比べてすら劣る
・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
事実上不可能
・入力リダイレクトが使えない
・オブジェクトパイプラインという一見高機能なものを備えているが、代償として
バイナリデータをパイプやリダイレクトで扱えない
最後の問題が困る。外部コマンドをパイプでチェインする場合もPowerShellが
間に割って入って無駄にテキストに変換するので、データを壊すだけでなく
多分無駄に非効率でもある
XPではそれに加えて我慢がならないほど起動が遅かった(ngen使っても)ので
遊んでみようという気にすらならなかったけど
Windows7では起動時間は我慢できる範疇になったな
0304名無しさん@お腹いっぱい。
2012/02/09(木) 16:28:39.02だったらgdgd書かなきゃいい
>・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
> 事実上不可能
うんこやん
0306名無しさん@お腹いっぱい。
2012/02/09(木) 22:51:58.68$ cat hoge
$GLOBALS['hoge']['huga']
$GLOBALShogehuga
とします。
$ grep $GLOBALS\[\'hoge\'\]\[\'huga\'\] hoge
とすると、どちらの行も引っかかってしまいます。
$GLOBALS['hoge']['huga']
だけ引っかけたいのですが、どうすればよいでしょうか、ご教示ください。
0307名無しさん@お腹いっぱい。
2012/02/09(木) 23:03:56.620308名無しさん@お腹いっぱい。
2012/02/09(木) 23:05:25.02¥$GLOBALS¥['hoge'¥]¥['huga'¥]
なので、これをシェル的にクォートする必要がある。
シングルクォートでがんばるなら
'¥$GLOBALS¥['¥''hoge'¥''¥]¥['¥''huga'¥''¥]'
正規表現として解釈されることを意図していないならfgrep使えば?
とか思ったりもする。
0309名無しさん@お腹いっぱい。
2012/02/09(木) 23:42:52.43$ grep -F "\$GLOBALS['hoge']['huga']" hoge
0310名無しさん@お腹いっぱい。
2012/02/10(金) 08:45:25.71すれ違いかもしれんが参考になった
(unix shell 人視点の評価として)
0311名無しさん@お腹いっぱい。
2012/02/10(金) 12:45:56.45すれ違いかもしれんが
> (unix shell 人視点の評価として)
こゆとき俺はこーかく
( unix shell 人視点の評価として )
0312名無しさん@お腹いっぱい。
2012/02/10(金) 13:15:55.88そう書くとunixから定義しないといけない
0313名無しさん@お腹いっぱい。
2012/02/10(金) 13:41:46.960314名無しさん@お腹いっぱい。
2012/02/10(金) 13:46:55.140315名無しさん@お腹いっぱい。
2012/02/10(金) 13:47:22.31grep の件、man もロクに読まない私にお力添えいただき、ありがとうございました。
m(__)m
0316名無しさん@お腹いっぱい。
2012/02/13(月) 21:53:21.26あるスクリプトをホームディレクトリに作ったのですが、以下の条件があります。
・他の人もそのスクリプトを実行できるようにしたい
・でもファイルの中身は他の人は見れないようにしたい。
このような場合、一般的にはどのような手法がとられるのでしょうか?
0317名無しさん@お腹いっぱい。
2012/02/13(月) 22:07:38.540318名無しさん@お腹いっぱい。
2012/02/13(月) 22:09:09.600319名無しさん@お腹いっぱい。
2012/02/13(月) 22:20:32.11中身はみられない。適当なシェルスクリプトを作って同じパーミッションにして
みたけど、実行したらPermission deniedsetuidになってしまった。 (OSXにて)
0320名無しさん@お腹いっぱい。
2012/02/13(月) 22:21:22.410321名無しさん@お腹いっぱい。
2012/02/14(火) 00:05:14.25そして、インタープリターは実行する人の権限で動作する。
したがって、スクリプトは実行する人が読むことができる。できなければ実行できない。
0322名無しさん@お腹いっぱい。
2012/02/14(火) 00:21:01.040323名無しさん@お腹いっぱい。
2012/02/14(火) 01:25:34.750324名無しさん@お腹いっぱい。
2012/02/14(火) 06:10:33.210325名無しさん@お腹いっぱい。
2012/02/14(火) 06:50:57.33ユーザーはスクリプトの実行は禁止ですが、
最近、ユーザーでも自分のホームフォルダーにスクリプトをコピーし、
X権限をすることによってスクリプトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようにする方法はありますか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
0326名無しさん@お腹いっぱい。
2012/02/14(火) 08:28:25.69> ユーザーはスクリプトの実行は禁止ですが、
なんか御幣のある言い方をしているようにも思えるが、つまりのところ特定コマンド
以外は実行させたくないんだろ?
であればログインスクリプトを制限がきつい奴にすれば出来る。
bash の rbash の項目の man page かググって調べろ。
.bashrc や .bash_profile などを個人で書き換えられないようにしておかないと意味が無かったりと
環境整備には手間がかかるとは思うが。
> ユーザーのフォルダーではたとえX権限がされていても
> 実行できないようにする方法はありますか?
以下を実行して↑に何の意味も無いことを学べ。
chmod 644 sample.sh
/bin/sh ./sample.sh
これ以上はスレチなのでここでの質問をクローズした上で、以上の情報を元に自分で調べるか
適切なスレに行って再質問されたし。
0327名無しさん@お腹いっぱい。
2012/02/14(火) 08:30:28.16かまっちゃいかんよ。
0328名無しさん@お腹いっぱい。
2012/02/14(火) 08:34:56.59http://toro.2ch.net/test/read.cgi/unix/1000022300/775-
0329名無しさん@お腹いっぱい。
2012/02/16(木) 01:53:58.030330名無しさん@お腹いっぱい。
2012/02/16(木) 02:11:23.480331名無しさん@お腹いっぱい。
2012/02/16(木) 03:11:31.800332名無しさん@お腹いっぱい。
2012/02/16(木) 15:25:59.880333名無しさん@お腹いっぱい。
2012/02/16(木) 15:26:22.530334名無しさん@お腹いっぱい。
2012/02/16(木) 15:38:01.31int main(){return system("シェルスクリプト本文");}
って書けばコンパイルできるよ。
C言語上での文字列改行を行なえば複数行も記述できる。
0335名無しさん@お腹いっぱい。
2012/02/16(木) 19:45:29.070336名無しさん@お腹いっぱい。
2012/02/19(日) 20:05:22.420337名無しさん@お腹いっぱい。
2012/02/19(日) 20:23:44.750338名無しさん@お腹いっぱい。
2012/02/19(日) 21:15:12.00これがヒントなんですか??
全然理解できへん(~_~;)
0339名無しさん@お腹いっぱい。
2012/02/19(日) 21:46:07.410340名無しさん@お腹いっぱい。
2012/02/20(月) 02:10:00.67全く理解できません。
しょっぱなにこれが有るんですが、
stty status '^T'
なんのためにあるのでしょうか?
rcファイルが読まれ始めるときは、^Cや^Hが設定されていないという事?
ですか?
さらに、
if [ -f /etc/rc.first ]
then
. /etc/rc.first
fi
という一文は
/etc/rc.firstが存在するならば、/etc/rc.firstを実行するという意味だと思うんですが、
-fオプションはググると
「file が普通のファイルならば真となる。」
とありましたが、普通ではないファイルって有るんでしょうか?
0341名無しさん@お腹いっぱい。
2012/02/20(月) 06:22:24.920342名無しさん@お腹いっぱい。
2012/02/20(月) 07:02:39.190343名無しさん@お腹いっぱい。
2012/02/20(月) 09:07:07.89UNIXではデータを書いたり読んだりするいわゆるファイルの他にも
OSが管理している資源やその他の物に名前をつけてファイルとして
扱うことができる。
デバイスファイルやディレクトリ、ソケット、シンボリックリンク、その他。
0344名無しさん@お腹いっぱい。
2012/02/20(月) 19:39:24.99「レギュラーファイル」でいいんじゃないかと思うが。
0345名無しさん@お腹いっぱい。
2012/02/20(月) 19:41:36.51「16進数のテキストデータ」はどこにあって、どういう形式なのか?
「バイナリ化」するとは具体的にどういうことか?
元の「16進数のテキストデータ」はバイナリではないのか?
Unicode文字のエスケープ表現か何かなのか?
0346名無しさん@お腹いっぱい。
2012/02/20(月) 20:17:11.46regular fileに対する確立された訳語は「通常ファイル」じゃないか。
0347名無しさん@お腹いっぱい。
2012/02/20(月) 20:39:01.78「FILEが通常、ファイルなら真になる」
通常はファイルならば真なんですね。通常じゃない時は真にならないんですか?
0348名無しさん@お腹いっぱい。
2012/02/20(月) 21:50:38.98test -f /etc/passwd && echo file || echo 'not file'
test -f /etc && echo file || echo 'not file'
0349名無しさん@お腹いっぱい。
2012/02/20(月) 22:05:43.260350名無しさん@お腹いっぱい。
2012/02/20(月) 22:38:49.99つまんねー。矢吹先生の方が数段上。
0351名無しさん@お腹いっぱい。
2012/02/22(水) 17:59:45.940352名無しさん@お腹いっぱい。
2012/02/22(水) 18:15:44.90デバイスファイルやソケット、FIFO等でも test -f は真になる。
よって、test -fをレギュラーファイルかどうかのテストに用いてはならない。
豆な。
0353名無しさん@お腹いっぱい。
2012/02/22(水) 18:24:10.830354名無しさん@お腹いっぱい。
2012/02/22(水) 20:22:31.070355名無しさん@お腹いっぱい。
2012/02/22(水) 21:02:05.15たとえばどのシェル?
0356名無しさん@お腹いっぱい。
2012/02/22(水) 21:09:08.260357名無しさん@お腹いっぱい。
2012/02/22(水) 21:16:49.10-e が追加されたのは割と最近。純正/bin/shのtestには-eがない。
0358名無しさん@お腹いっぱい。
2012/02/22(水) 22:36:40.15/bin/testとは別に /bin/sh の built-in コマンドがあるという主張?
0359名無しさん@お腹いっぱい。
2012/02/22(水) 22:41:11.670360名無しさん@お腹いっぱい。
2012/02/22(水) 23:01:26.59(ba|z)sh 辺りを /bin/sh として symlink/hardlink して使ってれば built-in だわな
ash ベースでもコンパイルの仕方によっては built-in になるし
0361名無しさん@お腹いっぱい。
2012/02/22(水) 23:40:20.000362名無しさん@お腹いっぱい。
2012/02/23(木) 00:25:07.780363340
2012/02/23(木) 00:58:08.13ところで
/etc/rcの先頭に
>stty status '^T'
が有るというのは、
rcスクリプトが読まれ始めるときは、sttyの設定がされてないので
rcスクリプトから実行されるプログラムの
ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
に設定していると言う理解で良いでしょうか?
0364名無しさん@お腹いっぱい。
2012/02/23(木) 01:22:49.780365名無しさん@お腹いっぱい。
2012/02/23(木) 01:37:03.640366名無しさん@お腹いっぱい。
2012/02/23(木) 08:28:33.61デフォルトの設定がユーザを混乱させるからなんじゃないかな。
> ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
多分違う、^Tを入力するとカーネルに対して、「何か」をしろという指令が非同期に飛んでいく。
カーネルはユーザーの端末に対してメッセージを出すことはしない。
「何か」が何なのかは、statusなんて機能は使ったことないから知らない。
0367名無しさん@お腹いっぱい。
2012/02/23(木) 10:49:16.920368名無しさん@お腹いっぱい。
2012/02/23(木) 11:56:49.03表示する方法、される内容はカーネル、端末依存。
0369名無しさん@お腹いっぱい。
2012/02/23(木) 12:09:58.01ああ、なるほど。googleでトップに来てる
http://freebsd.g.hatena.ne.jp/minus_zero/20070903
で実験して納得した。
rcの中でハングったりした時に、すかさずC-tするとどのプロセスが刺さってるかわかるんだな。
これはいい事を憶えた。
0370名無しさん@お腹いっぱい。
2012/02/24(金) 23:41:20.22foo.bar@example.com → foo****@example.com
ドメイン部分はそのままで、先頭3文字程度残して、残りの部分はメールアドレスの文字数が変わらないように
任意の文字で埋めたい。今は下のように変数にメールアドレスを入れて処理しているけど、ちょっと不恰好
MADR=foo.bar@example.com
MASK='*'
RC=3
DOM="${MADR##*@}"
let MC="${#MADR}"-"$RC"-"${#DOM}"-1
echo "$MADR"
echo "${MADR:0:$RC}`yes "$MASK" |tr -d '\n' |head -c"$MC"`@$DOM"
もう少し楽に処理できないでしょうか?
0371名無しさん@お腹いっぱい。
2012/02/25(土) 03:53:15.28echo foo.bar@example.com | ruby -pe '$_.sub!(/(?<=[^@]{3})[^@]*(?=@\w+)/){|s|"*"*s.size}'
perlならもっと短くできるんじゃないかなぁ。
0372名無しさん@お腹いっぱい。
2012/02/25(土) 04:08:45.24sedを使うのはいかが?
echo "user@example.com" | sed -e 's/\(...\).*@\(.*\)/\1...@\2/g'
ユーザ名が必ず3文字以上ならこれで良いはず。
ユーザ名が2文字以下だとそのまま出力される。
(元のスクリプトでも2文字以下ならそのままっぽいが。)
0373名無しさん@お腹いっぱい。
2012/02/25(土) 05:22:15.23■ このスレッドは過去ログ倉庫に格納されています