シェルスクリプト総合 その20
レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。
2012/06/08(金) 00:35:51.19スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合は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 でトレースしましょう。
前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0002名無しさん@お腹いっぱい。
2012/06/08(金) 01:03:54.93レイヤードシェル
もしくは
シェルレイヤー
という物が存在していたらしいのですが、
どんな物だったのでしょうか?
ジョブコントロールできるらしいのですが。
0003名無しさん@お腹いっぱい。
2012/06/08(金) 02:06:15.150004名無しさん@お腹いっぱい。
2012/06/08(金) 02:15:08.82何のための板だよここwww
0005名無しさん@お腹いっぱい。
2012/06/08(金) 06:17:43.380006名無しさん@お腹いっぱい。
2012/06/08(金) 06:33:16.03A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
UNIX の勉強には向いていません。
0007名無しさん@お腹いっぱい。
2012/06/08(金) 07:20:45.00頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw
0008名無しさん@お腹いっぱい。
2012/06/08(金) 07:44:41.28GNUScreenから画面管理を引いたようなもの。
0009名無しさん@お腹いっぱい。
2012/06/08(金) 07:58:45.93つまり座学で基礎理論を学んでから出直せってこと?
0010名無しさん@お腹いっぱい。
2012/06/08(金) 09:38:32.41衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。
0011名無しさん@お腹いっぱい。
2012/06/08(金) 09:49:49.84http://docstore.mik.ua/orelly/unix/unixnut/c02_191.htm
http://www.unix.com/man-page/All/1/shl/
http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/HowToUnix/3-1.html
0012名無しさん@お腹いっぱい。
2012/06/08(金) 09:55:28.150013名無しさん@お腹いっぱい。
2012/06/08(金) 16:51:20.05... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。
0015名無しさん@お腹いっぱい。
2012/06/09(土) 13:48:39.990016名無しさん@お腹いっぱい。
2012/06/09(土) 13:48:53.77素人は grep 〜 | head -n 2 | tail -n 1 なんてするところだろうな
Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる
0017名無しさん@お腹いっぱい。
2012/06/09(土) 13:53:34.23grep -A1
でいいじゃん。
一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。
0018名無しさん@お腹いっぱい。
2012/06/09(土) 13:57:44.31それは一致した行の次の行を取り出したい場合だろw 欲嫁
0019名無しさん@お腹いっぱい。
2012/06/09(土) 14:01:37.890020名無しさん@お腹いっぱい。
2012/06/09(土) 14:07:19.90まあ、ふつーはそれすらせずに>>15だが。
0021名無しさん@お腹いっぱい。
2012/06/09(土) 14:18:33.49取り出したいのですが、何か簡便な方法はありませんか?」
という質問だったとしたら?
0022名無しさん@お腹いっぱい。
2012/06/09(土) 14:18:49.340023名無しさん@お腹いっぱい。
2012/06/09(土) 17:31:36.34あんまり釣れないね。
0024名無しさん@お腹いっぱい。
2012/06/09(土) 21:38:41.95何か簡便な方法がありましたらお願いします。
0025名無しさん@お腹いっぱい。
2012/06/09(土) 21:46:40.88次の行も欲しいってのなら>>17の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep 〜 | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ
0027名無しさん@お腹いっぱい。
2012/06/10(日) 05:16:55.250028名無しさん@お腹いっぱい。
2012/06/10(日) 14:21:25.03たとえば
hoge=`ls -l`
とやると、改行が格納されません。
改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?
0029名無しさん@お腹いっぱい。
2012/06/10(日) 14:32:53.34hoge=`ls -l` で改行は格納される。
echo $hoge ではなく、
echo "$hoge"
で変数の値を取り出すこと。
0030名無しさん@お腹いっぱい。
2012/06/10(日) 14:43:07.380031名無しさん@お腹いっぱい。
2012/06/12(火) 18:12:34.43このコマンドどこに問題がありますか?
最初の20行分しか処理されずに止まっちゃうんだけど・・・泣
0032名無しさん@お腹いっぱい。
2012/06/12(火) 18:19:37.78#!/bin/bash
ssh user@hostname
パスワードを入力するコマンド
上記のようなスクリプトが作りたいです。
どなたか教えて頂けないでしょうか。よろしくお願いします。
0033名無しさん@お腹いっぱい。
2012/06/12(火) 18:34:26.09echo unko | ssh user@hostname
0034名無しさん@お腹いっぱい。
2012/06/12(火) 18:46:46.29公開鍵認証じゃだめなん?
0035名無しさん@お腹いっぱい。
2012/06/12(火) 18:49:57.90それじゃだめじゃね。
0036名無しさん@お腹いっぱい。
2012/06/12(火) 18:59:21.99>>31
はスレチでした?
0037名無しさん@お腹いっぱい。
2012/06/12(火) 19:06:40.96試してみたのですが、パスワード入力を求められました。。
>>34
パスワード入力したいです。
0038名無しさん@お腹いっぱい。
2012/06/12(火) 19:16:56.4720行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。
0039名無しさん@お腹いっぱい。
2012/06/12(火) 20:08:55.76すみませんが詳しい方のみ回答をお願いします
0040名無しさん@お腹いっぱい。
2012/06/12(火) 20:17:55.37> progress.log じゃなくて
>> progress.log じゃないの?
0041名無しさん@お腹いっぱい。
2012/06/12(火) 20:20:23.43すみませんが詳しい方のみ回答をお願いします
0042名無しさん@お腹いっぱい。
2012/06/12(火) 20:26:15.130043名無しさん@お腹いっぱい。
2012/06/12(火) 20:29:12.040044名無しさん@お腹いっぱい。
2012/06/12(火) 20:29:30.99すみませんが詳しい方のみ回答をお願いします
0045名無しさん@お腹いっぱい。
2012/06/12(火) 20:31:12.330046名無しさん@お腹いっぱい。
2012/06/12(火) 20:33:43.17findってこと?
結局どうすれば正解なの?
入力(ls -1):
a
b
c
d
e
f
実行されたいコマンド(xargs -L1 -P2)
./a.out a
./a.out b
====終わってから
./a.out c
./a.out d
====終わってから
./a.out e
./a.out f
って感じにしたいわけだけど。
0047名無しさん@お腹いっぱい。
2012/06/12(火) 20:35:02.58お願いだから邪魔しないで。
0048名無しさん@お腹いっぱい。
2012/06/12(火) 20:44:15.91むしろ
./a.out a
./a.out b
====ここで止まっちゃう
のが大問題。
0049名無しさん@お腹いっぱい。
2012/06/12(火) 21:29:01.48>>42
が言ってるのは出力が端末でないなら ls -1 しなくても ls でいいって話.
xargs -L1 -P2の挙動があくまで2プロセス同時にやるって話だから
./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
望みの挙動にするのは一行スクリプトだと割と面倒だから素直にmakeで依存関係書いてmake -j 20とかした方がいいかも
ちなみに俺の環境で >>31 を試してみたけどちゃんと20行以降も実行される.
可能性として気になったのはnohupの位置なんだけど
もしかして実行開始してから端末閉じたりしてる?
0050名無しさん@お腹いっぱい。
2012/06/12(火) 22:31:56.89丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。
> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?
0051名無しさん@お腹いっぱい。
2012/06/12(火) 22:39:01.73俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか
0052名無しさん@お腹いっぱい。
2012/06/12(火) 23:12:10.37めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。
0053名無しさん@お腹いっぱい。
2012/06/13(水) 00:35:25.15at コマンド使うほうが素直な気がする。
もっともバッチ処理システム入れて管理すれば batch コマンド以上に
いろいろかゆいところに手が届いていいと思うが。
0054名無しさん@お腹いっぱい。
2012/06/14(木) 14:17:28.57だとファイル名が表示されるだけで、
echo *.csv | xargs cat
だとファイルの中身が表示されるのはなぜでしょうか?
xargsを付けなくてもファイルの中身が表示されると思ってました。。
0055名無しさん@お腹いっぱい。
2012/06/14(木) 14:20:16.35man cat 読め。
0056名無しさん@お腹いっぱい。
2012/06/14(木) 14:23:59.09$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。
0057名無しさん@お腹いっぱい。
2012/06/14(木) 14:28:27.78だとファイルの中身が表示されるのに、
echo *.csv | xargs cat
だとそのようなファイルやディレクトリはありませんになることがあります。
man cat 読んでもわかりません。
0058名無しさん@お腹いっぱい。
2012/06/14(木) 14:30:22.51cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?
0059名無しさん@お腹いっぱい。
2012/06/14(木) 14:41:19.14*.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。
>>58
そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。
0060名無しさん@お腹いっぱい。
2012/06/14(木) 14:44:47.08なるほど。ありがとうございます!
cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。
0061名無しさん@お腹いっぱい。
2012/06/14(木) 14:49:06.50>*.csv にマッチするファイルがないから
*.csv にマッチするファイルはあります。
0062名無しさん@お腹いっぱい。
2012/06/14(木) 14:51:34.83んじゃファイル名にスペースが入ってるとか。
0063名無しさん@お腹いっぱい。
2012/06/14(木) 15:02:46.510064名無しさん@お腹いっぱい。
2012/06/14(木) 15:12:33.68んじゃ具体的にどういうファイルがあるの?
0065名無しさん@お腹いっぱい。
2012/06/14(木) 15:21:51.240066名無しさん@お腹いっぱい。
2012/06/14(木) 15:27:40.760067名無しさん@お腹いっぱい。
2012/06/14(木) 15:43:59.51これは非道い。
オレには、ファイル名にクオテーションやダブルクオテーションを含める勇気はないわ
0068名無しさん@お腹いっぱい。
2012/06/14(木) 18:24:41.60んじゃこれは
*\'*\'*.csv
でいけるのかな?
0069名無しさん@お腹いっぱい。
2012/06/14(木) 18:28:50.78そんなことしても xargsの段階で解釈されるから無理だろ
0070名無しさん@お腹いっぱい。
2012/06/14(木) 18:45:30.67Linuxのlsなら-Qオプション使えるから
ls -Q *.csv | xargs cat
するかfind の -print0 と xargs の -0 組み合わせるぐらいだろうか。
まあfind使うならxargsじゃなくて-exec使えって話なんだろうが。
0071名無しさん@お腹いっぱい。
2012/06/14(木) 18:51:16.77ファイル名に空白がある場合は使えないけど
$ echo -n *.csv | xargs -d ' ' cat
という説もある
0072名無しさん@お腹いっぱい。
2012/06/15(金) 07:48:47.630073名無しさん@お腹いっぱい。
2012/06/15(金) 08:16:08.73一般的な方法はない。
0074名無しさん@お腹いっぱい。
2012/06/15(金) 08:23:01.23すみませんが詳しい方のみ回答をお願いします
0075名無しさん@お腹いっぱい。
2012/06/15(金) 08:28:15.12lsで日付順で取得してheadまたはtailじゃオーバーヘッド大きすぎ?
うちはめんどくさいからそれで済ませてるんだが
0076名無しさん@お腹いっぱい。
2012/06/15(金) 08:33:32.64ディレクトリ「ツリー」だから、そもそもlsで日付順で取得できないだろw
0077名無しさん@お腹いっぱい。
2012/06/15(金) 08:44:08.87それ作成日時じゃないよ。
0078名無しさん@お腹いっぱい。
2012/06/15(金) 08:48:48.06ls -dtr **/* | head -1
とかか。
お題としては、ls -D か stat あたり使って、
巨大なツリーで日付ソートしろっていう方が楽しいけど。
ただし、「作成日時」には目をつぶる。
0079名無しさん@お腹いっぱい。
2012/06/15(金) 08:52:37.740080名無しさん@お腹いっぱい。
2012/06/15(金) 08:55:56.64知らんかった。すまん。
0081名無しさん@お腹いっぱい。
2012/06/15(金) 09:03:13.700082名無しさん@お腹いっぱい。
2012/06/15(金) 09:10:31.17find /dir -printf '%T+ %p\n' | sort | head -1
0083名無しさん@お腹いっぱい。
2012/06/15(金) 09:35:24.92それ作成日時じゃないよ。
0084名無しさん@お腹いっぱい。
2012/06/15(金) 09:40:26.32そういうのはいいです。エスパーなら最終更新日時と詠み換えるべき。
0085名無しさん@お腹いっぱい。
2012/06/15(金) 09:42:24.84書いてあることしか読み取れんよ。
0086名無しさん@お腹いっぱい。
2012/06/15(金) 10:07:26.75こりゃ釣られたか。
0087名無しさん@お腹いっぱい。
2012/06/15(金) 10:13:35.220088名無しさん@お腹いっぱい。
2012/06/15(金) 10:44:32.410089名無しさん@お腹いっぱい。
2012/06/15(金) 20:59:46.790090名無しさん@お腹いっぱい。
2012/06/15(金) 21:05:44.380091名無しさん@お腹いっぱい。
2012/06/15(金) 21:10:03.640092名無しさん@お腹いっぱい。
2012/06/16(土) 09:05:43.92GNU依存乙
0093名無しさん@お腹いっぱい。
2012/06/17(日) 08:29:54.78完全に陥落しました
0094名無しさん@お腹いっぱい。
2012/06/17(日) 14:58:07.56どんな時に便利っすか
0095名無しさん@お腹いっぱい。
2012/06/17(日) 15:13:21.090096名無しさん@お腹いっぱい。
2012/06/17(日) 17:40:13.730097名無しさん@お腹いっぱい。
2012/06/17(日) 17:51:43.630098名無しさん@お腹いっぱい。
2012/06/17(日) 17:52:22.830099名無しさん@お腹いっぱい。
2012/06/18(月) 09:39:45.83env TZ=JST+15 date
n=5
date -v -${n}d
0100名無しさん@お腹いっぱい。
2012/06/18(月) 12:19:00.380102名無しさん@お腹いっぱい。
2012/06/19(火) 00:23:33.590103名無しさん@お腹いっぱい。
2012/06/19(火) 01:23:21.92世界にはタイムゾーンがいくつもある、という事をよく分かっていない人が
そういう手法を取る結果、スクリプトがおかしな動作をする
…というところから、GNU版dateの拡張は始まっている
NetNewsがまだ生きてた時代の話
0104名無しさん@お腹いっぱい。
2012/06/19(火) 09:28:29.09サーバは1ヶ所にあって世界中を旅するわけではないので。
0105名無しさん@お腹いっぱい。
2012/06/19(火) 11:04:50.480106名無しさん@お腹いっぱい。
2012/06/19(火) 11:28:22.18何かおかしいか?
0107名無しさん@お腹いっぱい。
2012/06/19(火) 11:43:09.74笑い事じゃあないぞ
0108名無しさん@お腹いっぱい。
2012/06/19(火) 11:51:13.75django1.4もmultiple time zoneが入ったばかり。
default time zoneもcurrent time zoneも取得できる。
夏時間と遠隔地絡んだ特殊な処理も標準的にできるようになった。
またWebAppサーバのdefault time zoneはサーバの物理的な位置に合わせていると限らない。
まあシェルスクリプトの領分ではないが。
0109名無しさん@お腹いっぱい。
2012/06/19(火) 12:02:54.39sshした時にTZはクライアントのがいいか、サーバのがいいかなんて一意には決められないね。
環境変数TZは、最小限の手間でその辺のことうまく扱ってるね。
0110名無しさん@お腹いっぱい。
2012/06/19(火) 19:27:08.84エスポレル共和国時間で12時間前の時刻を計算したいときって、どうすればいいの?
0111名無しさん@お腹いっぱい。
2012/06/19(火) 19:33:35.80エスポレル共和国ってどこだか知らないけど、
タイムゾーンはどうなってるの?
0112名無しさん@お腹いっぱい。
2012/06/19(火) 19:34:09.40いったんログアウトしてエスポレル共和国のマシンで好きにやったらいいじゃんw
0113名無しさん@お腹いっぱい。
2012/06/19(火) 20:07:19.80$ env TZ='エスポレル共和国のタイムゾーン' date --date='12 hours age'
でいいんじゃない?
GNU date依存嫌ならepoch time計算して。
0114ワラ
2012/06/19(火) 20:11:25.700115名無しさん@お腹いっぱい。
2012/06/19(火) 21:34:29.04でもそのスクリプトだと、別のタイムゾーンのどこかの国からアクセスした場合でも
アクセス元ではなく、常にエスポレル共和国の計算結果が出てしまうのでは
0116名無しさん@お腹いっぱい。
2012/06/19(火) 22:00:52.43それはsshのサーバ/クライアントの設定で環境変数TZを引き渡せるように
AcceptEnv/SendEnvやPermitUserEnviromentするぐらいしかないんじゃなかろうか。
0117名無しさん@お腹いっぱい。
2012/06/19(火) 22:13:50.40でも最初にそういう条件なかったよね。
0118名無しさん@お腹いっぱい。
2012/06/20(水) 11:35:27.52その先の創意工夫は自分でやるんだよ
なんでもおんぶにだっこじゃ教育によくない
0119名無しさん@お腹いっぱい。
2012/06/20(水) 14:14:27.58最初の一行目に世界のどこか、例えばって書いてあるのになにいってんの?
0120名無しさん@お腹いっぱい。
2012/06/20(水) 14:28:46.20お題を整理しよう。
環境変数TZがすでに設定されている(日本時間とは限らない)場合も含めて、
GNU dateを使わずに、dateで1日前の日付(時刻)を取得する方法は?
というのが元のお題。
0121名無しさん@お腹いっぱい。
2012/06/20(水) 14:37:08.98ん?
どういうこと?
0122名無しさん@お腹いっぱい。
2012/06/20(水) 14:40:02.24GNU date ない環境では perl でワンライナー書いてたな。
perl すらない環境には当たったことがなかった。
0123名無しさん@お腹いっぱい。
2012/06/20(水) 14:40:54.150124名無しさん@お腹いっぱい。
2012/06/20(水) 14:43:50.35なるべく汎用性が高い方法で、ってことじゃないなあ。
0125名無しさん@お腹いっぱい。
2012/06/20(水) 14:45:03.99○じゃないかな
0126名無しさん@お腹いっぱい。
2012/06/20(水) 14:56:47.76>>99で出てるな。
0127名無しさん@お腹いっぱい。
2012/06/20(水) 15:04:20.810128名無しさん@お腹いっぱい。
2012/06/20(水) 15:06:30.87perlといってもうちの環境じゃコアモジュールすら無いけどな
何をやるにも車輪作り直しだから楽しいといえば楽しい
0129名無しさん@お腹いっぱい。
2012/06/20(水) 15:11:35.40そういう環境では>>120はどうやるの?
0130名無しさん@お腹いっぱい。
2012/06/20(水) 15:22:57.02諦めてた
0131名無しさん@お腹いっぱい。
2012/06/20(水) 15:24:14.500132名無しさん@お腹いっぱい。
2012/06/20(水) 16:40:08.45標準関数はだいたいある
昨日の日付くらいなら自力でなんとかなるよ
0133名無しさん@お腹いっぱい。
2012/06/24(日) 21:01:25.05その結果をスクリプト内の変数に入れるにはどうすればいいのん?
コマンド発行まではググってすぐにわかったんだけど結果取得がよくわかんない(´・ω・`)
0134名無しさん@お腹いっぱい。
2012/06/24(日) 21:07:37.570135名無しさん@お腹いっぱい。
2012/06/24(日) 21:54:23.75その接続先でコマンドを発行して結果を取得したいのです…
0136名無しさん@お腹いっぱい。
2012/06/24(日) 22:09:29.980137名無しさん@お腹いっぱい。
2012/06/24(日) 22:10:23.28そういうことなら ssh 使う方が楽じゃない?
0138名無しさん@お腹いっぱい。
2012/06/24(日) 22:12:20.950139名無しさん@お腹いっぱい。
2012/06/24(日) 23:24:18.51前回の expect から今回の expect までの文字列すべてが $expect_out(buffer) に
格納されるから、それを処理すればよい。
以下は /var/log/wtmp のファイルサイズを取得する例。
send -- "ls -al /var/log | egrep -e \"\[ \]wtmp$\"\r"
set bprompt 0
while { $bprompt < 1 } {
expect {
# わざと "\r\n" で expect 掛けて、1行1行ぶつ切りにしてプロンプト手前の1行だけ回収。
-re "\r\n" { set last_line $expect_out(buffer) }
-re ".*\[\$\] " { set bprompt 1 }
}
}
# 正規表現で ls の5カラム目だけ $fsize に切り出し。
if { [ regexp {^\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s} $last_line i_all fsize ] } {
send -- "export WTMPSIZE=$fsize\r"
}
0140名無しさん@お腹いっぱい。
2012/06/24(日) 23:44:45.76出力行数をコマンド側で極力減らしておく、ということを言いたかったのですが
例としては不適切でした。
0142名無しさん@お腹いっぱい。
2012/06/26(火) 09:23:23.94expect -c "
spawn telnet 127.0.0.1
expect \"$ \"
send \"ls\r\"
expect eof
"
こんな風に書いてて
「よーしとりあえずexpectの外でecho $expect_out(buffer)を入れてlsの結果を表示するぞー」
とか思ってたらなんかどこに入れるかわからんかった
というより、expectの使い方がわかってない気がした…
0143名無しさん@お腹いっぱい。
2012/06/26(火) 11:39:01.09鍵設定して
OUT=`ssh hoge@127.0.0.1 ls`
とかでいいじゃん。
0144名無しさん@お腹いっぱい。
2012/06/26(火) 12:03:19.34端からexpectありき、で考えること自体が間違っているわな。
0145名無しさん@お腹いっぱい。
2012/06/26(火) 15:29:34.230146ワラ
2012/06/26(火) 15:57:31.38シェルスクリプトは全部こっちで動かすとして、
#! /usr/bin/expect -f
spawn telnet ホスト名
expect "login:\ "
send "ログイン名\r"
expect "assword:"
send "パスワード\r"
expect "^ホゲ$ "
send "ls¥r"
expect "^ホゲ$ "
send "exit\r"
を下請けコマンドにしてやってみれ。(プロンプトは"ホゲ$ "と仮定)
0147名無しさん@お腹いっぱい。
2012/06/26(火) 16:08:59.940148133
2012/06/26(火) 16:18:50.38動かす方は全てクライアント側です
早速そのスクリプトをe.shで保存
expect e.shとして接続を確認
呼び出し側のスクリプトclient.shで
#!/usr/bin/env bash
OUT=`expect e.sh`
echo $OUT
とするとConnection closed by foreign host.oel Chiappa.c. Reserved.というエラーが…
むむむ…
0149名無しさん@お腹いっぱい。
2012/06/26(火) 16:21:53.21ならそれを先に言えよ。
そもそもls使えんのか?
0150133
2012/06/26(火) 16:25:27.80シリアル接続のルータです
lsは仮で使用出来るコマンドを発行してます
でもexpect -f e.sh や expect e.shだとOKなんですが
シェルスクリプト内でやると駄目だよーと怒られるんです(´・ω・`)
0151名無しさん@お腹いっぱい。
2012/06/26(火) 16:27:25.920152名無しさん@お腹いっぱい。
2012/06/26(火) 16:27:40.89○シリアル接続が出来るルータ
0153名無しさん@お腹いっぱい。
2012/06/26(火) 16:28:08.540155名無しさん@お腹いっぱい。
2012/06/26(火) 16:29:27.55だからperl何かをみんな使う。
0156名無しさん@お腹いっぱい。
2012/06/26(火) 16:29:29.22それエラーじゃないでしょ。
向こう側が接続を切った、って言ってるだけ。
0157133
2012/06/26(火) 16:33:03.55そうなんだ…
>>156
expect e.shだと出来るんですよね
でもシェルスクリプト内で呼び出すと先ほどのエラーがでちゃう
うーむ…
0158名無しさん@お腹いっぱい。
2012/06/26(火) 16:40:34.41標準出力が端末以外の状態だとダメなんだろ。
expect e.sh だとOKでも、
expect e.sh | cat ではNGとか。
だったら OUT=`expect e.sh` も NGになる。
0159133
2012/06/26(火) 16:44:09.27いえ、expect e.sh | catと打ち込んでも出来ました
でもシェルスクリプト内で>>148のようにするとエラーが返って来ちゃうんです
0160名無しさん@お腹いっぱい。
2012/06/26(火) 16:48:13.20シェルスクリプトの「外」で、
OUT=`expect e.sh`
echo "$OUT"
って打ち込むとどうなる?
0161ワラ
2012/06/26(火) 16:49:51.330163名無しさん@お腹いっぱい。
2012/06/26(火) 16:53:23.12じゃあ、
expect e.sh > OUT
cat OUT
で妥協。
0164133
2012/06/26(火) 16:57:30.29ばっちり出来ますた!
ちなみに別ファイルを用意せずにシェルスクリプト内でexpect -c ""みたいにする事は出来ないのかな?
出来ないから別ファイル用意してexpectやperlを使用するようにと言われてるような気もするけど…
0165ワラ
2012/06/26(火) 17:02:26.40たぶんあんたが色々勘違いしてるだけ。
ルータの連続ログイン禁止に抵触してたり。
エラー処理がない>>146もどうかと思うけど。
0166名無しさん@お腹いっぱい。
2012/06/26(火) 17:04:50.56連続ログイン?
そういったルールによるアクセス制御はありませんよ
ちなみにexpect -cだと具体的に>>146はどう書くんです?
0167名無しさん@お腹いっぱい。
2012/06/26(火) 17:09:57.500168名無しさん@お腹いっぱい。
2012/06/26(火) 17:26:29.45シングルクオートでくくって、¥等をエスケープするだけ。
0169名無しさん@お腹いっぱい。
2012/06/26(火) 18:57:55.22expect -c "
spawn telnet ${HOST}
expect \"login: \"
send \"${USER}\r\"
expect \"assword: \"
send \"${PASS}\r\"
expect \"$\"
" > OUT
cat OUT
でもこうやって全出力を他のファイルに落としてゴニョゴニョするより(ry
0170名無しさん@お腹いっぱい。
2012/06/26(火) 19:08:18.81コマンド > OUT
cat OUT
なら動作するのに、
OUT=`コマンド`
echo "$OUT"
では動作しないのって、どういうケースが考えられる?
0171名無しさん@お腹いっぱい。
2012/06/26(火) 19:32:35.020172名無しさん@お腹いっぱい。
2012/06/26(火) 19:39:47.98そういう話はしてないだろ
0173名無しさん@お腹いっぱい。
2012/06/27(水) 20:34:48.42普通はどうやるものなのでしょうか?
例えば左シフトする演算をやるとすると、固定幅でない場合は面倒です。
計算後に一々固定幅に除算するのは速度的にどうかと思うし、
皆さんがどのような手段をとっているのか、おすすめの方法を教えて下さい。
0174名無しさん@お腹いっぱい。
2012/06/27(水) 20:35:48.090175名無しさん@お腹いっぱい。
2012/06/27(水) 20:56:11.44bashなら64bit(符号付)で固定幅だよ。
左シフトしてオーバーフローしたビットは自動的にカットされる。
$ echo $((0x7fffffffffffffff))
9223372036854775807
$ echo $((0x7fffffffffffffff<<1))
-2
$ echo $((0x7fffffffffffffff<<2))
-4
0176名無しさん@お腹いっぱい。
2012/06/27(水) 21:28:12.131.
bashが64bit幅(符号付)というのは、bashの仕様でしょうか?
それとも、事実上、それが基本になっている事が多いということでしょうか?
2.
32bit幅の固定幅bit演算、符号なしの論理演算をする時は、
やはり %0xFFFFFFFF 等と、演算を行った後に
適宜修正して計算するのが普通なのでしょうか?
0177名無しさん@お腹いっぱい。
2012/06/27(水) 23:10:24.880178名無しさん@お腹いっぱい。
2012/06/27(水) 23:11:20.590179名無しさん@お腹いっぱい。
2012/06/28(木) 07:54:55.060180名無しさん@お腹いっぱい。
2012/06/28(木) 10:56:16.200181名無しさん@お腹いっぱい。
2012/06/28(木) 10:59:29.130182名無しさん@お腹いっぱい。
2012/06/28(木) 11:03:12.480183名無しさん@お腹いっぱい。
2012/06/28(木) 11:27:39.660184名無しさん@お腹いっぱい。
2012/06/28(木) 11:28:26.830185名無しさん@お腹いっぱい。
2012/06/28(木) 13:34:47.48流れを読んでいないけど、
男なら黙ってmanだろ。
$ man -k loopback
lo(4) - software loopback network interface
0186名無しさん@お腹いっぱい。
2012/06/28(木) 13:37:43.27loopback: nothing appropriate.
$ man loopback
No manual entry for loopback
0187名無しさん@お腹いっぱい。
2012/06/28(木) 13:55:49.47シェルスクリプトとは別の話じゃないのか。
0188名無しさん@お腹いっぱい。
2012/06/28(木) 14:17:25.200189名無しさん@お腹いっぱい。
2012/06/28(木) 18:04:41.350190名無しさん@お腹いっぱい。
2012/06/28(木) 18:07:40.500191名無しさん@お腹いっぱい。
2012/06/29(金) 17:10:34.14それをコマンド引数に渡すってことをやってたんだけど
$ options="+profile '*'"
$ convert $options image1.jpg image2.jpg
bash 4.2でパラメータ中に*や'があると展開時にエスケープされるようになった
$ set -x
$ convert $options image1.jpg image2.jpg
+ convert +profile ''\''*'\''' image1.jpg image2.jpg
結局Arrayを使うことにしたんだけど
$ options=(+profile '*')
$ convert "${options[@]}" image1.jpg image2.jpg
これってbashのバグなんだろうか?それともANSIの仕様?
bashに特殊文字のエスケープやめさせる方法無いんだろうか?
こんなふうに複数のパラメーターを一気に渡そうって発想が横着なのかもしれないけど
だったらArray使わない移植性あって手軽な方法って無いのかな?
$ convert $(echo $options)
は思いついたけどなんか嫌だし、副作用もあるので
0192名無しさん@お腹いっぱい。
2012/06/30(土) 03:45:58.31$ ls
1.jpg 2.jpg
$ o="+p *"
$ echo $o
+p 1.jpg 2.jpg
$ echo "$o"
+p *
$ o="+p '*'"
$ echo $o
+p '*'
$ echo "$o"
+p '*'
$ bash --version
GNU bash, バージョン 4.2.10(1)-release (i686-pc-linux-gnu)
...
0193191
2012/06/30(土) 16:40:38.69bash --version
GNU bash, バージョン 4.2.28(1)-release (x86_64-redhat-linux-gnu)
4.2.10では起きてなかったと思う
0194名無しさん@お腹いっぱい。
2012/06/30(土) 16:43:18.580195名無しさん@お腹いっぱい。
2012/06/30(土) 16:54:47.17$ bash --version
GNU bash, バージョン 4.2.10(1)-release (x86_64-redhat-linux-gnu)
$ set -x
$ options="+profile '*'"
$ convert $options image1.jpg image2.jpg
+ convert +profile ''\''*'\''' image1.jpg image2.jpg
0196名無しさん@お腹いっぱい。
2012/06/30(土) 17:02:02.66>>192
echo が引用符が除去するからそれをやってもわからない
set -xで見ないと
0197名無しさん@お腹いっぱい。
2012/06/30(土) 17:10:30.740198名無しさん@お腹いっぱい。
2012/06/30(土) 17:11:54.01set -xで見て付いてるクォートは実際には除去されるから問題ない
0199名無しさん@お腹いっぱい。
2012/06/30(土) 17:49:22.14setでポジショナルパラメータに代入しても
結局ポジショナルパラメータの展開時にエスケープされちゃう
$*でも$@でも"$@"でも同じ
逆に*をあらかじめクォートしなければうまくいくようにも思えるが
クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い
>>198
set -xでやたら'が増えるのはわかってるけど、そういう問題じゃないから
コマンド引数として「*」記号を渡したい
あらかじめ文字列中に裸の「*」を入れておくとglob展開される
「'*'」や「\*」を入れておくとパラメータ展開時に'や\までエスケープされてしまうって話
>>192の例でoが「'*'」の時
echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
記号「*」だけを表示して欲しいわけ
そのためにはoを「*」をにしてecho "$o"とやるしか方法がない
そういう仕様だからしかたないと納得した
つまり俺の
> パラメータに空白で区切って複数のオプション入れて、
> それをコマンド引数に渡すってことをやってたんだけど
がそもそも間違ってた。特殊記号が入る時はそういう事やっちゃいけないんだろう
0200名無しさん@お腹いっぱい。
2012/07/02(月) 13:20:07.03options=(+profile '*')
convert "${options[@]}" image1.jpg image2.jpg
これでも出来のではないですか?パス名展開させたければ、ダブルクォートを外す。
options='+profile *'
convert "${options}" image1.jpg image2.jpg
>>199 のこの辺がとても気になりますが、長くなるので省略。
> クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い
> >>192の例でoが「'*'」の時
> echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
0201200
2012/07/02(月) 13:38:21.36後ほど
0202200
2012/07/02(月) 13:57:02.19#!/bin/sh
for i; do echo "$i"; done
$ sample.sh
#!/bin/sh -x
options='"-a" "*" "-b" "file name"'
eval ./convert.sh "${options}" '"other file"'
eval set -- "+profile '*' 'file name'"
./convert.sh "$@" image1.jpg image2.jpg
これでまだ勘違いしていたら、夜にでも考えます
0203名無しさん@お腹いっぱい。
2012/07/02(月) 14:46:36.09特にデータが外部から来る場合は"${array[@]}"がセキュリティ面を考えると安心だし
0204200
2012/07/02(月) 19:47:27.73変な点はまだ有るかもしれませんが、まあ Array で動いていてそれで良いなら、
不要な様なのでこれ以上訂正しません。
0205名無しさん@お腹いっぱい。
2012/07/07(土) 04:32:03.14不要です。
以上。
↓はい次の方。
0206名無しさん@お腹いっぱい。
2012/07/07(土) 07:45:06.260207名無しさん@お腹いっぱい。
2012/07/07(土) 21:04:25.660208名無しさん@お腹いっぱい。
2012/07/07(土) 21:24:19.25↓
$ echo $((123==123))
1
算術式評価では 真で0
↓
$ ((123==123)); echo $?
0
・・・そういうものです
0209名無しさん@お腹いっぱい。
2012/07/08(日) 00:05:05.40echo false; echo $?
意味ねーだろ。
0210名無しさん@お腹いっぱい。
2012/07/08(日) 08:43:03.23>>209 は >>208 の意味を理解してない。たぶん、算術式評価を知らないと見た。
echo $((123==123)); echo $? じゃなくて、
((123==123)); echo $? を実行してるんだから。
0211名無しさん@お腹いっぱい。
2012/07/08(日) 08:58:09.05標準出力の1/0を持ち出すのは「echo false」と同じくらい意味ねーといっているのだ。
わかるか? バカ。
0212名無しさん@お腹いっぱい。
2012/07/08(日) 09:00:39.710213名無しさん@お腹いっぱい。
2012/07/08(日) 09:04:04.78>>208 が指摘してるのは、
戻り値では0が真だが、展開値を出力とする算術式展開では1が真だよという点。
で、その算術式展開と算術式評価もまた違うという点。
やっぱり >>209 は算術式理解してなかったんだね。
0214名無しさん@お腹いっぱい。
2012/07/08(日) 09:08:53.37$ ((0)); echo $?
1
↑結果は偽ね。
0215名無しさん@お腹いっぱい。
2012/07/08(日) 09:40:18.88コマンドの戻り値が0で真が気持ち悪いというのが>>207が言っている事。
それに対して、算術展開とか持ち出した>>208の間抜けさを指摘しているのだ。 バカには難しすぎかい?
>>214
バカすぎる。つーか意味不明。当たり前のように理解不能。
行頭の$は何だよプロンプトか? w
0216名無しさん@お腹いっぱい。
2012/07/08(日) 09:45:04.93>当たり前のように理解不能。
↑敗北宣言乙w
0217名無しさん@お腹いっぱい。
2012/07/08(日) 10:04:40.89> >>214
> 行頭の$は何だよプロンプトか? w
その通りだよw
0218名無しさん@お腹いっぱい。
2012/07/08(日) 10:12:49.26で、それが「戻り値が0で真は気持ち悪い」となんの関係があるんだ? マヌケ
0219名無しさん@お腹いっぱい。
2012/07/08(日) 13:35:39.830220名無しさん@お腹いっぱい。
2012/07/08(日) 15:01:13.590221名無しさん@お腹いっぱい。
2012/07/08(日) 19:16:09.740222名無しさん@お腹いっぱい。
2012/07/08(日) 19:58:11.85/usr/include/stdlib.h:#define EXIT_SUCCESS 0 /* Successful exit status. */
になっているのだからしょうがないでしょうよ。
0223名無しさん@お腹いっぱい。
2012/07/08(日) 21:08:41.46色々と勉強しなおせ
0224名無しさん@お腹いっぱい。
2012/07/08(日) 21:14:25.840225名無しさん@お腹いっぱい。
2012/07/08(日) 21:18:14.89しょうがないのはいいんだけど、こういうときに頭がこんがらがる
test -f hoge.txt が成功したら「真」だから
test -f hoge.txt && echo unko
のときにちゃんとunkoが出るんだけどさ、ここまでいいんだけど
test -f hoge.txt の結果、$?ってゼロじゃん? だからさっきのも
ゼロ && echo unko
みたいな感じで unko出ねぇ って一瞬思っちゃうんだよ
0226名無しさん@お腹いっぱい。
2012/07/08(日) 21:23:20.80という感覚に慣れていればどうってことない。
0227名無しさん@お腹いっぱい。
2012/07/09(月) 09:44:10.37Zフラグでもなんでもどういうたとえを使ってもいいけど、
そのたとえを当てはめるまでにタイムラグがおこる
0228名無しさん@お腹いっぱい。
2012/07/09(月) 10:56:32.710229名無しさん@お腹いっぱい
2012/07/10(火) 21:53:14.00QEMUOPTS="${VMCPU:+-cpu $VMCPU}"
この文の
VMCPU:+ ってのは何のためにあるんでしょうか?
0230名無しさん@お腹いっぱい。
2012/07/10(火) 21:56:15.24>>229
$VMCPU に値が設定されている時のみ -cpu $VMCPU に展開する。
$VMCPU が設定されていない時に -cpu のオプションだけが QEMUOPTS に代入されるのを防ぐ。
0231名無しさん@お腹いっぱい。
2012/07/10(火) 22:04:39.97だから、VMCPUには常に値を代入してるんですが、、
0232229
2012/07/10(火) 22:34:35.51:-
:+
:=
こんな使い方があったんですね。ありがとうございました
0233名無しさん@お腹いっぱい。
2012/07/12(木) 17:37:48.08シェルスクリプト学習中の初心者です。
evalを使うとセキュリティー上どのような事が、問題となるのでしょうか?
変数を展開する際に意図せぬ結果となり、エラーでスクリプトが止まったり、コマンドが起動される事はなんとなく分かります。
初心者の考える危険な例
: ; from_net_1='apple'; from_net_2='banana'; from_net_3='; uname -a'
: ; OPT="$from_net_1 $from_net_2 $from_net_3"
: ; eval echo "$OPT"
また、この点に気を付ければ良い等、機械的に安全を得るやり方は有りますか?
もしくは、皆さんが使用時に、気を付ける点などあればご教示下さい。
0234名無しさん@お腹いっぱい。
2012/07/12(木) 21:28:20.42無い。信頼できるソース以外からの文字列をevalしてはいけない。
0235名無しさん@お腹いっぱい。
2012/07/12(木) 21:57:05.58evalを頻繁に使うようなトリッキーなコードは読みにくくなりがちだしね。
0236名無しさん@お腹いっぱい。
2012/07/12(木) 22:14:43.030237名無しさん@お腹いっぱい。
2012/07/12(木) 22:18:43.100238名無しさん@お腹いっぱい。
2012/07/12(木) 22:20:16.410239名無しさん@お腹いっぱい
2012/07/13(金) 22:22:49.32アクセスを集計しようと
cat /var/log/auth.log | grep "Failed password" | awk '{if($9 == "invalid")print $1,$2,$3,$11,$13,$15; else print $1,$2$3,$9,$11,$13}' | uniq -f5 -w12 -c
と書いてみたんですが、思うようにuniqされませ。
どこがマズイでしょうか?
0240名無しさん@お腹いっぱい。
2012/07/13(金) 22:36:54.900241239
2012/07/13(金) 22:57:53.20カンマ抜けてました
でも、カンマいれると全てが1行表示になりました。
0242名無しさん@お腹いっぱい。
2012/07/13(金) 23:10:09.05ここが環境依存だから答えられん。
awkに対してどんな入力を期待してるの?
0243名無しさん@お腹いっぱい。
2012/07/13(金) 23:40:29.47ついついやりたくなるのは分かるがawkがかわいそうに思えてくる。
0244名無しさん@お腹いっぱい。
2012/07/13(金) 23:45:38.52かと言って全部awkでしちゃうとgrepとかsedの立場がなくなる。
0245名無しさん@お腹いっぱい。
2012/07/13(金) 23:49:01.380246名無しさん@お腹いっぱい。
2012/07/14(土) 00:33:02.570247名無しさん@お腹いっぱい。
2012/07/14(土) 00:45:52.23対象にするコマンドが混在することになるからな
出力はcat、処理はパイプ、と分けた方が、保守性は高まるんじゃないかな
0248名無しさん@お腹いっぱい。
2012/07/14(土) 01:19:38.100249名無しさん@お腹いっぱい。
2012/07/14(土) 06:53:20.810250名無しさん@お腹いっぱい。
2012/07/14(土) 07:15:53.03わかるわww
ただawkを使いこなせるようになるには時間がかかるし、若い奴にこんな時代遅れなものを今から全部学べとは言えないからな。
必要最小限な使い方だけ教えると、grepやsedやuniqなんかと組み合わせた使い方をしてくるんだよね。
0251239
2012/07/14(土) 07:55:25.81Failed password が
Jul 13 13:56:36 xxxxx sshd[17819]: Failed password for root from 59.175.218.166 port 49148 ssh2
Jul 13 13:56:40 xxxxx sshd[17821]: Failed password for invalid user oracle from 59.175.218.166 port 51025 ssh2
の2種類があるので、必要部分だけにして、form のアドレスでまとめたいだけなんです。
連続したアドレスをまとめて、カウントできれば
0252名無しさん@お腹いっぱい。
2012/07/14(土) 07:56:18.63あのcsh使わされてるんですけど標準入力のアスタリスクを文字として扱えないんですけどどうしたらいいんですか。
標準入力からsetした変数でいろいろ分岐したいんですけど*を入れた場合だけ構文エラーとかワイルドカード展開になってしまいます。
ちなみにUNIX環境は全くわかりません。
マジでお願いします。
0253名無しさん@お腹いっぱい。
2012/07/14(土) 08:37:53.40なら前半は
awk '/failure/{print $1,$2,$3,$(NF-5),$(NF-3),$(NF-1)}' /var/log/messages
で済みそう。時間的な連続性を気にしなければ数え上げもawk内でやりたいが。
0254251
2012/07/14(土) 09:00:52.31failureの行をつかうたんですね
思うように集計されないのは、uniqの使い方に問題があったみたいです。
sortが前提みたいですね。
ただ、時間的に連続したfailureのアドレスをまとめたい、できればカウントつきで
0255名無しさん@お腹いっぱい。
2012/07/14(土) 09:15:24.770256名無しさん@お腹いっぱい。
2012/07/14(土) 10:46:53.420257名無しさん@お腹いっぱい。
2012/07/14(土) 15:21:41.03こういう事か?
set hoge = "$<"
echo "$hoge"
0258名無しさん@お腹いっぱい。
2012/07/14(土) 15:28:23.55多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や
シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを
使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは
#!/bin/tcshという文字列でした。
「うへぇ〜、よりによってtcshかよ」
ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、
今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、
今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、
スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。
おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が
強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。
昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた
cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。
これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか
$<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって
実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し
(だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。
そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が
再現され、それに巻き込まれるのでしょう。もう今からうんざりです。
だからお願いです。教育現場ではbashでもzshでもkshでもashでも
Bourne shでもなんでもいいですがBシェル系のシェルにしてください。
教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
0259名無しさん@お腹いっぱい。
2012/07/14(土) 15:32:28.730260名無しさん@お腹いっぱい。
2012/07/14(土) 16:52:49.190261名無しさん@お腹いっぱい。
2012/07/14(土) 16:56:34.370262名無しさん@お腹いっぱい。
2012/07/14(土) 18:01:11.450263名無しさん@お腹いっぱい。
2012/07/14(土) 19:39:52.83サルにマスかき覚えさせると血が出るまでやめないのと同じだよ
覚えたてで嬉しいんだろう
0264名無しさん@お腹いっぱい。
2012/07/14(土) 19:52:41.06今時csh使ってるところなんかあるわけねーだろ。
0265名無しさん@お腹いっぱい。
2012/07/14(土) 20:00:46.430266名無しさん@お腹いっぱい。
2012/07/14(土) 22:00:42.21tcshが一番手っ取り早い時期があった
bashでの、カーソルキーによるヒストリ機能の正式サポートと実装は、
netnewsでは結構祭レベルで好評だったのに対し、fj界隈では
カーソルキーなんて使わないじゃんSVR4とかwwwみたいに
ガラパゴスってた事が、tcshユーザが大量生産したことと
因果関係は有ると思うね
0267名無しさん@お腹いっぱい。
2012/07/14(土) 23:13:13.33BSD界隈では csh 系にそれなりの人気があり
FreeBSD なんかデフォルトのshellは未だにcshだ(実体はtcsh)
0268名無しさん@お腹いっぱい。
2012/07/14(土) 23:16:17.420269名無しさん@お腹いっぱい。
2012/07/15(日) 03:26:56.35ashじゃなかったっけ
0270名無しさん@お腹いっぱい。
2012/07/15(日) 04:05:13.03http://svnweb.freebsd.org/base/head/etc/master.passwd?revision=218047&view=markup
root::0:0::0:0:Charlie &:/root:/bin/csh
0271名無しさん@お腹いっぱい。
2012/07/15(日) 07:21:31.450272名無しさん@お腹いっぱい。
2012/07/15(日) 12:20:29.920273名無しさん@お腹いっぱい。
2012/07/15(日) 13:30:12.880274名無しさん@お腹いっぱい。
2012/07/15(日) 17:10:34.350275名無しさん@お腹いっぱい。
2012/07/15(日) 20:13:13.730276名無しさん@お腹いっぱい。
2012/07/15(日) 20:53:59.040277名無しさん@お腹いっぱい。
2012/07/16(月) 02:01:54.23Bill Joy先生の作品ですよ。
ジョブコントロール関係のカーネル拡張も。
他にはviとか、page単位の仮想記憶とか。
近代的なUNIXカーネルの創始者の一人。
cshスクリプトの是非については、
csh programming considered harmful.を読めばいい。
0278名無しさん@お腹いっぱい。
2012/07/16(月) 16:33:07.10シェルスクリプトを書いたのですが、
そのスクリプト(***.sh)が入っているディレクトリと入っていないディレクトリで
挙動が変わってしまいます
これはもともとそういう仕様?なのでしょうか
それとも書いたスクリプトに間違いがあってこうなっているのでしょうか
すみませんがアドバイス宜しくお願いします
0279名無しさん@お腹いっぱい。
2012/07/16(月) 16:57:50.700280名無しさん@お腹いっぱい。
2012/07/16(月) 17:05:30.38カレントディレクトリはスクリプトの属性ではなくプロセスの属性。
0281名無しさん@お腹いっぱい。
2012/07/16(月) 17:14:22.95パスはその都度引数で指定する仕様で
絶対パスで指定しているのでそんなことはない、と思うのですが…
>>280
カレントディレクトリで、なおかつそのスクリプトが入ってるときにしか
動作しない、ということでしょうか…?
すみません、浅学でしてLinuxに関しては学び始めたばかりなのです
0282名無しさん@お腹いっぱい。
2012/07/16(月) 17:17:14.41http://pastebin.com/
0283名無しさん@お腹いっぱい。
2012/07/16(月) 17:23:10.760284名無しさん@お腹いっぱい。
2012/07/16(月) 17:24:30.42これであってますでしょうか…?
http://pastebin.com/5CHY53XG
0285名無しさん@お腹いっぱい。
2012/07/16(月) 17:27:48.35inの後ろを穴埋めしろ、という課題なのです
拡張子はtexやdviに限る必要はありません
ただし何かしらの文字列を含まないファイルを
一括で削除するスクリプトを作りましょう、ということなのですが…
0286名無しさん@お腹いっぱい。
2012/07/16(月) 17:30:36.51grepのところもegrep -v ".tex$|.dvi$"くらいの意図か?
0287名無しさん@お腹いっぱい。
2012/07/16(月) 17:33:28.31それも試したんですが削除しますか?と聞かれるファイルがひとつしかないのです>"$DIR"
実際にはもっとたくさんあるんですが…
grepのは特定の文字列を含まないファイルをリストしたいという意図です
".tex$|.dvi$"←これのように「|」を入れないと2つの文字列を除外することはできないのでしょうか?
0288名無しさん@お腹いっぱい。
2012/07/16(月) 18:39:06.72何か1文字、t、x、t、スペース、何か1文字、d、v、i
というひとつながりの文字列がある行を除外する。
0289名無しさん@お腹いっぱい。
2012/07/16(月) 18:40:30.300290名無しさん@お腹いっぱい。
2012/07/16(月) 18:52:03.84>「for FILE in _______________」となっていて
>inの後ろを穴埋めしろ、という課題なのです
変な課題w
課題関係なしなら
↓で、grep使わずにできる。(lsも使わずに内部コマンドだけで)
cd "$DIR"
for FILE in *
do
case $FILE in
*.tex|*.dvi);;
*) rm -i "$FILE";;
esac
done
0291名無しさん@お腹いっぱい。
2012/07/16(月) 19:39:40.80正常に動くよ。
for FILE in `for f in *; do case $f in *.tex|*.dvi)echo "$f";;esac;done`
do
以下略
0292名無しさん@お腹いっぱい。
2012/07/16(月) 22:01:42.45なるほど…ありがとうございます
検索条件に.○○はダメだったんですね
>>290
正直別なところもいじらせてほしいですorz
スクリプト例もありがとうございます、参考にさせて頂きます
>>291
その手がありましたね…!>for文入れる
有り難うございます、これで行けると思います
長々とどうもすみませんでした
アドバイスしてくれた皆様ありがとうございました
0293名無しさん@お腹いっぱい。
2012/07/16(月) 22:05:25.550294名無しさん@お腹いっぱい。
2012/07/16(月) 22:27:57.35find 使えばいくね?
find "$DIR" -maxdepth 1 -type f
ていうかHOME以下のファイル消すスクリプトとかこえーな
0295名無しさん@お腹いっぱい。
2012/07/17(火) 00:37:58.25find -E "$DIR" -type f -regex '.*\.(conf|wrapper)$' -delete
でいいのに
制約があるので>>291よりおふざけ感が低減される
for FILE in `find -E . -type f -regex '.*\.(conf|wrapper)$'`
do
以下略
0296名無しさん@お腹いっぱい。
2012/07/17(火) 00:41:30.49find -E "$DIR" -type f -regex '.*\.(tex|div)$' -delete
for FILE in `find -E "${DIR}" -type f -regex '.*\.(tex|div)$'`
0297名無しさん@お腹いっぱい。
2012/07/17(火) 03:06:32.79grep -v -e .tex -e .dvi
egrep -v ".tex|.dvi"
12行目あたりに echo $FILE いれるとか、内容をチェックしてみる癖はつけたほうがいいぞ。
0298名無しさん@お腹いっぱい。
2012/07/17(火) 07:26:54.87何よ。
0299名無しさん@お腹いっぱい。
2012/07/17(火) 15:54:04.83デスクトップ環境(X Window上)のターミナルエミュレータか、
sshログインしたときなどのコンソール上かで、シェルスクリプトの挙動を変えたいのですが、
どのような工夫をすればよいか、何で条件分岐すればよいのか思いつきません。
お願いします。
0300名無しさん@お腹いっぱい。
2012/07/17(火) 16:02:19.680301名無しさん@お腹いっぱい。
2012/07/17(火) 16:03:00.94> デスクトップ環境(X Window上)のターミナルエミュレータか、
DISPLAY環境変数が設定されていれば。
> sshログインしたときなどの
SSH_CLIENT環境変数が設定されていれば。
> コンソール上かで、
ttyコマンド使えばこれも判別できる。
0302名無しさん@お腹いっぱい。
2012/07/17(火) 16:13:55.080303名無しさん@お腹いっぱい。
2012/07/17(火) 16:22:19.33ありがとう。DISPLAYはsshログインしたときでもたまに設定するので使えません、
ttyコマンドの出力を使う方法は、仮想コンソールだと区別が付きそうですが、
sshログインした場合は区別が付きませんでした。
SSH_CLIENTを見てみました。
SSH_CLIENT, SSH_TTY, SSH_CONNECTIONはsshログインしたときのみに設定されるようなので、
これを使って条件分岐することにします。
ご教示感謝します。>>300さんもありがとうございました。
0304名無しさん@お腹いっぱい。
2012/07/17(火) 16:49:06.86コンソールってのは本体に物理的に接続されてるキーボード/ディスプレーのことな。
パイプオルガンの鍵盤の付いた演奏台由来の名前。
パイプオルガンの本体はパイプだから。
0305名無しさん@お腹いっぱい。
2012/07/17(火) 18:45:11.740306名無しさん@お腹いっぱい。
2012/07/17(火) 18:51:03.45ターミナルはあくまでも別の機械からのリモートログイン。
xtermなどのことをターミナルと呼んでしまうこともあるが、
正しくはターミナルエミュレータなので、純粋なターミナルとは異なる。
0307名無しさん@お腹いっぱい。
2012/07/17(火) 19:32:14.58本体に接続されたディスプレイとキーボードを使うのに「ターミナル(遠隔操作端末)エミュレータ」だから直感的に混乱するよね。
0308名無しさん@お腹いっぱい。
2012/07/17(火) 23:13:42.44とかのデバイスによって、コンソール、端末(ターミナル、物理端末、制御端末、広義のコンソール等)、
疑似端末(仮想端末、仮想ターミナル、シュードターミナル等)が分かれる。(はずです。多分。)
カーネルをロードしてinit起動してるやつがコンソール
LinuxとかでAlt+2とかで切り替えられる奴がターミナル
他が疑似端末
でOK。(だと思う。多分。)
コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず、あとデーモン類とか
端末持たないプロセス(ps -efとかで見たとき端末のカラムが?になってるプロセス)が標準出力の代わりに/dev/consoleにメッセージ出してきたりする。
まぁ組み込み系の人以外、端末、ターミナル、コンソールをあまり区別せずに使う場合のが多いし、
大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
0309名無しさん@お腹いっぱい。
2012/07/18(水) 00:05:24.12> コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず
スレ違いな上に出鱈目。最低だ。
0310名無しさん@お腹いっぱい。
2012/07/18(水) 09:45:01.28>大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
自分がちゃんと覚えていないなら、それをわきまえて黙ってろ。
0311名無しさん@お腹いっぱい。
2012/07/18(水) 10:01:19.01端末とターミナルを別物のように説明してるしw
0312名無しさん@お腹いっぱい。
2012/07/18(水) 11:07:30.77たしかにこれはひどいな
0313名無しさん@お腹いっぱい。
2012/07/18(水) 11:13:48.49古典/bin/shなrootログインでしかコンソールを触ったことがなかった爺と思われ。
SunOS辺りか?
0314名無しさん@お腹いっぱい。
2012/07/18(水) 13:07:04.12みたいにやっておいて、
mv file2 file3
した場合、最初のコピーにmvが追いついた時ってどうなるの?
0315名無しさん@お腹いっぱい。
2012/07/18(水) 13:13:20.91この場合のmvは同一ファイルシステムだから、
実際にはrename(2)が呼ばれるだけで、
cpでコピー途中かどうかに関係なくファイル名だけがリネームされる。
また、リネーム後もcpはオープン済みのファイル記述子でコピーを続けるので
コピーも無事file3に対して行なわれる。
よって無問題。
0316名無しさん@お腹いっぱい。
2012/07/18(水) 13:18:37.48あ、ごめんなさい、
mv /mnt/file2 file3
でした。この場合も問題なしですか?
0317名無しさん@お腹いっぱい。
2012/07/18(水) 13:24:13.19異なるファイルシステムの場合は
mvが追い付いてしまったらそこでEOFとみなされるので
file3は後半が切れた短いファイルになる。
mvによるコピー後、mvはfile2をunlink(2)する。
cpはファイル記述子でコピー中なので、unlink(2)に気づかずにfile2にコピーするが、
file2はそのまま消滅する。
よって問題あり。
0318名無しさん@お腹いっぱい。
2012/07/18(水) 13:33:12.07ありがとうございます!
0319名無しさん@お腹いっぱい。
2012/07/18(水) 15:15:13.340320名無しさん@お腹いっぱい。
2012/07/18(水) 15:16:56.450321名無しさん@お腹いっぱい。
2012/07/18(水) 22:31:50.130322名無しさん@お腹いっぱい。
2012/07/19(木) 00:40:03.430323名無しさん@お腹いっぱい。
2012/07/19(木) 08:23:00.94いや。
OSがUNIXなら、たとえFATファイルシステムであっても
unlinkの挙動は同じになってるよ。
(unlink後もfile descriptorで書き込み等可能、プロセス終了で実体削除)
0324名無しさん@お腹いっぱい。
2012/07/19(木) 09:34:12.27して(ディレクトリエントリから削除)実体を解放しない(FATには残ってい
る)状態は、ファイルシステムとして壊れた状態なんだけど。
0325名無しさん@お腹いっぱい。
2012/07/19(木) 10:50:31.770326名無しさん@お腹いっぱい。
2012/07/19(木) 11:54:23.00NFSだと違うくね?
0327名無しさん@お腹いっぱい。
2012/07/19(木) 11:55:45.52全員closeするまでunlinkされないよ
0328名無しさん@お腹いっぱい。
2012/07/19(木) 12:10:15.79ディレクトリからunlinkはされるけど
closeするまで実体は隠れたところに残ってる、が正しい
0329名無しさん@お腹いっぱい。
2012/07/19(木) 12:13:46.170330名無しさん@お腹いっぱい。
2012/07/19(木) 12:14:14.270331名無しさん@お腹いっぱい。
2012/07/19(木) 12:24:14.27いや、renameじゃなくてunlink。ディレクトリ上にはどこにも存在しない。
0332名無しさん@お腹いっぱい。
2012/07/19(木) 13:47:29.51NFSだとサーバ実装にもよるんだけど、
オープンされてるファイルをunlinkすると.nfsXXXというパス名にして、
ls -aなら見えるタイプの実装があるね。
本家のSunOSがそうだった。
今時の商用NASは見えないのが多い。
0333名無しさん@お腹いっぱい。
2012/07/19(木) 17:24:45.23ファイルシステムとして壊れた状態かどうかはOS側の解釈に過ぎない。
unlinkして実体を解放しないまま何らかの原因で強制ummountされたら、
fsck_msdosfs(FreeBSD)またはfsck.msdos(Linux)で修復できる。
通常のUNIXのファイルシステムのfsckの場合ととくに変わらない。
0334名無しさん@お腹いっぱい。
2012/07/19(木) 18:18:26.99最近のLinuxのNFSサーバも同じ挙動をする
NFSv3かv4の仕様なんだと思ってた
0335名無しさん@お腹いっぱい。
2012/07/19(木) 18:28:40.79NFSは仕様上、ファイルサーバがクラッシュした後、再起動すれば、
クライアントがオープンしていたファイルについて問題なく処理を続行できる必要がある。
そのため、回収されてしまわないようピン止めしているだけ。
商用NASでは.nfsXXXではなく不揮発メモリ上の内部DBに格納して保存している。
0336名無しさん@お腹いっぱい。
2012/07/19(木) 20:42:29.05ディレクトリから消えるだけっしょ
0337名無しさん@お腹いっぱい。
2012/07/19(木) 20:57:26.28お前は何を言ってるんだ?
0338名無しさん@お腹いっぱい。
2012/07/19(木) 21:11:53.31十分お楽しみいただけましたか?
それでは次の方どうぞ
↓
0339名無しさん@お腹いっぱい。
2012/07/19(木) 21:46:23.950340名無しさん@お腹いっぱい。
2012/07/20(金) 23:28:32.13a
b
c
1
2
3
下のようになるコマンドってありますか
a1
b2
c3
0341名無しさん@お腹いっぱい。
2012/07/20(金) 23:31:16.63paste
0342名無しさん@お腹いっぱい。
2012/07/20(金) 23:31:53.260343名無しさん@お腹いっぱい。
2012/07/21(土) 08:02:00.38しかも「つ」とか恥ずかしい文字使ってwww
0344名無しさん@お腹いっぱい。
2012/07/21(土) 08:09:55.50補足すると、デリミタを空文字にするようにオプション付けてね。
paste -d '' file1 file2
0345名無しさん@お腹いっぱい。
2012/07/21(土) 15:59:34.92ありがとうございました、望み通りのものです
0346名無しさん@お腹いっぱい。
2012/07/21(土) 16:48:21.35ppid指定で子プロセスの累積値を出すオプション等ありますか?
軽いプロセスをループで呼び続けてるものがcpu%でソートした場合
浮かんで来ないというのを解決するのが目的です
psを利用してppid指定で自前っていうのをやってみようかと思いましたが
それだと、目的の物がpsに出てくる間隔で呼び続ける必要になりそうなので
「軽いプロセスを呼び続ける」ものを監視したいっていう目的に反してるなと・・
0347名無しさん@お腹いっぱい。
2012/07/21(土) 21:03:14.45Linuxなら、psに S オプションを付けると子プロセスのCPU時間が親に加算されるけど。
0348名無しさん@お腹いっぱい。
2012/07/21(土) 21:28:04.70マウスが反応しません。あ、マウス自体は動いてるんですがクリックしても
何もなりません。タスクバーとかはどうやって出すんですか?
0349名無しさん@お腹いっぱい。
2012/07/21(土) 21:36:58.32というかシェルスクリプトか?
0350名無しさん@お腹いっぱい。
2012/07/21(土) 23:15:22.590351名無しさん@お腹いっぱい。
2012/07/22(日) 03:02:09.25gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
0352名無しさん@お腹いっぱい。
2012/07/23(月) 21:56:01.860353名無しさん@お腹いっぱい。
2012/07/23(月) 22:11:18.530354名無しさん@お腹いっぱい。
2012/07/23(月) 22:21:56.210355名無しさん@お腹いっぱい。
2012/07/24(火) 00:34:24.030356名無しさん@お腹いっぱい。
2012/07/24(火) 00:36:18.470357名無しさん@お腹いっぱい。
2012/07/24(火) 23:56:17.62xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
0358名無しさん@お腹いっぱい。
2012/07/25(水) 03:21:11.56352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
0359名無しさん@お腹いっぱい。
2012/07/25(水) 21:35:30.31おう、そうか。スルーしよう。ありがとう。
0360名無しさん@お腹いっぱい。
2012/07/27(金) 20:48:33.81思うんだけど、どうしたらいいでしょか
0361名無しさん@お腹いっぱい。
2012/07/27(金) 20:52:17.05((コマンド 2>&1 1>&3) | grep hoge) 3>&1
0362名無しさん@お腹いっぱい。
2012/07/28(土) 03:58:28.71なるほど
いろいろできるもんだな
0363名無しさん@お腹いっぱい。
2012/07/28(土) 07:49:40.420364名無しさん@お腹いっぱい。
2012/07/28(土) 07:56:32.300365名無しさん@お腹いっぱい。
2012/07/28(土) 09:41:50.79サブシェルが1個無駄です。
(コマンド 2>&1 1>&3 | grep hoge) 3>&1
---
サブシェルなしにもできます。
exec 3>&1
コマンド 2>&1 1>&3 | grep hoge
0366名無しさん@お腹いっぱい。
2012/07/28(土) 10:07:31.29なるほど
いろいろできるもんだな
0367名無しさん@お腹いっぱい。
2012/07/28(土) 10:11:09.01若ハゲチッス
0368名無しさん@お腹いっぱい。
2012/07/28(土) 11:36:30.410369名無しさん@お腹いっぱい。
2012/07/28(土) 11:45:46.68興味本位で聞いただけかよ。無礼な奴だ。
0370名無しさん@お腹いっぱい。
2012/07/28(土) 12:12:34.03「コンピュータにはいろんなシェルがある。みんなの知ってるシェルを1つずつ
挙げていこう。誰かわかる人?」と先生が言った。
エクスプローラは真っ先に答えられた。
誰かがGNOMEと答えたが、先生はNautilusと修正して黒板に書いた。
command.comという声も挙がった。
そのあと隣の奴がDOS窓と答えた。
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
キミの答えはここに既に含まれているという、ちょっと屈辱的な対応だ。
満を持してボクは手を挙げて答えた。「bash」
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
0371名無しさん@お腹いっぱい。
2012/07/28(土) 12:26:54.24オチが分からん。解説よろ
0372名無しさん@お腹いっぱい。
2012/07/28(土) 12:32:16.230373名無しさん@お腹いっぱい。
2012/07/28(土) 15:36:27.50if ! ERROR=$(command 2>&1);then
exit 1
fi
で、commandが正常終了しても、successedなどのメッセージが返されて
全て、if中に入ってしまいます。
ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
0374名無しさん@お腹いっぱい。
2012/07/28(土) 15:38:36.280375名無しさん@お腹いっぱい。
2012/07/28(土) 15:50:27.43こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
0376名無しさん@お腹いっぱい。
2012/07/28(土) 15:57:24.140377373
2012/07/28(土) 16:33:01.71if ! ERROR=$(genext2fs -b $IMAGESIZE -i $BYTEINODE -d $ROOTFS $IMAGENAME 2>&1);then
error "E: $ERROR"
cleanup
fi
E:successed で、cleanup 終了してるみたいで
本当にここか確かめては無いんですが、
0378名無しさん@お腹いっぱい。
2012/07/28(土) 16:47:30.02$ if ! ERROR=$(echo test; true); then echo "$ERROR"; fi
$ if ! ERROR=$(echo test; false); then echo "$ERROR"; fi
test
$
0379名無しさん@お腹いっぱい。
2012/07/28(土) 17:09:30.140380名無しさん@お腹いっぱい。
2012/07/28(土) 17:26:15.70$ ERROR=`echo test; true` || echo "$ERROR"
$ ERROR=`echo test; false` || echo "$ERROR"
test
$
0381名無しさん@お腹いっぱい。
2012/07/28(土) 17:59:00.490382名無しさん@お腹いっぱい。
2012/07/28(土) 20:55:59.070383名無しさん@お腹いっぱい。
2012/07/28(土) 21:59:11.380384名無しさん@お腹いっぱい。
2012/07/28(土) 22:06:33.76(( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。
使えないのはashだけだし。
0385名無しさん@お腹いっぱい。
2012/07/28(土) 22:13:28.29せっかく作者が用意してくれた機能なんだし。
0386名無しさん@お腹いっぱい。
2012/07/28(土) 22:18:09.180387名無しさん@お腹いっぱい。
2012/07/28(土) 22:36:30.01そいつらはPOSIXで定義されてるの?
0388名無しさん@お腹いっぱい。
2012/07/28(土) 22:39:14.340389名無しさん@お腹いっぱい。
2012/07/29(日) 03:16:10.95http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
0390名無しさん@お腹いっぱい。
2012/07/29(日) 08:10:37.46か、
・純shに合わせる
かの2択。(posix(笑)は現実的じゃないから判断基準にならない)
ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。
あと、ashで仕様の違う「let」コマンドを廃止しろ。
0391名無しさん@お腹いっぱい。
2012/07/29(日) 08:18:36.31・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
0392名無しさん@お腹いっぱい。
2012/07/29(日) 08:36:22.88>( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
0393377
2012/07/29(日) 09:15:42.62E: genext2fs: output filesystem image: Success
この場合、結果を標準エラーのみにするには、どうすれば良いですか?
0394名無しさん@お腹いっぱい。
2012/07/29(日) 09:19:54.80もしかして genext2fsって正しいexit statusを返さないんじゃないの?
標準エラーのみにするには、
if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..
2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
0395名無しさん@お腹いっぱい。
2012/07/29(日) 09:27:49.340396名無しさん@お腹いっぱい。
2012/07/29(日) 09:29:52.830397名無しさん@お腹いっぱい。
2012/07/29(日) 09:44:58.55終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?
ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
0398名無しさん@お腹いっぱい。
2012/07/29(日) 10:21:14.14じゃあさ。
> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
0399名無しさん@お腹いっぱい。
2012/07/29(日) 10:37:10.90bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。
一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
0400名無しさん@お腹いっぱい。
2012/07/29(日) 10:56:34.720401名無しさん@お腹いっぱい。
2012/07/29(日) 11:02:57.050402名無しさん@お腹いっぱい。
2012/07/29(日) 11:14:50.01> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
0403名無しさん@お腹いっぱい。
2012/07/29(日) 11:35:07.430404名無しさん@お腹いっぱい。
2012/07/29(日) 11:38:14.680405名無しさん@お腹いっぱい。
2012/07/29(日) 11:46:03.68煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?
他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
0406名無しさん@お腹いっぱい。
2012/07/29(日) 12:15:51.33POSIXがAND取ってくれてるんだからそれを使えばいいのに。
0407名無しさん@お腹いっぱい。
2012/07/29(日) 12:19:09.97POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
0408名無しさん@お腹いっぱい。
2012/07/29(日) 12:19:25.100409名無しさん@お腹いっぱい。
2012/07/29(日) 12:21:49.120410名無しさん@お腹いっぱい。
2012/07/29(日) 12:24:48.99動くよ。動かないというなら実例を挙げる事。
0411名無しさん@お腹いっぱい。
2012/07/29(日) 12:26:37.54どれも最新のバージョンを使うこと前提?
0412名無しさん@お腹いっぱい。
2012/07/29(日) 12:27:00.63>>403
0413名無しさん@お腹いっぱい。
2012/07/29(日) 12:32:10.32通信業界さんも夏休みですか?
0414名無しさん@お腹いっぱい。
2012/07/29(日) 12:43:31.16降参ですか?
0415名無しさん@お腹いっぱい。
2012/07/29(日) 12:49:36.170416名無しさん@お腹いっぱい。
2012/07/29(日) 12:51:26.75見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。
どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
0417名無しさん@お腹いっぱい。
2012/07/29(日) 12:51:49.11覆すにはPOSIX通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0418名無しさん@お腹いっぱい。
2012/07/29(日) 12:53:59.46(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0419名無しさん@お腹いっぱい。
2012/07/29(日) 12:56:27.23直接存在しなくても現物シェルのANDで表せるんだからOK。
POSIXの場合は現物シェルのANDでも表せない。
0420名無しさん@お腹いっぱい。
2012/07/29(日) 13:16:53.94> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
それともAND規格でのみ動作するとかいうスイッチでもあるのか?
0421名無しさん@お腹いっぱい。
2012/07/29(日) 13:22:40.49自称プロ(夏休み中)はスルーでよくねえか
0422名無しさん@お腹いっぱい。
2012/07/29(日) 13:25:05.75POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。
bash/zsh/kshは現物シェルのANDで表せる。
実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。
POSIXではそれができない。
0423名無しさん@お腹いっぱい。
2012/07/29(日) 13:28:30.18/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
0424名無しさん@お腹いっぱい。
2012/07/29(日) 13:33:07.06家内制手工業のプロさん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0425名無しさん@お腹いっぱい。
2012/07/29(日) 13:35:51.04v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
0426名無しさん@お腹いっぱい。
2012/07/29(日) 13:38:15.670427名無しさん@お腹いっぱい。
2012/07/29(日) 13:39:10.75撤回してないぞ。よくよめ。
0428名無しさん@お腹いっぱい。
2012/07/29(日) 13:39:29.540429名無しさん@お腹いっぱい。
2012/07/29(日) 13:41:58.86bashもzshもkshも全部AND規格(笑)の上位互換
0430名無しさん@お腹いっぱい。
2012/07/29(日) 13:43:45.90それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
0431名無しさん@お腹いっぱい。
2012/07/29(日) 13:52:44.60> それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
それ以前にAND規格には現物がないんだから >>426 では論破になってない。
> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが>>426
> A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。
現物がないという条件なら両方同じと言っているだけだ。
0432名無しさん@お腹いっぱい。
2012/07/29(日) 14:15:04.400433名無しさん@お腹いっぱい。
2012/07/29(日) 14:43:09.24これか、「夏だなぁ厨」ってのは
0434名無しさん@お腹いっぱい。
2012/07/29(日) 14:48:40.910435名無しさん@お腹いっぱい。
2012/07/29(日) 14:50:44.43VMwareの上でSolaris2.5を動かして確認してる。
0436名無しさん@お腹いっぱい。
2012/07/29(日) 17:01:06.410437名無しさん@お腹いっぱい。
2012/07/29(日) 17:07:14.87bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
0438名無しさん@お腹いっぱい。
2012/07/29(日) 17:10:50.82> (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0439名無しさん@お腹いっぱい。
2012/07/29(日) 17:15:25.23ハイ、ロンパー
0440名無しさん@お腹いっぱい。
2012/07/29(日) 17:25:31.70↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?
$ bash script
$ zsh script
$ ksh script
0441名無しさん@お腹いっぱい。
2012/07/29(日) 17:36:32.380442名無しさん@お腹いっぱい。
2012/07/29(日) 17:51:38.940443名無しさん@お腹いっぱい。
2012/07/29(日) 17:56:40.12SH_WORD_SPLITを有効にしないと互換性ないよ。
0444名無しさん@お腹いっぱい。
2012/07/29(日) 18:10:03.730445名無しさん@お腹いっぱい。
2012/07/29(日) 18:31:38.080446名無しさん@お腹いっぱい。
2012/07/29(日) 21:35:16.580447名無しさん@お腹いっぱい。
2012/07/29(日) 21:45:10.93ash, bash あたりは POSIXシェルの現物じゃん。
zshは >>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)
基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)
とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
0448名無しさん@お腹いっぱい。
2012/07/29(日) 21:47:07.40って手段すら取れないような環境にいるやつってどれだけいるんだろ。
0449名無しさん@お腹いっぱい。
2012/07/29(日) 21:58:53.44でも、ちゃんと言語仕様を勉強してれば、POSIX範囲内で書くのも苦じゃ
ないので、bash入れる手間はたいしたことないけど、それも省くために
POSIX範囲内で書くってのもアリでしょ。
もっと多いのはオープンソースでソフトウェアを配布する場合で、
*BSDとかDebianとかはbashが入ってる保証はないから(入れるのは簡単だけどね)、
POSIX範囲内におさまるように(時にはv7 シェル程度でも動くように)書くのが普通。
0450名無しさん@お腹いっぱい。
2012/07/29(日) 22:08:43.380451名無しさん@お腹いっぱい。
2012/07/29(日) 22:13:23.77ただautoconf使う場合は、autoconfマクロでシェル関数を代替できるので、
シェル関数使わずに書くけど。
0452名無しさん@お腹いっぱい。
2012/07/29(日) 22:14:29.06まあ意味分かるよね。
0453名無しさん@お腹いっぱい。
2012/07/30(月) 06:23:35.06常に、-e オプションが付いたような状態で動作しなければならない。
例えば echo 'hoge\c' で改行なしになるとか、
echo -n は -n をそのまま(改行付きで)出力とか。
FreeBSDのashはその仕様に従っていないので、
posixだけ見て書くとechoの部分が正常に動かない。
だからposixには実用性がない。
0454名無しさん@お腹いっぱい。
2012/07/30(月) 07:47:46.92に、echoはポータビィリティに問題があり、代わりにprintfが使えると書いてる。
0455名無しさん@お腹いっぱい。
2012/07/30(月) 07:54:35.330456名無しさん@お腹いっぱい。
2012/07/30(月) 07:56:07.99それは知ってるよ。
ashはposixを満たしてると言う主張に対する反論ね。
0457名無しさん@お腹いっぱい。
2012/07/30(月) 07:59:52.14FreeBSDのashにはprintfが組み込まれてない(外部)ので、
printfの使用はパフォーマンス的にダメージ。
実際、FreeBSDのスクリプトはechoが多用されてる。
0458名無しさん@お腹いっぱい。
2012/07/30(月) 08:58:27.43ダウト。-nは実装依存と書かれているわけだが。
0459名無しさん@お腹いっぱい。
2012/07/30(月) 09:33:41.12いいや、バックスラッシュ付き文字の解釈は必須。
-n はオプションではないとも明記されてる。
0460名無しさん@お腹いっぱい。
2012/07/30(月) 09:49:52.52A string to be written to standard output. If the first operand is -n,
or if any of the operands contain a backslash ( '\' ) character,
the results are implementation-defined.
0461名無しさん@お腹いっぱい。
2012/07/30(月) 09:50:58.33> -nは実装依存と書かれているわけだが。
実装依存なら使っちゃダメじゃんwww
FreeBSDのrcスクリプトは echo -n バンバン使ってるぞ。
この件だけでも「POSIXだけ守ってれば良い」の反証として十分だよね。
0462名無しさん@お腹いっぱい。
2012/07/30(月) 09:54:33.32略
OPERANDS
The following operands are supported:
string
A string to be written to standard output. If any operand is -n,
it will be treated as a string, not an option.
The following character sequences will be recognised within any of
the arguments:
\a Write an alert character.
略
-nはオプションじゃなく文字列として扱え、
以下の(\)シーケンスを認識しろ、
と書かれてるね。
0463名無しさん@お腹いっぱい。
2012/07/30(月) 09:59:16.710464名無しさん@お腹いっぱい。
2012/07/30(月) 10:06:31.42FreeBSDが使っている事と「POSIXだけ守ってれば良い」は全く独立なわけだが。
>>462
それはSUSv2。POSIXじゃない。
0465名無しさん@お腹いっぱい。
2012/07/30(月) 10:07:00.530466名無しさん@お腹いっぱい。
2012/07/30(月) 10:14:40.58いや、ここでは「POSIXだけ守ってれば良い」が否定されればそれでいいので
もう結論が出たよ。
>それはSUSv2。POSIXじゃない。
いや、POSIXだよ。1997年のだけど。
少なくともこの時点でのPOSIXがこんなことを言ってたんだから、
役に立たないというのも判ろうもの。
0467名無しさん@お腹いっぱい。
2012/07/30(月) 10:16:54.62> FreeBSDのashにはprintfが組み込まれてない(外部)ので、
> printfの使用はパフォーマンス的にダメージ。
微妙にダウトだな。
FreeBSD 9.0 からは printf は builtin に戻ったよ。
FreeBSD 4.X までも builtin だったので、5.X〜8.X の間は外部コマンド。
まあ builtin から外したのが判断誤りだったってことだな。
NetBSD の場合、昔からずっと builtin のまま。
> 実際、FreeBSDのスクリプトはechoが多用されてる。
OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
んだよ。undefined な仕様を利用するのは駄目だが。
0468名無しさん@お腹いっぱい。
2012/07/30(月) 10:22:50.67>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>んだよ。undefined な仕様を利用するのは駄目だが。
後出し条件追加ですか?w
0469名無しさん@お腹いっぱい。
2012/07/30(月) 10:33:03.72> いや、POSIXだよ。1997年のだけど。
さらっと嘘書くなよ。
ttp://en.wikipedia.org/wiki/Single_UNIX_Specification
にちゃんと、
・1997: Single UNIX Specification version 2
・2001: POSIX:2001, Single UNIX Specification version 3
Beginning in 1998, a joint working group known as the Austin Group
began to develop the combined standard that would be known as the
Single UNIX Specification Version 3 and as POSIX:2001 (formally:
IEEE Std 1003.1-2001).
って、書いてあるだろ。SUS と POSIX が統合されたのは、SUSv3 から。
SUSv2 は POSIX じゃない。
で、SUSv3 の echo の仕様
ttp://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html
には、ちゃんと implementation-defined って書いてある。
0470名無しさん@お腹いっぱい。
2012/07/30(月) 10:40:01.92>>んだよ。undefined な仕様を利用するのは駄目だが。
> 後出し条件追加ですか?w
オイオイ、規格書の読み方も知らんのか…
もし implementation-defined な仕様の利用が許されないのなら、
そもそも、なんでわざわざそんな仕様を決めるんだよ。
状況が許せば使っていいからに決まってるだろ。
規格書読む上では、implementation-defined と unspecified と undefined の
違いくらい常識だから、勉強しておくように。
0471名無しさん@お腹いっぱい。
2012/07/30(月) 10:45:07.83論点がずれてるし、そんなこと言ってないよ。
「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
0472名無しさん@お腹いっぱい。
2012/07/30(月) 10:51:04.06嘘書いておいて、謝罪もなしか、厚顔無恥とはお前のためにあるような
言葉だな。
> 論点がずれてるし、そんなこと言ってないよ。
> 「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
論点がずれているのは、おまえさんの方。
もともと「POSIXだけ守ってれば良い」っていうのは、
「ポータブルなスクリプトを書く」という目的を達成するための手段の話だ。
FreeBSD の OS 附属のスクリプトなんて、ポータブルである必要がそもそも
全くない。シェルは ash、OS は FreeBSD だけ考えれば十分だ。
だから、POSIX を守る必要なんてそもそもない。
そういうものを挙げて「POSIXだけ守ってれば良い」っていう意見への反論だと
思うってことは、お前がそもそも、何の話をしているのか理解してないって
ことだな。
0473名無しさん@お腹いっぱい。
2012/07/30(月) 10:54:17.05>だから、POSIX を守る必要なんてそもそもない。
↑
POSIXを守る必要なんてそもそもないんですね、駄目押しありがとう。
0474名無しさん@お腹いっぱい。
2012/07/30(月) 11:01:41.95命題勝手に作り出してそれを強制終了する以外にチンケなプライド守る方法が
無くなってしまったんだよ。
元々の噴飯ものの主張が
>>390
> ・bash/zsh/kshの共通項に合わせる
> か、
> ・純shに合わせる
> かの2択。
それで、共通項は手作業でAND取るんだって。プロwww
これでechoにかかわる非互換はどう解消されるんだろう。
0475名無しさん@お腹いっぱい。
2012/07/30(月) 11:03:16.64そういう限定した話を、OS限定しないスレで明示せずに主張してたのか。
悲しい奴だな。
一応指摘しておくが、たとえ「FreeBSD でだけ動けば良いスクリプト」を書く
場合でも(POSIX を守る『必要』はないが)、「POSIX を読んで理解しておく」
方がいいことは明白だ。
POSIX を参照せず、個々のシェルのマニュアルだけ読んでいるってのは、
C++言語の仕様も知らずに、Visual C++ のマニュアルだけ読んでるってのと
同じで、全く褒められた話じゃないからな。
もちろん、ash/bash/zsh すべてで動くスクリプトを書くつもりがあるのであれば、
たとえ FreeBSD 限定であっても POSIX を読んでおいた方がいい。その方が
知識取得の効率がいいからな。
ash/bash/zsh すべてのマニュアルを読んでおくのも勿論良い姿勢で、これまで
それで済んでいたのは分かるが、効率の点からは POSIX を読まないというのは
損であるとしか言いようがない。まあ自分の時間を無駄にしたいのであれば、
それでも構わんが、一般論としてスレでそれを主張するのはやめとけ。
0476名無しさん@お腹いっぱい。
2012/07/30(月) 11:03:31.55>これでechoにかかわる非互換はどう解消されるんだろう。
AND取る時点で自動的に解消されてるよ。
0477名無しさん@お腹いっぱい。
2012/07/30(月) 11:06:07.21はあ?
bash/ksh/zsh/ashで動くスクリプト要求されたらどうするんですかあ?
ANDが空集合だから出来ません。と断るんですか? www
プロは仕事を選ぶ www
0478名無しさん@お腹いっぱい。
2012/07/30(月) 11:09:55.97いってたやり方を続けたいってのは人間の性質としてありがちではあるが。
ちょっと考えれば全部読んでANDするなんて効率悪いことぐらい分かりそうなのに。
エンジニアだったら、時間を効率的に使うことが美徳であることくらい知ってる
だろうに、恥ずかしくならないのかな。
0479名無しさん@お腹いっぱい。
2012/07/30(月) 11:11:49.79実際にAND取ってみればわかるが、空集合にはならない。
その集合だけでOKの用途の場合はechoを使う。
そうじゃない場合はecho以外の手段を使う。
ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
何の解決にもならない。批判してるのはそういう点だよ。
0480名無しさん@お腹いっぱい。
2012/07/30(月) 11:14:59.11> 何の解決にもならない。批判してるのはそういう点だよ。
いや、POSIXに従うのであれば printf を使えば解決する。FreeBSD でも動くよ。
まあ FreeBSD 5.X〜8.X では、ちょっと遅いが、それは FreeBSD が一時期、
判断間違えてただけの話(しかも、もう直ってる)。
FreeBSD 5.X〜8.X 固有のマイナーな問題点を、OS を限定しないスレで主張すんな。
0481名無しさん@お腹いっぱい。
2012/07/30(月) 11:16:06.92> そうじゃない場合はecho以外の手段を使う。
ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。 www
0482名無しさん@お腹いっぱい。
2012/07/30(月) 11:20:56.87ご苦労さんとしか言いようがないよなあ。
POSIX にズバリそのまま書いてあることを、3つのマニュアルを見比べて、
自分の頭の中でANDするという手間ヒマかけて再発見とか。
まあ、それだけ暇な仕事なんだろう。ある意味うらやましいな。
真似は絶対したくないがw
0483名無しさん@お腹いっぱい。
2012/07/30(月) 11:27:08.81指摘されるまで AND取ったら空集合だと思い込んでたみたいだし。
0484名無しさん@お腹いっぱい。
2012/07/30(月) 11:48:32.16はあ? AND取るのにPOSIXは関係ありませんが。
4つのシェルのANDとるなんてバカな作業はもちろんやったことないですけど。www
0485名無しさん@お腹いっぱい。
2012/07/30(月) 11:50:29.323つのシェルの仕様のANDをとるのはバカじゃないって思ってんの?
フツー1つの仕様(POSIX)読んで終りだろう、常識的に考えて。
0486名無しさん@お腹いっぱい。
2012/07/30(月) 11:54:55.78やだなあ。レス番よく追ってよ。僕(>>477)は、3つのシェルの仕様のANDを
取ってる自称プロを弄ってた方だよ。
0487名無しさん@お腹いっぱい。
2012/07/30(月) 12:02:20.94まあ >>477 の主張はちょっと不明確な気がする。
4つのシェルの仕様のANDとって、空集合になるなんてことはあまりない
(だいたいは代替手段がある)ので、何が言いたいのか分からないな。
4つのシェルの仕様をちゃんと読めば、目的が果たせることには変わりない。
問題なのは、それがとんでもない時間の無駄使いだってことだろう。
0488名無しさん@お腹いっぱい。
2012/07/30(月) 12:02:51.87または
バックスラッシュが使われている場合が implementation-defined
と書かれている。
実はこれダウトなんだよ。
bashやzshのechoとか、-E (大文字)も特別扱いするから、(-eもだけど)
echo -E は、POSIXで言うところのimplementation-definedに該当しないはずなのに
ポータビリティーがない。
-E -e の件はPOSIX読んだだけでは書かれていないから、
正確なことを知るには自分でAND取るしかない。
0489名無しさん@お腹いっぱい。
2012/07/30(月) 12:08:03.50でも、自称プロは自分でANDを取る。 w
延べ数千人のレビューを経たPOSIXより、自分でANDを取った規約の方が上。
0490名無しさん@お腹いっぱい。
2012/07/30(月) 12:11:17.53延べ数千人のレビューを得ても echo -E / echo -e を見落としたんですか?
0491名無しさん@お腹いっぱい。
2012/07/30(月) 12:18:41.90> 正確なことを知るには自分でAND取るしかない。
お、珍しくマトモな意見だな。
POSIX の仕様が -n に限ってるのは、BSD の仕様をベースにしてるからだな。
だから *BSD で /bin/sh 使う分には POSIX だけで OK だけど、bash や zsh
だとまずい。
実際、俺は - で始まる文字列は単に避けるか、どうしても必要な場合は
printf 使うようにしてるんだよね。
規格は基本、実装の後追いだから、Linux 起源の仕様がどんどん POSIX に
採り入れられている現状からして、そのうち、echo の仕様も訂正されるん
じゃないかな。(でも getline(3) みたいなウンコはやめて欲しかったがなorz)
こういう齟齬は避けられないから、テストは不可欠だし、できれば各シェルの
マニュアルも確認しておいた方がいい。
でも、順番としてはまず POSIX が最初で、各シェルのマニュアルを参照するのは
後だよ。こういう例外を除き、ほとんどの場合、POSIX が仕様の AND をとっていて
くれるので、その方がずっと効率がいいからな。
だから、「各シェルのマニュアルも読んだ方がいいよ」って言うのなら主張として
いいんだよ。だが「POSIX は要らん。各シェルのマニュアルのANDだけで良い」と
いう主張はおかしい。まず最初に POSIX を確認すべき。
「各シェルのマニュアルのAND」は最後でいい。テストでコケるまで参照しなくても
いいくらいに優先順位が低い。
0492名無しさん@お腹いっぱい。
2012/07/30(月) 13:58:58.260493名無しさん@お腹いっぱい。
2012/07/30(月) 14:03:07.82それに Debian GNU/Linux があるぜ。
まあ FreeBSD だけに限っても無理だろうけど。
0494名無しさん@お腹いっぱい。
2012/07/30(月) 22:42:54.260495名無しさん@お腹いっぱい。
2012/07/30(月) 23:13:07.540496名無しさん@お腹いっぱい。
2012/07/31(火) 00:37:56.280497名無しさん@お腹いっぱい。
2012/07/31(火) 00:57:04.92ANDとる作業で工数水増ししてるのかもね。w
0498名無しさん@お腹いっぱい。
2012/07/31(火) 01:04:07.56""rm
という記述を見たんですが、""ってなんか意味があるんでしょうか?
0499名無しさん@お腹いっぱい。
2012/07/31(火) 02:14:35.410500名無しさん@お腹いっぱい。
2012/07/31(火) 06:30:16.070501名無しさん@お腹いっぱい。
2012/07/31(火) 12:35:16.71だからだろ
0502名無しさん@お腹いっぱい。
2012/07/31(火) 12:46:26.030503名無しさん@お腹いっぱい。
2012/07/31(火) 14:19:59.11なんか重い処理を並列で走らせるときに
cmd1 &
cmd2 &
cmd3 &
wait
みたいな感じで。
0504名無しさん@お腹いっぱい。
2012/07/31(火) 14:34:56.99それジョブコントロールちゃう。ただのバックグラウンド。
SIGTSTPで止めてバックに回して、
あとで fgしたりするやつ。
0505名無しさん@お腹いっぱい。
2012/07/31(火) 15:01:13.63節子、を付けるべきだなw
0506名無しさん@お腹いっぱい。
2012/07/31(火) 15:07:12.600507名無しさん@お腹いっぱい。
2012/07/31(火) 15:16:47.63ちがう。
決定的な違いはプロセスグループIDの処理。
ジョブコントロールの場合は各コマンドのプロセスグループIDを別々にして、
親のシェルからは独立する。ttyの端末プロセスグループIDを
フォアグラウンドプロセスと同一にし、管理を行なう。
一方、ジョブコントロールなしの場合は、fork/execのあと、
単にwaitしないというだけの処理で、プロセスグループIDは親シェルと同じ。
だから、Ctrl-Cで同一プロセスグループIDのプロセスが死なないように
&を付けたコマンドはSIGINTを無視するようにしている。
(ジョブコントロール有りの場合はSIGINTはそのまま無視しない)
ジョブコントロールは、今のシェルなら set +m で無効にできる。
set +m でジョブコントロール無効にした状態でも
& や waitは実行できる。
純正/bin/shにはジョブコントロールがなかったが、
& や waitは当然実行できる。
0508名無しさん@お腹いっぱい。
2012/07/31(火) 15:31:33.28それって\の方がシンプルだよね?
0509名無しさん@お腹いっぱい。
2012/08/01(水) 22:19:00.88if [ -z "$MNT" ]; then
mount -t proc proc ../rootfs/proc/
fi
この構文は短縮できないんでしょうか
0510名無しさん@お腹いっぱい。
2012/08/01(水) 22:22:35.02mount | grep -q 'rootfs/proc' && mount -t proc proc ../rootfs/proc
0511510
2012/08/01(水) 22:23:46.64|| に。
0513名無しさん@お腹いっぱい。
2012/08/02(木) 08:59:36.06mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1 || :
でいいじゃね?
0514名無しさん@お腹いっぱい。
2012/08/02(木) 09:25:31.26mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1; :
でいいじゃね?
0515名無しさん@お腹いっぱい。
2012/08/02(木) 09:28:56.050516名無しさん@お腹いっぱい。
2012/08/02(木) 20:18:32.37command hoge $@
}
という関数を定義してたんですが
jikken -m "" -n "" unko
というコマンドを実行すると
hoge -m -n unko
というコマンドの実行になってしまうんですよね。
引数をきっちり hoge に渡すには
どうしたらいいんですかね
0517名無しさん@お腹いっぱい。
2012/08/02(木) 20:24:44.260518名無しさん@お腹いっぱい。
2012/08/02(木) 20:29:19.70ありがとう
0519名無しさん@お腹いっぱい。
2012/08/08(水) 12:58:57.06同じことを bash の拡張機能を使わず、かつ内部コマンドだけでやる方法ってないかな?
いまは echo $a | cut -c$x-$y でやってるけど、
スクリプト中で何百回と呼ばれていて、これのせいでかなり速度が遅くなっちゃってる。
0520名無しさん@お腹いっぱい。
2012/08/08(水) 13:18:46.05頭の3文字と後ろの2文字をカットしたい場合、
a=ABCDEFG
b=${a#???}
echo "${b%??}"
みたいにするしかないかな。この例では DE が残る。
0521名無しさん@お腹いっぱい。
2012/08/08(水) 14:17:12.55? を指定回数数並べた文字列を作るのにまためんどくさい手間がかかるのはちょっと。
とはいえ、やっぱり方法はそれしかないよなぁ。
0522名無しさん@お腹いっぱい。
2012/08/08(水) 14:18:52.44printf %.5s '??????????????'
で5個の ????? が得られるよ。
0523名無しさん@お腹いっぱい。
2012/08/08(水) 14:20:25.24printf "%.*s" 5 '?????????????????????????????'
0524名無しさん@お腹いっぱい。
2012/08/08(水) 14:24:59.78>>522 で合ってる。 %.${a}s にすればいいだけ
0525名無しさん@お腹いっぱい。
2012/08/08(水) 14:35:28.320526名無しさん@お腹いっぱい。
2012/08/08(水) 15:49:08.270527名無しさん@お腹いっぱい。
2012/08/08(水) 21:33:50.42一時ファイルの代わりにこれを使えばHDDガリガリしなくて済むんだよね?
0528名無しさん@お腹いっぱい。
2012/08/09(木) 00:33:59.19diff -u <(ls /old) <(ls /new)
とかできるから、わざわざ名前つけたりは、ほとんどしなくなったなあ。
0529名無しさん@お腹いっぱい。
2012/08/09(木) 06:48:33.30(mkfifoのことじゃなくて)
0530名無しさん@お腹いっぱい。
2012/08/09(木) 10:01:01.43それはないと思いたいところだけどなあ。どうだろね。
0531名無しさん@お腹いっぱい。
2012/08/09(木) 10:45:19.41実装依存だな。(言葉の誤用ではない)
FreeBSDだと本当にnamed pipeで実装されてるよ。
bash$ file <(:)
/tmp/sh-np-4033202023: fifo (named pipe)
0532名無しさん@お腹いっぱい。
2012/08/09(木) 10:57:37.18どうやってnamed pipe以外で実装するんだよ。
0533名無しさん@お腹いっぱい。
2012/08/09(木) 10:59:51.72Linuxだと、普通のpipeで実装して、それを/dev/fd/n(/proc/self/fd/n)経由で参照する 。
だからnamed pipeにする必要はない。
0534名無しさん@お腹いっぱい。
2012/08/09(木) 11:09:46.250535名無しさん@お腹いっぱい。
2012/08/09(木) 11:47:08.570536名無しさん@お腹いっぱい。
2012/08/09(木) 11:49:03.21いや、実装依存だから、名前の誤用なんだよ。
「<(コマンド)」の実装に常に named pipe が必要ならばともかく、
pipe(2) で実装されたり named pipe で実装されたりするものを、
named pipe って呼んじゃ駄目でしょ。
0537名無しさん@お腹いっぱい。
2012/08/09(木) 11:50:51.69「<(コマンド)」の場合なら、これを解釈するシェルが始末する。
自力で named pipe 作ってるシェルスクリプトなら、ふつうは
そのスクリプトの中で trap とか使ってやるんじゃない?
(named pipe の目的にもよるので状況によりけりだけど)
0538名無しさん@お腹いっぱい。
2012/08/09(木) 12:06:58.48もともと「named pipeを自動で」という設計思想で設計されたものだから、
結果の実装がどうあれ、named pipeと呼んで良い。
0539名無しさん@お腹いっぱい。
2012/08/09(木) 12:13:15.060540名無しさん@お腹いっぱい。
2012/08/09(木) 12:23:57.330541名無しさん@お腹いっぱい。
2012/08/09(木) 12:31:51.13こんなのとか
daemon hoge <(hage)
0542名無しさん@お腹いっぱい。
2012/08/09(木) 13:19:33.96え、そんなの初めて聞いたぞ。
「"named pipe" "shell script"」でググって出てくる上位5サイトに
「<(コマンド)」や「>(コマンド)」の話が、チラっとも出てこない
ことからして、君の組織だけで生まれたローカルな用法なんじゃねえ?
0543名無しさん@お腹いっぱい。
2012/08/09(木) 13:32:16.610544名無しさん@お腹いっぱい。
2012/08/09(木) 13:35:52.740545名無しさん@お腹いっぱい。
2012/08/09(木) 13:40:06.410546名無しさん@お腹いっぱい。
2012/08/09(木) 13:40:10.34UNIX domain socketでは、そのファイル名を渡されたコマンド側が
open()でオープンできないから無理。
0547名無しさん@お腹いっぱい。
2012/08/09(木) 13:41:12.87openできないからだめ。
0548名無しさん@お腹いっぱい。
2012/08/09(木) 14:21:53.82「コマンド置換」と、
「名前つきパイプ または ファイル・ディスクリプターの /dev/fd 形式での指定」が、
きちんと分離して書かれてるね。
しかも、名前つきパイプが使えることと、コマンド置換が使えることは等価ではない
(ファイル・ディスクリプターの /dev/fd 形式での指定ができればコマンド置換が
使える)ことも明確に書かれている。
ますます >>538 が、何を読んで、コマンド置換のことを名前つきパイプだと
思い込んだのか知りたくなるな。まさか >>543 の文章じゃないよな。
0549548
2012/08/09(木) 14:26:25.67だった。
0550名無しさん@お腹いっぱい。
2012/08/09(木) 14:26:36.710551名無しさん@お腹いっぱい。
2012/08/09(木) 14:27:37.29「コマンド置換」??www
いつの間にコマンド置換に話になったんだよw
プロセス置換を理解していない無知自慢かよwww
0552名無しさん@お腹いっぱい。
2012/08/09(木) 15:34:32.97/dev/shmに一時ファイル作ってガリガリ言わんようにしてたな
他に何も代わりの方法を思いつかなかったからだが
パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
最近マルチコアが当たり前だし、キャッシュも利くだろうから、
一時ファイル作る方が速く処理が終わるかもしれん
0553名無しさん@お腹いっぱい。
2012/08/09(木) 15:52:20.68> パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
でかい出力処理 | less
とかやったことないの?
> 最近マルチコアが当たり前
と
> 一時ファイル作る方が速く
が、全然つながんねえ
0554名無しさん@お腹いっぱい。
2012/08/09(木) 15:56:31.53> と
> > 一時ファイル作る方が速く
> が、全然つながんねえ
だね。
名前つき/なしに関わらず、パイプやソケットならマルチコアで
並列に動く可能性がある(マルチコアを生かせる)けど、
ファイル経由してたら、シングルコアと性能変わらん。
>>551
で、結局、「プロセス置換のことを、named pipe と呼ぶ」っていうのは
どこかの組織のローカルルールの話だったってことで OK?
世の中に広まってる話なら、ソースよろ
0555名無しさん@お腹いっぱい。
2012/08/09(木) 16:12:16.26ggrks
0556名無しさん@お腹いっぱい。
2012/08/09(木) 16:17:46.74たぶんzshでしか動きません:)
command-line clock - Pastebin.com
http://pastebin.com/HvYxU9bu
>>read -t1 q ## -t1=timeout option 1 second.
ところで、ここを-t0.001とかどんどん小さな値にしていくと、終了時の動作(適当にEnterとか入力して終わらせてください。)として
breakした後にまだechoってるような表示になってまうことが10回起動・終了すれば1回ぐらいあるような感じなんですが、
これってなんでなんですか。
0557名無しさん@お腹いっぱい。
2012/08/09(木) 16:26:30.18sleep 0.5
とか入れてみればほぼ100%再現するよ
0558名無しさん@お腹いっぱい。
2012/08/09(木) 16:28:06.39答えられないのね。
0559名無しさん@お腹いっぱい。
2012/08/09(木) 16:29:35.46うん、そうなんですよね。どういうことなんでしょうか。
ていうか、プログラムのコピペミスってますね、さーせん。
0560名無しさん@お腹いっぱい。
2012/08/09(木) 16:33:00.69本当にありがとうございました。
0561名無しさん@お腹いっぱい。
2012/08/09(木) 16:36:14.11グーグルは存在の検索はできるが、非存在の検索は出来ない。
0562名無しさん@お腹いっぱい。
2012/08/09(木) 16:36:26.28readの変数への代入がwhileループ始まるより遅いってこと?
0563名無しさん@お腹いっぱい。
2012/08/09(木) 16:38:02.93本当にありがとうございました。
0564名無しさん@お腹いっぱい。
2012/08/09(木) 16:38:42.420565名無しさん@お腹いっぱい。
2012/08/09(木) 16:39:14.15変数への代入じゃなくて、
read実行開始時に端末のバッファをフラッシュする関係で
直前のEnterを取りこぼすということ。
0566名無しさん@お腹いっぱい。
2012/08/09(木) 16:42:25.90いや、それは違うだろ
0567名無しさん@お腹いっぱい。
2012/08/09(木) 16:45:15.730568名無しさん@お腹いっぱい。
2012/08/09(木) 16:47:58.63性能評価のレポートによりpipeで渡す方が効率が良いということになった。
もちろんSSDが主流になるといろいろと変わってくると思われるが。
0569名無しさん@お腹いっぱい。
2012/08/09(木) 16:49:47.73まあどっちも POSIX 外で、移植性はないけどな。
0570名無しさん@お腹いっぱい。
2012/08/09(木) 16:52:50.820571名無しさん@お腹いっぱい。
2012/08/09(木) 16:55:46.680572名無しさん@お腹いっぱい。
2012/08/09(木) 17:02:39.79sleep 0.5 は *BSD で可なので、Linux限定ではない
read -t は zsh で可なので、Linux限定ではない
0573556
2012/08/09(木) 17:18:27.14While文の条件判定の所で一番時間が掛かるようになっていって、
そこの間でEnterを打ち込むから、echoが二度効いてしまうように見えるってことかな?
最初はecho中にEnterが効いてるからと思ったけど、それならWhileループに二度目突入しないものね。
0574名無しさん@お腹いっぱい。
2012/08/09(木) 17:25:58.46echoの最初の文字を出力する瞬間までの、どこでもありうるね
echoが二度効いてるんじゃなくて、Enterで次の行に行っちゃったから、
そこにechoしてるだけ。
0575名無しさん@お腹いっぱい。
2012/08/09(木) 17:58:01.770576名無しさん@お腹いっぱい。
2012/08/09(木) 18:20:53.390577名無しさん@お腹いっぱい。
2012/08/09(木) 18:38:20.10所で、時計なのに一定時間待つって処理でいいの?タイマ設定してシグナル送ってもらった方が正確じゃね
0578556
2012/08/09(木) 18:59:37.13http://pastebin.com/nRfEbSZF
ちょっと改変して、コマンドのreturnの値を条件式として使うように、
こんな風にしてみました。
でも、こうしても-tの値を減少させていくと、二重にechoってるようになるのが
どうしても解せません。なんでだよ!さすがにおかしいだろ!
やっぱり順次処理されてないのでは?
>>577
そんな格好いいのが出来るなら、敗北は認めなければなりませんね。
そこに美しさがあれば世界金メダルは譲ります。
0579名無しさん@お腹いっぱい。
2012/08/09(木) 19:02:59.50そこでEnter打ったらなるんだよ
echoの前に sleep 入れてみたら確認できるだろ
0580556
2012/08/09(木) 19:06:32.81あ、前のechoが残ってるのか、
どうやらオバカさん世界一の金メダルは私のもののようですね。ふっふっふっ。
本当にどうもありがとうございました。
0581名無しさん@お腹いっぱい。
2012/08/09(木) 19:18:48.76BSD&Linux の拡張 sleep とかに依存せず、POSIX 範囲内で書けないか?
こんな感じ。
#!/bin/sh
while :; do printf "\r%s" "$(date +%Y-%m-%dT%H:%M:%S%:z)"; sleep 1; done &
pid=$!
read x
kill $pid
0582名無しさん@お腹いっぱい。
2012/08/09(木) 19:25:37.741秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?
0583名無しさん@お腹いっぱい。
2012/08/09(木) 19:26:03.35せっかくそこまでするなら $( ) は ` ` にすべき。
0584名無しさん@お腹いっぱい。
2012/08/09(木) 19:35:13.63> 1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?
対話的シェルにリアルタイム保証なんてないから、read -t の時刻指定を
いくら細かくしたところで、マシン負荷が高くなれば、2秒どころかもっと
進む可能性はあるよ。そういう、対話的シェルで実現困難な仕様は、そもそも
盛り込むべきじゃないだろう。
ちょっとの負荷で2秒とびが嫌だっていうなら、拡張sleepに依存して
sleep 1 を sleep 0.9 ぐらいにするって手は、まあないわけではない。
read -t や sleep で指定する秒数をあまり小さくすると、無駄なマシン負荷が
増えるので、あまり小さくするのは推奨せんが。
>>583
Solaris の古いシェルとかで動かすことも考慮するなら、その通りだな。
まあ、そこは常識で分かると判断した。
0585名無しさん@お腹いっぱい。
2012/08/09(木) 19:36:24.680586名無しさん@お腹いっぱい。
2012/08/09(木) 19:39:33.95それを sleep 0.123 とかの小数点以下に(計算の上)反映すれば
無駄にプロセスを使わずにうまく同期できるのでは?
0587名無しさん@お腹いっぱい。
2012/08/09(木) 19:41:11.55リアルタイムOSじゃないので、xclockだって、更新間隔が1秒より大きくなる
こともある。それが仕様。
xclock にだって不可能なことを、シェルスクリプトに求めるなんて、そもそも
そういう要求自体がおかしいってこと。
0588名無しさん@お腹いっぱい。
2012/08/09(木) 19:43:59.25高負荷時のことを考慮に入れるのなら、そんなんじゃ全くもって無理。
鯆管って、ほんとリアルタイム処理を分かってないなーって言っちゃうよ。
ちゃんと考えてみなよ。
どうしても分かんなければ説明するので、その場合は降参と宣言することw
0589名無しさん@お腹いっぱい。
2012/08/09(木) 19:46:52.910590名無しさん@お腹いっぱい。
2012/08/09(木) 19:47:45.98高負荷時のことはどうでも良くて、
位相的にきっちり合わせたいということでしょ。
非同期で突然 sleep 1 を whileループで回せば、
最初から誤差が最大 0.99999... 秒になる。
これを、毎回 date +%N で 1秒未満の残り時間を把握しつつ
sleep 0.9821 とかすれば「位相」が同期する。
0591556
2012/08/09(木) 19:50:02.71つーか、これでいいっすね。&使ってバックグラウンドに回しても表示効くのね。
しかもそいつをreadでインプット待ちにしておいて、インプット来たら殺すとかすげー。
でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
バックグラウンドジョブにしてるから?わかる人本当にお願いします。
>>582
そういう意図はありまくりんぐでしたけど、>>581さんのやり方でsleepの時間をさらに小さくするだけでいいように思います。負荷との兼ね合いですが。
0592名無しさん@お腹いっぱい。
2012/08/09(木) 19:53:13.20答えは、
高負荷時には、date +%N の実行だけで数秒ないしそれ以上の
時間がかかることがあるから
だ。
分かりやすい例でいうと、メモリが溢れていて、date コマンド
どころか、シェルまで swap に追い出されていて、スラッシング
しまくりの状況を考えてみるといい。
たとえメモリが足りててても、CPUその他のリソースが足りてなければ
数秒程度の遅延は普通に起こる。
まあ、鯆管的には、そんなに高負荷になる前にリソースなりマシンなりを
増やせってことになるので気にしてないだろうが、高負荷を気にしないなら
sleep 0.9 でも十分だ。
>>590
なるほど。
そういう意図であれば、確かに拡張sleepに依存するのもいいな。
0593名無しさん@お腹いっぱい。
2012/08/09(木) 19:59:25.40> でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
read と kill の間に、時間のかかるdateみたいな処理がないから、
その間にechoが動いてしまう可能性が確率的に非常に少ない。
そこにダミーのsleepでも入れれば二重表示にできるよ。
0594名無しさん@お腹いっぱい。
2012/08/09(木) 20:01:56.63read x
sleep 1
kill $pid
に変更すれば、二重表示が簡単に確認できる。
0596527
2012/08/09(木) 21:43:53.53やめといたほうがいいのかな… (; ・ω・)
0597名無しさん@お腹いっぱい。
2012/08/09(木) 21:56:40.30>>541の後始末のタイミングは?
0598名無しさん@お腹いっぱい。
2012/08/09(木) 22:20:41.64>>541 は、うまく動かない可能性もあるんじゃないかな。
まだ使用する前なのに消されてしまうことがあると予想。
ただ、コマンド hoge が既に named pipe をオープンし終えていれば、
ディレクトリツリーから named pipe が消されても、named pipe の実体は
残っている。その場合は動く。
というわけで、これは 消される前にオープンできるか否かという
race condition があるケースであり、うまいこと動くこともあるとは思う。
named pipe ではなく、pipe と /dev/fd/ を使った実装なら、
そういう race condition なしで動くだろうけど。
0599名無しさん@お腹いっぱい。
2012/08/09(木) 22:32:03.31<(...) や >(...) が named pipeで実装されてるFreeBSDのbashでちょっと
試してみたが、daemonみたいに子が先にexitして孫が残るケースでも無問題。
どうやら、named pipeに対する読み手と書き手が揃ってパイプがつながった段階で
unlink(2)される模様。プロセス実行中に先にunlinkされてる。
0600名無しさん@お腹いっぱい。
2012/08/09(木) 22:34:14.50以外な結果だなあ。
孫が、引数をオープンする前に、たとえば10秒くらい待つような場合、
named pipe を管理するシェルはずっと待機しているってこと?
0601名無しさん@お腹いっぱい。
2012/08/09(木) 22:35:20.24シェルの実装依存だ
zsh: 親が死んだらさっさと消す
bash: みんな死んでもbash自体が終了しても消さない
他は誰か試せ
テストコード
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void check(char *path) {
if (access(path, F_OK) == 0) printf("%s exists\n", path);
else printf("%s does not exist\n", path);
}
int main(int argc, char *argv[]) {
sleep(1); check(argv[1]);
sleep(1);
if (fork()) {
printf("forked\n");
sleep(1); check(argv[1]);
sleep(1); printf("parent exits\n");
exit(0);
} else {
sleep(3); check(argv[1]);
sleep(1); printf("child exits\n");
exit(0);
}
}
0602名無しさん@お腹いっぱい。
2012/08/09(木) 22:39:20.34読み手と書き手が揃わない場合は、named pipe は放置されるww
例えば、
bash$ ls <(:)
bash$ exit
なんてやると、lsコマンドも :コマンドもnamed pipeにアクセスしないから、
/tmp/np-sh-XXXXX みたいなファイルが残ったまま bashが終了できてしまう。
bash終了時にはunlinkしないみたい。
0603名無しさん@お腹いっぱい。
2012/08/09(木) 22:42:25.58でも残るんだが
0604名無しさん@お腹いっぱい。
2012/08/09(木) 22:42:51.12これはひどいw
FreeBSD でも /dev/fd/ が実際にはあるわけだから、named pipe じゃ
なくて、そっち使うように直した方がいいんじゃ。
0605名無しさん@お腹いっぱい。
2012/08/09(木) 22:46:21.67残らないよ。(bash/FreeBSDで)
0606名無しさん@お腹いっぱい。
2012/08/09(木) 22:48:04.29> でも残るんだが
FreeBSD-7.3 + bash-4.0.24 の組合せで確認した。
確かに /var/tmp/sh-np-数字 という名称で残る。
>>605
バージョンは?
0607名無しさん@お腹いっぱい。
2012/08/09(木) 22:50:00.77ls /dev/fd 3< file
↑これとか実行してみるとわかるが、
FreeBSDの /dev/fd は、0 1 2 しかファイル記述子に対応してない。(3以降ダメ)
0608名無しさん@お腹いっぱい。
2012/08/09(木) 22:50:56.70FreeBSD-8.1 bash-4.1.7
0609名無しさん@お腹いっぱい。
2012/08/09(木) 22:55:26.55マジか、知らなかった… が、確かにそのようだ。確認した。
NetBSD あたりから動く実装持ってくればいいのに。
NetBSD の方では、zsh も bash も /dev/fd/ 使ってる。
0610名無しさん@お腹いっぱい。
2012/08/09(木) 22:58:20.470611名無しさん@お腹いっぱい。
2012/08/09(木) 23:02:10.30FreeBSD-4.3 なら動いたよ。
/dev/fd/* の実体はキャラクタ型のデバイス・ファイルなので、
デバイス自体はたぶん FreeBSD-7 でも動くんじゃないかな。
つまり、devfs 導入時にデグレったんだ、これ。
0612名無しさん@お腹いっぱい。
2012/08/09(木) 23:05:07.38やっぱり named pipe が /var/tmp/ に残るね。
bash のバージョンの違いが原因ではなさそう。
0613名無しさん@お腹いっぱい。
2012/08/09(木) 23:10:05.47そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?
0614名無しさん@お腹いっぱい。
2012/08/09(木) 23:14:54.36そう、自分もそれが疑問だった。
kqueue(2) にはそういう機能なさそうだから、無理じゃないか。
まあ kdump(1) と同じことするって手がないわけじゃないが、
bash のやるようなことじゃない。
0615名無しさん@お腹いっぱい。
2012/08/09(木) 23:14:56.99オレもそれ考えてたんだけど、
named pipeに対して select(2)してパイプがつながったかどうか検出してるとか。
0616名無しさん@お腹いっぱい。
2012/08/09(木) 23:15:48.980617名無しさん@お腹いっぱい。
2012/08/09(木) 23:16:35.39書き手についても、書き込みが起こるか、あるいは書き込みオープン後クローズ
されれば分かるけど、書き込みオープンされただけじゃ分からない。
0618名無しさん@お腹いっぱい。
2012/08/09(木) 23:41:09.94cat <(ls)
した直後は確実に/var/tmp/sh-np-hogeが残っている。
けど、Enter押して次のプロンプトが出たときに消える。
別の端末でlsして確認した。
: <(ls)
だと消えない。
けど、誰かが cat /var/tmp/sh-np-hoge すると、
次のプロンプトを出すときに消える。
: <(ls)
して、bashをさっさとexitしてしまうと、
誰かが cat /var/tmp/sh-np-hoge しても、永久に残る。
つまり、named pipeを作ったbashが、プロンプトを出すか何かの時点で、
named pipeが読まれたかどうかを確認していることになる。
どうやってかは知らない。
0619名無しさん@お腹いっぱい。
2012/08/09(木) 23:51:57.74別の話だけど、名前付きパイプだと全く関係の無い別のプロセスからも
読み書きできるから大丈夫なのって思う
0620名無しさん@お腹いっぱい。
2012/08/09(木) 23:58:35.210621名無しさん@お腹いっぱい。
2012/08/10(金) 00:09:04.36kldload fdescfs
0622名無しさん@お腹いっぱい。
2012/08/10(金) 00:39:28.350623名無しさん@お腹いっぱい。
2012/08/10(金) 01:00:01.40頻繁に呼ばれるCGIとかでこれが起きたらやっぱりやだよ。
0624名無しさん@お腹いっぱい。
2012/08/10(金) 01:06:07.46・ <(hoge) が出てくると、mkfifoしてforkする。
・ 親シェルはそのfifoと子シェルpidをひもづける。
・ 子シェルはそのfifoをwrite openする。
・ fifoのwrite openは、readするプロセスがいなければブロックされる。
・ だから : <(hoge) だと、hogeは起動されず、子シェル状態のまま。
・ readするプロセスが現われたら、openが成功し、dup2してstdoutにつなぐ。
・ parse_and_executeを呼んで中でforkしてhogeを実行する。
・ hogeが終わったら子シェルは死ぬ。
・ 親シェルは定期的(コマンド起動のタイミングとか)にfifoにひもづけられた子シェルの状況を調べて、死んでたらfifoをunlinkする。
0625名無しさん@お腹いっぱい。
2012/08/10(金) 01:13:15.04コマンド列の最後のコマンド終了した時に消してるみたい。
0626名無しさん@お腹いっぱい。
2012/08/10(金) 01:18:16.27cat <(ls)
だと、子シェルが死ぬタイミングがちょっと遅れるみたいで、
直後にはfifoがunlinkされない。
cat <(ls); sleep 1
だと、確実に残らない。
0627名無しさん@お腹いっぱい。
2012/08/10(金) 01:19:10.770628名無しさん@お腹いっぱい。
2012/08/10(金) 01:21:11.65OK! おやすみ!
0629名無しさん@お腹いっぱい。
2012/08/10(金) 01:34:51.13してからbashを作るとpipe+/dev/fdで作成される。
0630名無しさん@お腹いっぱい。
2012/08/10(金) 01:39:01.51コンパイル時決め打ちだからちょっとまずいね。
0631名無しさん@お腹いっぱい。
2012/08/10(金) 01:58:31.640632名無しさん@お腹いっぱい。
2012/08/10(金) 07:29:33.75現在、'nc -l 12345'コマンドを発行し、それに対しsocket通信を行い、期待した通信が行われているか確認しています。
しかし、上記コマンドでは1回closeしてしまうと、上記コマンドも終了してしまいます。
連続的にsocket通信を行い、期待した結果が入っているかチェックを行いたかったので、以下のようなスクリプトを書きました
while :
do
`nc -l 12345`
done
しかし、上記を実行して、socket通信を行うと、なぜか、送信したデータを表示するのではなく、実行しようとして、エラーメッセージが出ます
socket通信を受けるたびに、nc -l... コマンドを発行し通信内容を表示するにはどうすればいいのでしょうか?
よろしくお願いいたします。
0633名無しさん@お腹いっぱい。
2012/08/10(金) 07:34:47.58` ` が余計だろ。
0634名無しさん@お腹いっぱい。
2012/08/10(金) 07:57:12.67わざわざシェルスクリプトにしなくても、
nc -k -l 12345
を発行(笑)すればcloseしても終了しないよ。
0635名無しさん@お腹いっぱい。
2012/08/10(金) 13:05:30.890636名無しさん@お腹いっぱい。
2012/08/10(金) 13:07:59.840637名無しさん@お腹いっぱい。
2012/08/10(金) 13:23:20.110638名無しさん@お腹いっぱい。
2012/08/10(金) 13:32:30.350639名無しさん@お腹いっぱい。
2012/08/10(金) 13:39:44.13> nc -k -l 12345
に使うのは正しいが、
> を起動
とは使わない。
> のように起動
0640名無しさん@お腹いっぱい。
2012/08/10(金) 13:49:30.52ktkr
0641名無しさん@お腹いっぱい。
2012/08/10(金) 14:01:15.32issueは機械語命令レベルならアリだけどな。
0642名無しさん@お腹いっぱい。
2012/08/10(金) 14:24:21.060643名無しさん@お腹いっぱい。
2012/08/10(金) 15:47:16.980644名無しさん@お腹いっぱい。
2012/08/10(金) 17:51:11.83乙
> ・ fifoのwrite openは、readするプロセスがいなければブロックされる。
そうか、これで read 側のオープンを検知できるのね。勉強になった。
この named pipe を使わう場合の実装、面倒臭そうだなー。
0645名無しさん@お腹いっぱい。
2012/08/10(金) 18:01:48.990646名無しさん@お腹いっぱい。
2012/08/10(金) 18:03:28.19open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。
0647名無しさん@お腹いっぱい。
2012/08/10(金) 18:04:12.63なにいってんの?
read側のオープンをブロックするって何?
0648名無しさん@お腹いっぱい。
2012/08/10(金) 18:04:46.74procfsがデフォで有効になってないこととも関係ある?
0649名無しさん@お腹いっぱい。
2012/08/10(金) 18:07:24.02O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。
0650名無しさん@お腹いっぱい。
2012/08/10(金) 18:16:22.36相手が読出しopenしてブロック解除されたことで「検出」してる。
0651名無しさん@お腹いっぱい。
2012/08/10(金) 18:33:26.93だと
1. named pipe作成
2. 読み出しオープン→cmd1実行
3. 書き込みオープン→cmd2実行
こんな順のはず。SIGPIPE/EPIPE食らわないように。
0652名無しさん@お腹いっぱい。
2012/08/10(金) 19:26:29.50procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。
0653名無しさん@お腹いっぱい。
2012/08/10(金) 19:36:16.750654名無しさん@お腹いっぱい。
2012/08/10(金) 19:52:21.85またそういう嘘をつかないように。
/proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。
*BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。
0655名無しさん@お腹いっぱい。
2012/08/10(金) 20:09:40.36FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。
Linuxとは違って各コマンドが /procに依存してない。
だから今のFreeBSDは /procを外す方向でしょ。
fdescfsの方は知らんけど。
0656名無しさん@お腹いっぱい。
2012/08/10(金) 20:13:34.09FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。
Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。
0657名無しさん@お腹いっぱい。
2012/08/10(金) 20:14:23.290658名無しさん@お腹いっぱい。
2012/08/10(金) 20:24:09.55意味ないじゃんみたいなことを偉い人が言ったせいだって話を、どっかで
誰かが書いてたような気がする。
NetBSDは昔っから/procはマウントしてない。
で、fdescfs使うかどうかはあまり問題じゃなくて、/dev/fd/*がちゃんと
使えればそれでいいんだと思うよ。devfs登場前のFreeBSDとか、NetBSDとかは
fdescfsなしでも/dev/fd/*が、まあまあちゃんと使えたわけで、だったら
fdescfsなしでもいいじゃんみたいな発想だと思う。
devfs導入時に、/dev/fd/*が中途半端な状態になっちゃった(3未満の
ディスクリプタに対してしか動かなくなった)のが真の問題でしょう。
サポートしないつもりなら/dev/fd/*を削った方がいいし、サポートする
つもりなら、もうちょっとなんとかした方が。
0659名無しさん@お腹いっぱい。
2012/08/10(金) 20:27:13.360660名無しさん@お腹いっぱい。
2012/08/10(金) 20:28:39.420661名無しさん@お腹いっぱい。
2012/08/10(金) 20:33:35.240662名無しさん@お腹いっぱい。
2012/08/10(金) 20:35:08.85ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。
ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。
0663名無しさん@お腹いっぱい。
2012/08/10(金) 20:37:40.19NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。
0664名無しさん@お腹いっぱい。
2012/08/10(金) 20:41:55.71/procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。
0665名無しさん@お腹いっぱい。
2012/08/10(金) 20:46:25.76それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。
0666名無しさん@お腹いっぱい。
2012/08/10(金) 20:47:55.890667名無しさん@お腹いっぱい。
2012/08/10(金) 20:50:45.89process関係ないw
processorじゃ!とかなしよん
0668663
2012/08/10(金) 20:52:29.93それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。
0669名無しさん@お腹いっぱい。
2012/08/10(金) 20:55:14.28さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。
0670名無しさん@お腹いっぱい。
2012/08/10(金) 20:59:10.47/proc, /sysみたいにテキストになってるもの素敵やん。
0671名無しさん@お腹いっぱい。
2012/08/11(土) 00:12:39.76スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
0672名無しさん@お腹いっぱい。
2012/08/11(土) 00:20:16.15中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね
0673名無しさん@お腹いっぱい。
2012/08/11(土) 01:49:37.99/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
0674名無しさん@お腹いっぱい。
2012/08/14(火) 03:35:46.04bashだけのものですか?
他のシェルでも使える?
0675名無しさん@お腹いっぱい。
2012/08/14(火) 09:38:22.60ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
0676名無しさん@お腹いっぱい。
2012/08/14(火) 20:07:54.88echo abcde | zip test.zip -
ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
0677名無しさん@お腹いっぱい。
2012/08/14(火) 20:15:26.80echo abcde | zip test.zip hoge.txt
とか。symlinkは許せ。
0678名無しさん@お腹いっぱい。
2012/08/14(火) 22:50:08.33希望が見えました。ありがとう。
0679名無しさん@お腹いっぱい。
2012/08/14(火) 23:00:48.310680名無しさん@お腹いっぱい。
2012/08/15(水) 05:39:00.88普通にtemporaryファイルつくって消したら?
0681名無しさん@お腹いっぱい。
2012/08/15(水) 06:50:20.970682名無しさん@お腹いっぱい。
2012/08/16(木) 00:43:00.83echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
0683名無しさん@お腹いっぱい。
2012/08/16(木) 00:47:05.41って最近似たような質問見たような。
0684名無しさん@お腹いっぱい。
2012/08/16(木) 01:01:11.89すいません、""の存在をすっかり忘れていました。
ありがとうございました。
0685名無しさん@お腹いっぱい。
2012/08/16(木) 13:52:12.32echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?
0686名無しさん@お腹いっぱい。
2012/08/16(木) 13:57:08.74$ A=$((91-72))
$ echo $A
19
できてるけど
0687名無しさん@お腹いっぱい。
2012/08/16(木) 14:00:53.80A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。
0688名無しさん@お腹いっぱい。
2012/08/16(木) 16:01:24.160689名無しさん@お腹いっぱい。
2012/08/16(木) 17:14:30.15系とエスパー
0690名無しさん@お腹いっぱい。
2012/08/16(木) 18:10:35.35ってなんでエラーになるの?
0691名無しさん@お腹いっぱい。
2012/08/16(木) 18:14:24.15wcの出力にファイル名(a.txt)が出ちゃうから。
echo $(( `wc -l < a.txt` / 2 ))
で桶
0692名無しさん@お腹いっぱい。
2012/08/16(木) 20:20:08.24ありがとう
0693名無しさん@お腹いっぱい。
2012/08/17(金) 12:54:21.22ベタテキストよりオブジェクトそのままの方が扱いやすい。
0694名無しさん@お腹いっぱい。
2012/08/17(金) 14:11:13.110695名無しさん@お腹いっぱい。
2012/08/18(土) 09:29:13.33linuxのシェルでの問題です。
@aaa="a b";echo ${aaa}
a b と半角スペースがなぜ詰まるのでしょうか?
ASJISテキストファイル編集時の文字化け
やりたい事、csv2ファイル入力し、双方マッチングし
条件により、行データを出力するしないを制御するだけのものです。
そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト
で出力したものに関しては文字化けは見受けられなかった。
文字化けが発生したのは
read LINEで一行読込
echo ${LINE} >> out.cvs で追加出力
とした場合のみ
前者後者あまり違いが内容に思われるのですが対策って有るでしょうか?
ちなみにlinux側の文字コードはutf8設定です。
当編集シェル実行時のみ文字コードを環境変数なりで変えることは
可能でしょうか?またその方法は有効でしょうか?
よろしくお願いします。
0696名無しさん@お腹いっぱい。
2012/08/18(土) 09:37:46.512 readはバックスラッシュを解釈する。したがってSJISでは利用できない。
0697名無しさん@お腹いっぱい。
2012/08/18(土) 09:39:32.05機種依存文字使うな
aaa="a b";echo "$aaa"
echo "$LINE"
同じような質問が、>>683 で出たばかり
0698名無しさん@お腹いっぱい。
2012/08/18(土) 09:42:26.61どうせbashだろうから、
IFS= read -r LINE
echo "$LINE"
でいいな。
0699名無しさん@お腹いっぱい。
2012/08/18(土) 09:56:30.061.機種依存注意します。
2.類似質問分からず失礼しました。
職場ではnetに繋げないため、別の場所からの質問でした。
直ぐの確認できませんが、後ほど確かめます。
ありがとうございました
0700名無しさん@お腹いっぱい。
2012/08/18(土) 10:32:16.48スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。
0701名無しさん@お腹いっぱい。
2012/08/18(土) 10:46:31.570702名無しさん@お腹いっぱい。
2012/08/18(土) 10:56:37.52SJIS @
0703名無しさん@お腹いっぱい。
2012/08/18(土) 11:02:46.61Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。
0704名無しさん@お腹いっぱい。
2012/08/18(土) 14:37:23.030705名無しさん@お腹いっぱい。
2012/08/18(土) 14:43:39.83ばかじゃね?
0706名無しさん@お腹いっぱい。
2012/08/18(土) 14:46:18.510707名無しさん@お腹いっぱい。
2012/08/18(土) 15:04:19.060708名無しさん@お腹いっぱい。
2012/08/18(土) 15:26:19.780709名無しさん@お腹いっぱい。
2012/08/18(土) 15:33:34.030710名無しさん@お腹いっぱい。
2012/08/18(土) 16:26:28.280711名無しさん@お腹いっぱい。
2012/08/18(土) 16:49:46.330712名無しさん@お腹いっぱい。
2012/08/18(土) 16:53:07.24なんだかな。。。
>>711
意味不明なオレ様英語で書かれるより遥かにマシ。
0713名無しさん@お腹いっぱい。
2012/08/18(土) 17:39:52.74確かに。ヘタな英語のほうがまだマシだな。
0714名無しさん@お腹いっぱい。
2012/08/18(土) 22:13:16.26心配でしたので、自分のPCにcygwinをいれて試してみました。
1,2点確認取れました。
全く同じ環境ではないですが、問題なさそうですね。
安心しました。助かりました。
ありがとうございました。
0715名無しさん@お腹いっぱい。
2012/08/19(日) 08:36:59.512chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。
0716名無しさん@お腹いっぱい。
2012/08/19(日) 08:55:36.890717名無しさん@お腹いっぱい。
2012/08/19(日) 09:32:20.05どの板?
0718名無しさん@お腹いっぱい。
2012/08/19(日) 13:27:36.99スレ違いなので誘導?です↓
2chで外国語の特殊文字を使うには[unicode][専ブラ] 2
http://awabi.2ch.net/test/read.cgi/gogaku/1298542858/
0719名無しさん@お腹いっぱい。
2012/08/19(日) 14:00:34.37その板も Shift_JISだねw
0720名無しさん@お腹いっぱい。
2012/08/19(日) 17:08:00.350721名無しさん@お腹いっぱい。
2012/08/20(月) 00:07:04.29正規化してフルパスにしたいんだけど
一番かっこういい方法はどんな手順?
0722名無しさん@お腹いっぱい。
2012/08/20(月) 00:10:53.29FreBSDならrealpath
0723名無しさん@お腹いっぱい。
2012/08/20(月) 00:37:28.76NetBSDではどうしたらいいんでしょうか
0724名無しさん@お腹いっぱい。
2012/08/20(月) 00:40:15.070725名無しさん@お腹いっぱい。
2012/08/20(月) 00:40:16.430726名無しさん@お腹いっぱい。
2012/08/20(月) 01:00:03.170727名無しさん@お腹いっぱい。
2012/08/20(月) 01:56:51.87完璧な方法
1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
0729名無しさん@お腹いっぱい。
2012/08/20(月) 06:32:20.27それだと対象ファイルがパーミッションでopenできない時に使えない。
openせずに直接 statした方が良い。
0730名無しさん@お腹いっぱい。
2012/08/20(月) 06:40:53.50acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。
0731名無しさん@お腹いっぱい。
2012/08/21(火) 15:37:54.91ls -t | <最初の一行目を抽出するコマンド>
のような使いかたがしたいのですが。
0732名無しさん@お腹いっぱい。
2012/08/21(火) 15:42:20.180733名無しさん@お腹いっぱい。
2012/08/21(火) 15:42:47.760734名無しさん@お腹いっぱい。
2012/08/21(火) 15:48:22.55head -n 1 や head -1 は多数が回答するから面白くない。
sed -n 1p あたりで回答しとけ。評価上がるぞ。
0735名無しさん@お腹いっぱい。
2012/08/21(火) 15:51:18.32俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。
0736名無しさん@お腹いっぱい。
2012/08/21(火) 15:57:36.750737名無しさん@お腹いっぱい。
2012/08/21(火) 15:59:31.28ls -t | (read f; echo "$f")
0738731
2012/08/21(火) 16:00:29.240739名無しさん@お腹いっぱい。
2012/08/21(火) 16:48:36.64何故カスかという効率の差に関して記述すれば評価上がるぞ。
0740名無しさん@お腹いっぱい。
2012/08/21(火) 16:51:32.61sed 1q ならどうですか?
0741名無しさん@お腹いっぱい。
2012/08/21(火) 16:58:40.58シェル側でパイプ開いてreadするのが最強
0742名無しさん@お腹いっぱい。
2012/08/21(火) 20:14:52.480743名無しさん@お腹いっぱい。
2012/08/22(水) 01:21:58.16パイプは使ったが
> ls -t | <最初の一行目を抽出するコマンド>
の形になってないからだめか
0744743
2012/08/22(水) 01:29:14.30こうしたら一応できた
0745名無しさん@お腹いっぱい。
2012/08/22(水) 01:40:47.17Linux系ではed入ってないことも多いんだよなあ。
0746名無しさん@お腹いっぱい。
2012/08/22(水) 02:57:14.91中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw
0747名無しさん@お腹いっぱい。
2012/08/22(水) 03:14:43.870748名無しさん@お腹いっぱい。
2012/08/22(水) 15:08:45.070749名無しさん@お腹いっぱい。
2012/08/22(水) 22:33:02.240750名無しさん@お腹いっぱい。
2012/08/22(水) 23:14:05.900751名無しさん@お腹いっぱい。
2012/08/26(日) 11:54:24.95グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、
ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか
0752名無しさん@お腹いっぱい。
2012/08/26(日) 12:01:34.46echo `echo ¥`date¥``
0753名無しさん@お腹いっぱい。
2012/08/26(日) 12:03:20.510754名無しさん@お腹いっぱい。
2012/08/26(日) 12:11:27.990755名無しさん@お腹いっぱい。
2012/08/30(木) 23:13:56.24レッドハットとHP-UX混在環境です。
サーバーA、サーバーB、サーバーCとあり
全て異なるネットワークに属しているサーバで
ftpやhulftでのファイルやり取りを行います。
サーバー間でファイルの送受信を行うスクリプトを組むのですが、
ファイルごとに組むと100本近くになってしまうため、外部定義ファイルにパスなどを記述し
そこからパスなどを読んで処理するような作りをかんがえてます。
例えばhulftならhulft idを引数にしてそのhulft idの行にファイルのパスやファイル名、
sendなのかrecvなのかを記載しそれらをスクリプト内で代入出来ればいいんじゃないか
と思ったのですが具体的な構文がいまいち浮かびません。
またサーバーA上にシェルA、サーバーB上にシェルBといて
シェルBはシェルAからキックされる場合、引数や変数は継承されますでしょうか。
0756名無しさん@お腹いっぱい。
2012/08/30(木) 23:23:26.73ファイル名にスペース等が含まれていないなら、
for file in `cat 外部定義ファイル`; do ...
で行ける。
異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。
0757名無しさん@お腹いっぱい。
2012/08/31(金) 09:31:26.31少なくとも、バッシュやZSHかな大別できるのは…
Kshは癖があるな。
シェルを実行するためには、chmodのコマンド手続きがいるだろ?
そんなこと初心者には周知されていない。
コマンド入力にしても ./付けるとかひと工夫しないとだめだ。
この件も初心者には周知されていない。
初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。
しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも
わからない筈だ。
0758名無しさん@お腹いっぱい。
2012/08/31(金) 09:47:52.570759名無しさん@お腹いっぱい。
2012/08/31(金) 12:48:53.440760名無しさん@お腹いっぱい。
2012/08/31(金) 12:50:56.18馬鹿は無理に答えなくていいよw
0761名無しさん@お腹いっぱい。
2012/08/31(金) 13:04:38.23どっか間違ってました?
0762名無しさん@お腹いっぱい。
2012/08/31(金) 13:07:21.17.を含めちゃいかんだろ、と。
0763名無しさん@お腹いっぱい。
2012/08/31(金) 13:08:11.26勉強不足を人のせいにされてもなぁ。
0764名無しさん@お腹いっぱい。
2012/08/31(金) 13:21:45.38ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと
あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような
0765名無しさん@お腹いっぱい。
2012/08/31(金) 14:24:17.000766名無しさん@お腹いっぱい。
2012/08/31(金) 15:34:17.51かなりカッコ悪い。
0767名無しさん@お腹いっぱい。
2012/08/31(金) 15:39:47.48あれってbashのことなんだろうか。
0768名無しさん@お腹いっぱい。
2012/08/31(金) 16:03:33.420769名無しさん@お腹いっぱい。
2012/08/31(金) 23:12:05.50大丈夫じゃねーよ、バカ。
0770名無しさん@お腹いっぱい。
2012/09/01(土) 02:21:32.430771名無しさん@お腹いっぱい。
2012/09/01(土) 09:17:52.290772名無しさん@お腹いっぱい。
2012/09/01(土) 09:27:17.810773名無しさん@お腹いっぱい。
2012/09/01(土) 09:31:57.030774名無しさん@お腹いっぱい。
2012/09/01(土) 14:01:09.120775名無しさん@お腹いっぱい。
2012/09/02(日) 04:13:15.79bash=バッシュ
csh=シーシェル
d-shell=ディーシェル
sh=ビーシェル
tcsh=ティーシーシェル
zsh=ゼットシェル
バッシュだけアホみたい。
0776名無しさん@お腹いっぱい。
2012/09/02(日) 09:58:21.310777名無しさん@お腹いっぱい。
2012/09/02(日) 10:08:27.84「z」は、
イギリス発音なら「ゼッ『ド』」
アメリカ発音なら「ズィー」
どこにも「ゼット」なんて発音はない。
中学英語からやり直しだなw
0778名無しさん@お腹いっぱい。
2012/09/02(日) 15:38:49.680779名無しさん@お腹いっぱい。
2012/09/02(日) 16:01:49.22俺も z はズィーと習ったけどさ、
zsh をズィーシェルと読むヤツには会った事無い。
0780名無しさん@お腹いっぱい。
2012/09/02(日) 17:01:28.910781名無しさん@お腹いっぱい。
2012/09/02(日) 17:05:15.94鉄腕
0782名無しさん@お腹いっぱい。
2012/09/02(日) 17:34:15.94ググるとそっちばっかりヒットするよなw
0783名無しさん@お腹いっぱい。
2012/09/03(月) 00:53:44.84[zed-?el]が[?]に接続して、無声化して[zet-?el]
0784名無しさん@お腹いっぱい。
2012/09/03(月) 11:20:15.540785名無しさん@お腹いっぱい。
2012/09/03(月) 11:35:09.440786名無しさん@お腹いっぱい。
2012/09/05(水) 02:43:38.450787名無しさん@お腹いっぱい。
2012/09/05(水) 07:54:36.010788名無しさん@お腹いっぱい。
2012/09/07(金) 00:21:56.750789名無しさん@お腹いっぱい。
2012/09/08(土) 13:09:33.30ゼットシェル
日本人なんだからZの読み方にこだわる必要なし
0790名無しさん@お腹いっぱい。
2012/09/08(土) 15:23:53.340791名無しさん@お腹いっぱい。
2012/09/09(日) 11:41:33.370792名無しさん@お腹いっぱい。
2012/09/09(日) 13:14:38.930793名無しさん@お腹いっぱい。
2012/09/09(日) 13:22:46.94このマシンにbashを入れたいのですが、UNIX-OS用のbashバイナリが
入手できるところをご存知の方いらっしゃいましたら、入手先を教えて下さい。
ソースからコンパイルするのは、私があまりUNIX-OSに詳しくないので、あまり気が
進まないのですが、もしもコンパイルするしかないのでしたら、ソース入手先を
教えて頂けないでしょうか。
また、コンパイルしか手段が無いとしたら、UNIX-OSでは、bashのバージョンいくつまで
対応可能でしょうか。
0794名無しさん@お腹いっぱい。
2012/09/09(日) 13:35:34.280795名無しさん@お腹いっぱい。
2012/09/09(日) 14:25:33.64ケーブル買ってやっと居間のテレビにつないだんですけど、
電源を入れるとオペラシステム、ナンバーTが見つかった、
みたいなシェル画面が出て先に進みません。2台ともそうです。
この後どういうシェルコマンドを打てばいいのでしょうか?
0796名無しさん@お腹いっぱい。
2012/09/09(日) 17:39:59.21http://www.shell.co.jp/
0797名無しさん@お腹いっぱい。
2012/09/09(日) 18:20:22.560798名無しさん@お腹いっぱい。
2012/09/09(日) 18:42:25.390799名無しさん@お腹いっぱい。
2012/09/11(火) 12:23:14.320800名無しさん@お腹いっぱい。
2012/09/13(木) 01:14:45.24あるファイルをmakeするのが面倒なので自動化させたいです。
させたい処理はcd変更→makeの2点だけです。
ですが、うまくいきません。(シェルが一瞬立ち上がってそのまま終了します)
シェルにどういう引数を与えて起動させればいいでしょうか。
0801名無しさん@お腹いっぱい。
2012/09/13(木) 01:23:56.910802名無しさん@お腹いっぱい。
2012/09/13(木) 01:31:25.80どういうことでしょうか?
bash make -C directoryでしょうか?
えーと、makeは-fオプションで行いたいので、bash make -f directoryですか?
0803名無しさん@お腹いっぱい。
2012/09/13(木) 01:35:05.89あ、いや、つまり-Cでcd変更を兼ねるわけですね。理解しました
それで、その前にシェルを起動させなければいけないのですが、シェル起動→make -C directoryまでを
一連の動作として行うにはどうすればいいでしょう亜k?
0804名無しさん@お腹いっぱい。
2012/09/13(木) 02:03:13.41シェル起動とかいう独自用語使ってるとアドバイス来ないよ。
「何をしたら何が起きてほしい」と「目的」が重要。
0805名無しさん@お腹いっぱい。
2012/09/13(木) 02:32:36.620806名無しさん@お腹いっぱい。
2012/09/13(木) 02:35:29.220807名無しさん@お腹いっぱい。
2012/09/13(木) 02:40:38.930808名無しさん@お腹いっぱい。
2012/09/13(木) 06:26:57.770809名無しさん@お腹いっぱい。
2012/09/13(木) 06:38:48.750810名無しさん@お腹いっぱい。
2012/09/13(木) 07:40:19.710811名無しさん@お腹いっぱい。
2012/09/13(木) 07:52:00.730812名無しさん@お腹いっぱい。
2012/09/13(木) 08:36:35.52端末エミュレータ起動のことだろうとエスパー。
あるいはcygwin環境なのかも試練。
が、そういう低レベルの質問はお断りなので、
次の方どうぞ
↓
0813名無しさん@お腹いっぱい。
2012/09/13(木) 08:40:27.04デスクトップと端末エミュレータとshとbashとシェルスクリプトとオプション引数とmakeとmakefileとcdとカレントディレクトリと手段と目的がごっちゃになってる。
整理して出直せ。
0814名無しさん@お腹いっぱい。
2012/09/13(木) 10:11:28.58xtermでFreeBSDのコマンドが実行できません。FreeBSDは対応してないんでしょうか?
関係あるかどうかわかりませんが、ホストOSはLinuxです。
0815名無しさん@お腹いっぱい。
2012/09/13(木) 10:21:58.22次の方どうぞ
0816名無しさん@お腹いっぱい。
2012/09/13(木) 21:30:04.47FreeBSDもLinuxもUNIXじゃありません。
0817名無しさん@お腹いっぱい。
2012/09/13(木) 21:34:21.69この板にfreeBSDスレ立ってますがイタチと言われません
→freeBSDはUNIX
UNIX系OS用ソフトの大半はLinuxで動きますしディレクトリ構造が同じです
→LinuxはUNIXライク
0818名無しさん@お腹いっぱい。
2012/09/13(木) 21:51:52.27freeBSDなんていうあなたが発明したシステムが
UNIXかどうかは、ほかの人にはわかりません。
0819名無しさん@お腹いっぱい。
2012/09/13(木) 22:11:31.870820名無しさん@お腹いっぱい。
2012/09/13(木) 22:18:29.90でも飲んだか飲んでないか、すぐ忘れちゃうんです。
0821名無しさん@お腹いっぱい。
2012/09/13(木) 23:02:26.980822名無しさん@お腹いっぱい。
2012/09/13(木) 23:28:44.84っつーかある意味、マジな話、一日一度、cronやatを使えず、どうしても手動で
動かさなければならない手順を、結構いつも忘れてしまう…
0823名無しさん@お腹いっぱい。
2012/09/13(木) 23:29:59.390824名無しさん@お腹いっぱい。
2012/09/13(木) 23:40:27.06USBメモリにコピって、テストマシンにアップロードして、集計して、そんで最終的に
得られたデータを所定のExcelのシートに記入して、その結果出てきた情報を
ログに書き込んでスクリプトを実行する、みたいな作業だ
昔は派遣の人にお願いしてたんだが、コストカットで人が減っちまった
自動化できるんならしたいわマジ
0825名無しさん@お腹いっぱい。
2012/09/13(木) 23:41:01.52むしろ、sleep 86400 を条件にすりゃいんじゃねとかの、誘い水かね?
0826名無しさん@お腹いっぱい。
2012/09/13(木) 23:44:38.84それだとkillall sleepされたときに一緒に終了されちゃうじゃん。
0827名無しさん@お腹いっぱい。
2012/09/13(木) 23:48:41.090828名無しさん@お腹いっぱい。
2012/09/13(木) 23:53:12.25while sleep 86400; do ./hoge; done
だと、最初の実行まで24時間待たされる。
敢えてsleepを条件に入れたいなら、
while ./hoge; sleep 86400; do :; done
だな。
でもこれだと結局 :コマンドが要るから、素直に
while :; do sleep 86400; ./hoge; done
かな。
0829名無しさん@お腹いっぱい。
2012/09/13(木) 23:55:28.620830名無しさん@お腹いっぱい。
2012/09/14(金) 10:42:32.570831名無しさん@お腹いっぱい。
2012/09/14(金) 11:03:37.390832名無しさん@お腹いっぱい。
2012/09/14(金) 11:04:58.510833名無しさん@お腹いっぱい。
2012/09/14(金) 12:35:38.76っていうか、なんで出来ないの?
Excelのシートに記入するところは苦戦しそうだけど。
0834名無しさん@お腹いっぱい。
2012/09/14(金) 16:45:58.07寧ろUSBメモリ移動が鬼門。
0835名無しさん@お腹いっぱい。
2012/09/15(土) 13:19:37.17egrep "\t" *.txt
だと、tを検索してしまいます。
0836名無しさん@お腹いっぱい。
2012/09/15(土) 13:22:50.87こっちもやり方がよくわかりません。
ついでに教えてください。
0837名無しさん@お腹いっぱい。
2012/09/15(土) 13:32:23.770838名無しさん@お腹いっぱい。
2012/09/15(土) 13:38:45.62対話環境での話ならCTRL-Vあたりがクォート機能に割り当てられている
シェルなら
$ grep '[CTRL-V][TAB]' *.txt
スクリプトの中ならエディタでTABコード書けるだろ。
0839名無しさん@お腹いっぱい。
2012/09/15(土) 13:44:39.15(じゃあMakefileは? というのは無しで)
0840名無しさん@お腹いっぱい。
2012/09/15(土) 15:06:46.92http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbAS
grep $'\t' *.txt
0841名無しさん@お腹いっぱい。
2012/09/15(土) 21:55:57.05grepでというのには反則だけど
perl -ne 'print if /\t/'
0842名無しさん@お腹いっぱい。
2012/09/15(土) 21:59:20.76grep -P なら許す
0843名無しさん@お腹いっぱい。
2012/09/15(土) 23:49:50.180844名無しさん@お腹いっぱい。
2012/09/16(日) 09:58:27.49rsync以外で効率のいいやり方を教えて下さい。
diff -rqやfind | sort | diffでは遅すぎるのでもっといいやり方は無いでしょうか。
0845名無しさん@お腹いっぱい。
2012/09/16(日) 10:10:52.16diff <(ls -aR /dir1) <(ls -aR /dir2)
0846名無しさん@お腹いっぱい。
2012/09/16(日) 10:21:29.26ありがとうございます。確かに速いですね。
ただ、lsの出力がファイル名だけなので、diffからファイルのパスが分からないのが困ります。
他にdir1にあってdir2に無いファイルを相対/絶対パスで取得できる方法はありませんか?
情報後出しで済みません。
0847名無しさん@お腹いっぱい。
2012/09/16(日) 10:26:29.46勝手に遅いと思い込んでいました。とりあえずこの方法でやってみます。
回答して下さった方どうもすみませんでした。
0848名無しさん@お腹いっぱい。
2012/09/16(日) 10:56:10.15diff -u <(cd old/ && find . | sort) <(cd new/ && find . | sort) | grep '^\+./'
rsync -naiO --ignore-existing new/ old/ | awk '{print $2}'
diff -rq old/ new/
で、上から順に速いことが分かりました。御参考まで。
0849名無しさん@お腹いっぱい。
2012/09/16(日) 12:14:22.36どちらかのみ含まれるファイルを取り出すのに diff -u して grep ^+ してるけど
commを使うといいかもしれない
0850名無しさん@お腹いっぱい。
2012/09/16(日) 12:24:49.73みなさん、ありがとうございました!
うちにきて弟をファックしてもいいですよ。
0851名無しさん@お腹いっぱい。
2012/09/16(日) 14:49:42.09ありがとうございます。
comm -13 <(cd old/ && find . | sort) <(cd new/ && find . | sort)
と書き換えてスッキリしました。
dircmpのほうは古いUNIXにあったコマンドみたいですね。
自分はLinuxなので使えませんでしたが、参考になりました。
0852名無しさん@お腹いっぱい。
2012/09/16(日) 14:54:15.88結局diffでファイルの中身比較するから遅いよ。
(ファイルの中身は比較しないで欲しいという目的なら)
0853名無しさん@お腹いっぱい。
2012/09/16(日) 18:27:09.74http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/dircmp/dircmp.sh
-dオプションをつければdiffを呼ぶ
そうでない場合でも、ファイルサイズが同じ場合には cmp を呼ぶみたいですね
なるほど、同じファイル名でも違うファイルかどうかを判定する必要があるのかdircmpは
0854名無しさん@お腹いっぱい。
2012/09/18(火) 14:23:13.01例えば echo "test" という 1 行だけのシェルスクリプトを作成して、foo.sh という名前で
保存します。このファイルのパーミッションを 744 にしてコマンドラインで ./foo.sh と叩くと
正常に実行できてしまいました。
シェバング行が無いのに、何故実行できてしまうのでしょう? おそらく基本的なところで
私の理解が不足しているのだと思いますので「ここを読め!」等のポインタで結構ですので、
どなたかご教示いただけないでしょうか。
ちなみに FreeBSD、AIX、CentOS で試してみましたが、いずれも同じ結果でした。
0855名無しさん@お腹いっぱい。
2012/09/18(火) 14:29:46.54ちゃんと調べてないけど。
0856名無しさん@お腹いっぱい。
2012/09/18(火) 14:30:51.050857名無しさん@お腹いっぱい。
2012/09/18(火) 14:31:10.83昔のUNIXではシェバング行なんてなかった。
テキストファイルであっても chmod +xされていればexec()される。
まずはバイナリと仮定してカーネルのexec()を呼び出す。
するとフォーマットが合わないのでエラーで返ってくる。
このあと、コマンドラインのシェルの判断で、
「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
これでシェルスクリプトとして実行される。
シェバング行がある場合は最初からその行に書かれたシェルのスクリプトとして
カーネル側のexec()で直接実行される。
0858名無しさん@お腹いっぱい。
2012/09/18(火) 15:12:12.83最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、
X権限をすることによってソフトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようなおすすめのシェルって何ですか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
0859名無しさん@お腹いっぱい。
2012/09/18(火) 15:15:18.02http://toro.2ch.net/test/read.cgi/unix/1000022300/775
0860名無しさん@お腹いっぱい。
2012/09/18(火) 15:19:10.12とりあえず /home以下をnoexecでmountしちゃえば?
0861名無しさん@お腹いっぱい。
2012/09/18(火) 15:27:38.120862名無しさん@お腹いっぱい。
2012/09/18(火) 15:52:29.12> するとフォーマットが合わないのでエラーで返ってくる。
これは先頭の2byteを見ていたのね。
そこから#!を使うことになった。comment(#) + execute(!)
昔の実行形式の先頭2byteがどういう値だったかは、
/usr/share/file/magic/pdpを見るといい。
古典的なUNIXでは/etc/magicにある。
典型的なテキストファイルでは使わないシーケンスになってる。
0863854
2012/09/18(火) 16:18:19.96>>857
> このあと、コマンドラインのシェルの判断で、
> 「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
ありがとうございます。この部分以外は自分の理解とおおむね一致していました。
自分の理解度を再確認できて良かったです。
ただ、「シェルの判断で〜」の部分ってシェルのマニュアルにはちゃんと書かれて
いるのか、それとも「昔からそういうもんだ。ソース読め」のどちらなんでしょう?
手元では tcsh / ksh / bash で同じ挙動だったので「昔からそういうもんだ」
なのかな、という予感です。
0864名無しさん@お腹いっぱい。
2012/09/18(火) 16:23:15.64択一じゃないと思う。
0865名無しさん@お腹いっぱい。
2012/09/18(火) 16:34:37.60bash移行のことじゃないか? それまではexecve(2)におまかせだったはず。
0866名無しさん@お腹いっぱい。
2012/09/18(火) 16:50:35.22GNU bash 4.2.37ではまだexecveしてENOEXECが返されるのを確認してから
そのスクリプトを読み直して処理してるみたい。
0867名無しさん@お腹いっぱい。
2012/09/18(火) 21:16:25.81ログインシェルで解釈されたような気がする。
0868名無しさん@お腹いっぱい。
2012/09/19(水) 11:56:29.71Hello,world!
って書いてもcatが起動しないんだけど、なんで?
0869名無しさん@お腹いっぱい。
2012/09/19(水) 11:59:22.550870名無しさん@お腹いっぱい。
2012/09/19(水) 12:06:17.940871名無しさん@お腹いっぱい。
2012/09/19(水) 12:07:42.490872名無しさん@お腹いっぱい。
2012/09/19(水) 13:51:27.020873名無しさん@お腹いっぱい。
2012/09/19(水) 20:18:30.82みたいなとき、./hogeのエラーを検知してリトライしたいんだけど
どうしたらいいかな
0874名無しさん@お腹いっぱい。
2012/09/19(水) 20:40:36.49A=`while ! ./hoge; do :; done | cat`
ってかんじかなぁ
0875名無しさん@お腹いっぱい。
2012/09/19(水) 20:54:25.77そっかその中でループしちゃえばいいのか
0876名無しさん@お腹いっぱい。
2012/09/22(土) 17:58:27.45望ましいシェルスクリプトの実行方法は実行権付与後に当ファイルを呼び出す方式か、 shコマンドで引数にファイルパスを指定する方法か、 .コマンドで同様にパス指定する方法か、どれになりますでしょうかね
実行時の状況次第で選ぶものだとは思いますが。。
0877名無しさん@お腹いっぱい。
2012/09/23(日) 05:23:02.47明らかに3つとも意図するところは違うだろ。
0878名無しさん@お腹いっぱい。
2012/09/23(日) 23:34:02.910879名無しさん@お腹いっぱい。
2012/09/24(月) 03:46:37.390880名無しさん@お腹いっぱい。
2012/09/24(月) 10:04:32.630881名無しさん@お腹いっぱい。
2012/09/24(月) 10:59:38.290882名無しさん@お腹いっぱい。
2012/09/24(月) 11:08:32.60(2) sh hoge.sh
(3) . hoge.sh
をどう使い分けるか。
0883名無しさん@お腹いっぱい。
2012/09/24(月) 11:08:44.90三種類実行方法がありますが、それぞれどんな特徴ですか?
それはさておき、文法を完全に把握してる人がいないんですね。wikipediaに書いてありました。
0884名無しさん@お腹いっぱい。
2012/09/24(月) 11:19:08.75(1)と(2)はそれほど明確に使い分けてないかもね
パーミッションが立ってることが保証できて、
普通のコマンドと区別する理由がなければ(1)
0885名無しさん@お腹いっぱい。
2012/09/24(月) 11:23:20.30ただ #! とかモードとかちゃんと設定しなければならない。
その辺がめんどうなら (2) で。
(3) は (1)(2) とは動きが違う。
0886名無しさん@お腹いっぱい。
2012/09/24(月) 11:33:50.71(3)が違うというのはなにが違うというのか
0887名無しさん@お腹いっぱい。
2012/09/24(月) 11:35:36.73子プロセスで実行するか現在のプロセスで実行するか。
0888名無しさん@お腹いっぱい。
2012/09/24(月) 11:36:18.770889名無しさん@お腹いっぱい。
2012/09/24(月) 11:36:48.660890名無しさん@お腹いっぱい。
2012/09/24(月) 11:37:32.270891名無しさん@お腹いっぱい。
2012/09/24(月) 12:11:39.880892名無しさん@お腹いっぱい。
2012/09/24(月) 12:42:24.30bash開発時にsh互換にするのに文法で苦労したんだって。
その時の語録みたいよ。
0893892
2012/09/24(月) 12:59:18.55みんな使っている機能なのに。
だから「本当は誰もshの文法がどうなっているのか知らないんだよ。
ソースコードなんて読んだってほとんど役立たねえよ」ってことらしい。
0894名無しさん@お腹いっぱい。
2012/09/24(月) 14:30:47.04伝聞じゃなくてソース出せ
0895名無しさん@お腹いっぱい。
2012/09/24(月) 14:45:31.61コメントってこれのこと?
0896名無しさん@お腹いっぱい。
2012/09/24(月) 14:46:52.91yaccうんぬんはこれか。
0897名無しさん@お腹いっぱい。
2012/09/24(月) 15:59:04.260898名無しさん@お腹いっぱい。
2012/09/24(月) 16:08:48.36コメントの出典。
0899名無しさん@お腹いっぱい。
2012/09/24(月) 16:26:39.69We are Japanese!
0900名無しさん@お腹いっぱい。
2012/09/24(月) 16:54:24.620901名無しさん@お腹いっぱい。
2012/09/24(月) 16:56:23.03>>892は>>896を読んだんだろう。
0902名無しさん@お腹いっぱい。
2012/09/24(月) 17:31:58.970903名無しさん@お腹いっぱい。
2012/09/24(月) 18:05:51.197th Edition なら「|」でいいっぽい。
http://plan9.bell-labs.com/7thEdMan/v7vol2a.pdf
0904名無しさん@お腹いっぱい。
2012/09/24(月) 18:31:49.56んっと、実質いけるかじゃなくて、ドキュメント上の話ね
0905名無しさん@お腹いっぱい。
2012/09/24(月) 18:36:10.23>>903
は、1979のドキュメントか。who|sortがちゃんと例に上がってるね。
who|wcが認められていないっていう出典は何だ?
0906名無しさん@お腹いっぱい。
2012/09/24(月) 19:15:26.74http://tiswww.case.edu/php/chet/bash/article.pdf
出典はこれ。>>903に含まれてるのと同じっぽい。
http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1971.pdf
でもなんでダメなのかはよくわからん。
0907名無しさん@お腹いっぱい。
2012/09/24(月) 20:02:57.99Chet Rameyの出典ミスのような気がする。
とりあえず、open problemは、初出のTom Duffのrc文献で
> It is remarkable that in the four most recent editions of the UNIX
> system programmer's manual the Bourne shell grammar described in the
> manual page does not admit the command who|wc.
の根拠がわからない点かな。
なのにあちこち引用されてるという……
0908名無しさん@お腹いっぱい。
2012/09/26(水) 20:55:09.390909名無しさん@お腹いっぱい。
2012/09/26(水) 20:58:49.31/⊇∧〈( ゚д゚)
`〈( ゚д゚)ヽ ⊂ニ)
ヽ_と/ ̄ ̄ ̄/ |
 ̄\/___/ ̄ ̄
0910名無しさん@お腹いっぱい。
2012/09/27(木) 13:34:15.65オナニーするんだろ?
本当にキモいよな。
0911名無しさん@お腹いっぱい。
2012/09/27(木) 15:53:41.990912名無しさん@お腹いっぱい。
2012/09/27(木) 16:49:20.71http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%83%BC%E3%83%88
0913名無しさん@お腹いっぱい。
2012/09/27(木) 22:53:41.050914名無しさん@お腹いっぱい。
2012/09/27(木) 23:37:10.23http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%AC%E3%82%B9
0915名無しさん@お腹いっぱい。
2012/10/03(水) 23:49:51.10以下の@のようにコマンドを変数に代入して、実行したいのですが、どうすればよいですか。
多分、バックスラッシュが正しく認識されていない。。
@コマンドを変数に代入した場合はNG
cmd="find /tmp/ -name \*.tsv"
for f in `${cmd}`; do
echo ${f}
done
Aベタ書きするとOK
for f in `find /tmp/ -name \*.tsv`; do
echo ${f}
done
0916名無しさん@お腹いっぱい。
2012/10/03(水) 23:54:39.82echo $f
done
0917名無しさん@お腹いっぱい。
2012/10/04(木) 08:26:24.94cmdに ' ' で代入すること " " だとバックスラッシュが解釈される。
0918名無しさん@お腹いっぱい。
2012/10/08(月) 21:27:19.47で2行目にproto=WPAを挿入したしてますが、
タブ+proto=WPAを挿入するには、どうしたら出来ますか?
0919名無しさん@お腹いっぱい。
2012/10/08(月) 21:38:16.14sed -e '1a\\tporto=WPA' wpa_supplicant.conf
0920918
2012/10/08(月) 22:10:14.93あ、そうか
ありがとうございます。
0921名無しさん@お腹いっぱい。
2012/10/09(火) 09:23:06.070922名無しさん@お腹いっぱい。
2012/10/09(火) 09:57:32.690923名無しさん@お腹いっぱい。
2012/10/09(火) 10:01:49.880924名無しさん@お腹いっぱい。
2012/10/09(火) 10:22:48.32#!/bin/sh
ls () :
ls
0925名無しさん@お腹いっぱい。
2012/10/09(火) 10:28:51.78↓この人と一緒に考えるといい。
http://toro.2ch.net/test/read.cgi/tech/1348995216/574
0926名無しさん@お腹いっぱい。
2012/10/10(水) 11:22:49.71どうしたらよいでしょうか
0927名無しさん@お腹いっぱい。
2012/10/10(水) 11:26:04.610928名無しさん@お腹いっぱい。
2012/10/10(水) 11:28:20.39grep '[-]--Hoge'
0929名無しさん@お腹いっぱい。
2012/10/10(水) 11:30:08.660930名無しさん@お腹いっぱい。
2012/10/10(水) 15:19:10.02ありがとうございました
0931名無しさん@お腹いっぱい。
2012/10/12(金) 19:22:12.36at コマンドで、日付を指定することはできませんか?
4日後の午前8時に実行したいのです。
at コマンドじゃなくてもかまいません。
FreeBSD 4.7 です。
よろしくお願いします。
0932名無しさん@お腹いっぱい。
2012/10/12(金) 19:35:22.650933名無しさん@お腹いっぱい。
2012/10/12(金) 19:39:11.88ありがとうございました。
8am + 4 days
で、いいんですね?
0934名無しさん@お腹いっぱい。
2012/10/12(金) 20:09:51.12日付は+1しないとダメだよ
0935名無しさん@お腹いっぱい。
2012/10/23(火) 23:44:42.550936名無しさん@お腹いっぱい。
2012/10/30(火) 14:47:21.49あるMakefileの中に
変数:=XXXXX
変数+=XXXXX
の記述があるんですが、これってどう言う意味でしょうか
0937名無しさん@お腹いっぱい。
2012/10/30(火) 14:57:50.73http://toro.2ch.net/test/read.cgi/unix/1079538957/
0938936
2012/10/30(火) 16:07:27.79だって、あちらは誰もいないみたいなんで
0939名無しさん@お腹いっぱい。
2012/10/30(火) 19:36:36.280940名無しさん@お腹いっぱい。
2012/11/03(土) 22:03:05.390941名無しさん@お腹いっぱい。
2012/11/03(土) 22:57:10.700942名無しさん@お腹いっぱい。
2012/11/04(日) 10:42:30.42chroot /hoge export PS1="\u@\h \w->
プロンプト変更.shを作って
chroot /hoge /hoge/プロンプト変更.sh
としても、そのようなファイルやディレクトリはないと怒られます。
何故でしょうか?
0943名無しさん@お腹いっぱい。
2012/11/04(日) 11:08:51.12/hoge/プロンプト変更.sh は /hoge に chroot した後は /プロンプト変更.sh だろ。
0944名無しさん@お腹いっぱい。
2012/11/04(日) 14:02:09.170945942
2012/11/04(日) 16:21:56.21プロンプト変更.shの中にエラーがありました
>942
どちらも試しておりましたが、スクリプトのエラーで分からなくなっていました。
おっしゃる通りですね
>944
こちらも試しては見ていたんですが
chroot ./hoge /bin/bash; /プロンプト変更.sh でしょうか
ただ、これもサブシェル内での変更になるのでしょうか、思うようにはなりませんでした。
chroot ./hoge /bin/bash; export PS1="->"
でもダメなので、bashrcを書き換えないとダメでしょうか?
0946名無しさん@お腹いっぱい。
2012/11/04(日) 17:02:21.41. プロンプト変更.sh
source プロンプト変更.sh
じゃねーのか
0947名無しさん@お腹いっぱい。
2012/11/04(日) 17:19:49.940948名無しさん@お腹いっぱい。
2012/11/04(日) 21:39:42.260949名無しさん@お腹いっぱい。
2012/11/05(月) 01:35:08.600950名無しさん@お腹いっぱい。
2012/11/05(月) 09:36:46.07面倒だから正解教えてあげるけど、キミ、全然理解していない。
次に来るときはシェルの入門書を1000回読み返してからくるように。
chroot ./hoge /bin/bash --rcfile /プロンプト変更.sh
0951名無しさん@お腹いっぱい。
2012/11/05(月) 11:07:47.92そのディレクトリにcdが可能かどうかチェックはしたいけど
カレントディレクトリを変更したいわけじゃない、という場合に使う。
0952名無しさん@お腹いっぱい。
2012/11/05(月) 11:10:09.44それは (cd hoge) で十分。わざわざ/usr/bin/cd hogeとかする必要なし。
0953名無しさん@お腹いっぱい。
2012/11/05(月) 11:51:33.940954名無しさん@お腹いっぱい。
2012/11/05(月) 11:54:39.66alias bg fg jobs unalias wait
もちろん、「文法チェック目的」以外で。
0955名無しさん@お腹いっぱい。
2012/11/05(月) 11:56:21.15/usr/bin/cd を使っちゃいけない理由:
/usr/bin/cdがインストールされていない環境で動かないのでポータビリティを損ねる。
0956名無しさん@お腹いっぱい。
2012/11/05(月) 11:58:35.93インストールされている環境でしか使わないスクリプトなら問題ない。
0957名無しさん@お腹いっぱい。
2012/11/05(月) 12:18:17.16POSIX Shell & Utilitiesに適合するため。
0958名無しさん@お腹いっぱい。
2012/11/05(月) 12:26:50.85POSIX Shell & Utilitiesに適合することは意味のある用途じゃないので不正解。
はい、やり直し
↓
0959名無しさん@お腹いっぱい。
2012/11/05(月) 12:32:15.460960名無しさん@お腹いっぱい。
2012/11/05(月) 12:32:57.29うちの環境だと無いっぽいわ
0961名無しさん@お腹いっぱい。
2012/11/05(月) 12:37:40.88/usr/bin/cd だったら、「cd可能かどうかチェックする」という具体用途が一応示せる。
(苦し紛れだろうけど)
そういう具体例を聞いてるんだよ。
たとえば /usr/bin/fg って何に使うの?
プロセス変わるからジョブコンできるはずないし。
0962名無しさん@お腹いっぱい。
2012/11/05(月) 12:44:25.01どこにあるんだいったい・・・
0963名無しさん@お腹いっぱい。
2012/11/05(月) 13:29:24.71http://docs.oracle.com/cd/E26924_01/html/E29112/cd-1.html
これにも>>951しか用途載ってないな。
0964名無しさん@お腹いっぱい。
2012/11/05(月) 14:25:29.24>>957の通り。規格読んでみ。
builtinもexec出来ないといけないから。
0965名無しさん@お腹いっぱい。
2012/11/05(月) 14:27:27.340966名無しさん@お腹いっぱい。
2012/11/05(月) 14:50:01.96builtinもexec出来ないといけないからという理由なら、
trapとかsetとかのbuiltinもexec出来ないといけないことになる。
(実際にはtrapとかsetとかは外部コマンド版はない)
なぜ cdとかaliasとかは意味のない外部コマンド版があって、
trapとかsetとかには外部コマンド版がないのか、という疑問は解決しない。
0967名無しさん@お腹いっぱい。
2012/11/05(月) 20:50:10.49ここで意味がないとか言っても何も解決しない。
0968名無しさん@お腹いっぱい。
2012/11/05(月) 20:52:30.500969名無しさん@お腹いっぱい。
2012/11/05(月) 21:44:16.98「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
って決めちゃって、そんなの意味ないって下から指摘あったけど
決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
だから、実用性優先のLinuxとかではそんな変な仕様には準拠せず、
/usr/bin/cdとかアホなコマンドはインストールしないようになってる。
0970名無しさん@お腹いっぱい。
2012/11/05(月) 22:01:57.65> シェルやシェルスクリプトをよく知らない人が
> 「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
> って決めちゃって、そんなの意味ないって下から指摘あったけど
> 決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
それはどこ情報?
0971名無しさん@お腹いっぱい。
2012/11/13(火) 10:00:15.55で、SOME_DIR 内に一つ見つかったら一回 SOME_COMMAND して、それで終わり、
次のファイルはもう処理しない、という方法はありますか ?
-exit とかあったような気がして man 見直したら、見当たらない…
0972名無しさん@お腹いっぱい。
2012/11/13(火) 10:57:30.970973971
2012/11/13(火) 11:40:06.17しかし、なぜ man find に出てこないんだろう…
0974名無しさん@お腹いっぱい。
2012/11/13(火) 11:42:39.490975名無しさん@お腹いっぱい。
2012/11/13(火) 12:05:46.68OSは何?
0976名無しさん@お腹いっぱい。
2012/11/13(火) 12:18:32.270977名無しさん@お腹いっぱい。
2012/11/13(火) 12:22:31.28*The Regents of the University of California. All rights reserved.
と書いてあるfindにもあるけど。
0978名無しさん@お腹いっぱい。
2012/11/13(火) 12:34:55.40ハイ論破
0979名無しさん@お腹いっぱい。
2012/11/13(火) 12:38:30.29ハイポンパ
0980971
2012/11/13(火) 13:17:00.75-quit は、効くけど、/usr/bin/man find には出てこないという…
0981名無しさん@お腹いっぱい。
2012/11/13(火) 13:43:17.370982名無しさん@お腹いっぱい。
2012/11/13(火) 14:51:52.160983名無しさん@お腹いっぱい。
2012/11/13(火) 18:55:48.290984名無しさん@お腹いっぱい。
2012/11/13(火) 19:03:34.72日本語manに至っては、数年前から誤記が放置だ
0985名無しさん@お腹いっぱい。
2012/11/13(火) 19:12:08.46今後はアンサーブックを使えって聞いたよ。
もちろん閲覧はHotJavaを使うこと。
0986名無しさん@お腹いっぱい。
2012/11/13(火) 20:28:03.43お前も放置してる1人だろ。
0987名無しさん@お腹いっぱい。
2012/11/14(水) 10:18:00.47MacOSXもその状況をひきずっていそう
0988名無しさん@お腹いっぱい。
2012/11/14(水) 11:31:26.58にはあるよ。いつからあるかは知らない。
0989名無しさん@お腹いっぱい。
2012/11/14(水) 12:06:38.79コメントが
Document -quit, four and a half years after it was implemented.
だと。
0990名無しさん@お腹いっぱい。
2012/11/14(水) 14:08:21.73まーじーでーーー
0991名無しさん@お腹いっぱい。
2012/11/14(水) 20:51:36.07成り立つのだよね
0992名無しさん@お腹いっぱい。
2012/11/14(水) 21:39:15.28男らしくない。
BSD にはいらん。
軟弱な Linux でも使ってろ。
0993名無しさん@お腹いっぱい。
2012/11/15(木) 00:12:41.93ってか次スレ建てろよ>>980
0994名無しさん@お腹いっぱい。
2012/11/15(木) 16:34:11.28実物より古いバージョンのままなんて日常茶飯事。
0995名無しさん@お腹いっぱい。
2012/11/15(木) 18:59:46.37#!/bin/sh
/usr/bin/cc $argv[1].c -o $argv[1] -lm
0996名無しさん@お腹いっぱい。
2012/11/15(木) 19:28:10.211点。
ハイ次の方どうぞ
0997名無しさん@お腹いっぱい。
2012/11/15(木) 19:30:19.71(´・ω・`)
0998名無しさん@お腹いっぱい。
2012/11/15(木) 19:41:03.390999名無しさん@お腹いっぱい。
2012/11/15(木) 19:43:50.00/bin/shじゃねぇのか?
C,PHP,Perlとかならおkだろうけど
shなら$1ちゃうんかい?
1000名無しさん@お腹いっぱい。
2012/11/15(木) 19:45:03.49動いてはいるんだけども
cc:エラー:[1].c:そのようなファイルやディレクトリはありません
って怒られる...(´・ω・`)あるのに
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。