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

このエントリーをはてなブックマークに追加
1名無しさん@お腹いっぱい。
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合は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/
2名無しさん@お腹いっぱい。:2012/06/08(金) 01:03:54.93
太古の昔に
レイヤードシェル
もしくは
シェルレイヤー
という物が存在していたらしいのですが、
どんな物だったのでしょうか?
ジョブコントロールできるらしいのですが。
3名無しさん@お腹いっぱい。:2012/06/08(金) 02:06:15.15
おつ
4名無しさん@お腹いっぱい。:2012/06/08(金) 02:15:08.82
UNIXとかいう糞PCwwwwwww京とかいう存在しても価値ないただただ無意味に速度早くしただけのコンピューターとかもあるしww

何のための板だよここwww
5名無しさん@お腹いっぱい。:2012/06/08(金) 06:17:43.38
ようこそ、その糞みたいな板にワザワザご苦労様。
6名無しさん@お腹いっぱい。:2012/06/08(金) 06:33:16.03
Q. シェルは UNIX の勉強に使えますか?
A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
  UNIX の勉強には向いていません。
7名無しさん@お腹いっぱい。:2012/06/08(金) 07:20:45.00
>>6
頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw
8名無しさん@お腹いっぱい。:2012/06/08(金) 07:44:41.28
>>2
GNUScreenから画面管理を引いたようなもの。
9名無しさん@お腹いっぱい。:2012/06/08(金) 07:58:45.93
>>6
つまり座学で基礎理論を学んでから出直せってこと?
10名無しさん@お腹いっぱい。:2012/06/08(金) 09:38:32.41
>>2
衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。
11名無しさん@お腹いっぱい。:2012/06/08(金) 09:49:49.84
12名無しさん@お腹いっぱい。:2012/06/08(金) 09:55:28.15
>>8が端的に説明できてる。ただscreen知らないとわからない。
13名無しさん@お腹いっぱい。:2012/06/08(金) 16:51:20.05
シェルといえば、ガソスタだろ?または、>>10だな。常識。
... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。
14 忍法帖【Lv=40,xxxPT】 :2012/06/09(土) 13:44:28.09
grepで取り出した10行のうちの2行目を取り出したいのですが、
何か簡便な方法はありませんか?
15名無しさん@お腹いっぱい。:2012/06/09(土) 13:48:39.99
sed -n 2p
16名無しさん@お腹いっぱい。:2012/06/09(土) 13:48:53.77
>>14
素人は grep 〜 | head -n 2 | tail -n 1 なんてするところだろうな

Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる
17名無しさん@お腹いっぱい。:2012/06/09(土) 13:53:34.23
>>14
grep -A1
でいいじゃん。

一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。
18名無しさん@お腹いっぱい。:2012/06/09(土) 13:57:44.31
>>17
それは一致した行の次の行を取り出したい場合だろw 欲嫁
19名無しさん@お腹いっぱい。:2012/06/09(土) 14:01:37.89
なぜにfgetsじゃなくてfgetc?
20名無しさん@お腹いっぱい。:2012/06/09(土) 14:07:19.90
…などとデバッグしてるぐらいなら head -n 2 | tail -n 1 の方がずっと早いな。
まあ、ふつーはそれすらせずに>>15だが。
21名無しさん@お腹いっぱい。:2012/06/09(土) 14:18:33.49
「grepで引っかかる行が10行あります。これら10行それぞれの次の行(2行目)を
取り出したいのですが、何か簡便な方法はありませんか?」

という質問だったとしたら?
22名無しさん@お腹いっぱい。:2012/06/09(土) 14:18:49.34
効率的には grep -m2 〜 | tail -n1 とかの方がいいのかね
23名無しさん@お腹いっぱい。:2012/06/09(土) 17:31:36.34
>>16
あんまり釣れないね。
24名無しさん@お腹いっぱい。:2012/06/09(土) 21:38:41.95
質問がわかりにくくて済みません。実は >>21 さんの意味で質問しました。
何か簡便な方法がありましたらお願いします。
25名無しさん@お腹いっぱい。:2012/06/09(土) 21:46:40.88
>>24
次の行も欲しいってのなら>>17の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep 〜 | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ
2625:2012/06/09(土) 21:49:49.12
しまった >>25 は grep 必要なかった
27名無しさん@お腹いっぱい。:2012/06/10(日) 05:16:55.25
環境変数IFSってforとread以外に使い道あるのかしら
28名無しさん@お腹いっぱい。:2012/06/10(日) 14:21:25.03
コマンドを実行した複数行の結果を変数に格納した後、その各行に処理を行いたいのですが、
たとえば
hoge=`ls -l`
とやると、改行が格納されません。
改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?
29名無しさん@お腹いっぱい。:2012/06/10(日) 14:32:53.34
>>28
hoge=`ls -l` で改行は格納される。

echo $hoge ではなく、

echo "$hoge"
で変数の値を取り出すこと。
30名無しさん@お腹いっぱい。:2012/06/10(日) 14:43:07.38
早速の回答、誠にありがとうございまする
31名無しさん@お腹いっぱい。:2012/06/12(火) 18:12:34.43
ls -1 | nohup xargs -L1 -P20 -I@ sh -c "./a.out @ < @.txt > @.log 2> err.log" > progress.log &
このコマンドどこに問題がありますか?
最初の20行分しか処理されずに止まっちゃうんだけど・・・泣
32名無しさん@お腹いっぱい。:2012/06/12(火) 18:19:37.78
expectコマンドを使わずにシェルスクリプトでパスワードを自動入力させるにはどのようにすればよいでしょうか?

#!/bin/bash
ssh user@hostname
パスワードを入力するコマンド

上記のようなスクリプトが作りたいです。
どなたか教えて頂けないでしょうか。よろしくお願いします。
33名無しさん@お腹いっぱい。:2012/06/12(火) 18:34:26.09
>>32
echo unko | ssh user@hostname
34名無しさん@お腹いっぱい。:2012/06/12(火) 18:46:46.29
>>32
公開鍵認証じゃだめなん?
35名無しさん@お腹いっぱい。:2012/06/12(火) 18:49:57.90
>>33
それじゃだめじゃね。
36名無しさん@お腹いっぱい。:2012/06/12(火) 18:59:21.99
質問者ですが、
>>31
はスレチでした?
37名無しさん@お腹いっぱい。:2012/06/12(火) 19:06:40.96
>>33
試してみたのですが、パスワード入力を求められました。。

>>34
パスワード入力したいです。
38名無しさん@お腹いっぱい。:2012/06/12(火) 19:16:56.47
>>31
20行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。
39名無しさん@お腹いっぱい。:2012/06/12(火) 20:08:55.76
>>38
すみませんが詳しい方のみ回答をお願いします
40名無しさん@お腹いっぱい。:2012/06/12(火) 20:17:55.37
>>31
> progress.log じゃなくて
>> progress.log じゃないの?
41名無しさん@お腹いっぱい。:2012/06/12(火) 20:20:23.43
>>40
すみませんが詳しい方のみ回答をお願いします
42名無しさん@お腹いっぱい。:2012/06/12(火) 20:26:15.13
パイプ出力なのに ls -1 とかやるのは素人
43名無しさん@お腹いっぱい。:2012/06/12(火) 20:29:12.04
すみませんが詳しい方のみ質問をお願いしますw
44名無しさん@お腹いっぱい。:2012/06/12(火) 20:29:30.99
>>42
すみませんが詳しい方のみ回答をお願いします
45名無しさん@お腹いっぱい。:2012/06/12(火) 20:31:12.33
すみませんが詳しい方のご健闘をお祈りします
46名無しさん@お腹いっぱい。:2012/06/12(火) 20:33:43.17
>>42
findってこと?
結局どうすれば正解なの?
入力(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
って感じにしたいわけだけど。
47名無しさん@お腹いっぱい。:2012/06/12(火) 20:35:02.58
ちなみに39とかは質問者(31+46)じゃないから。
お願いだから邪魔しないで。
48名無しさん@お腹いっぱい。:2012/06/12(火) 20:44:15.91
出力はまああまり気にしてなくて、
むしろ
./a.out a
./a.out b
====ここで止まっちゃう
のが大問題。
49名無しさん@お腹いっぱい。:2012/06/12(火) 21:29:01.48
>>46
>>42
が言ってるのは出力が端末でないなら ls -1 しなくても ls でいいって話.

xargs -L1 -P2の挙動があくまで2プロセス同時にやるって話だから
./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
望みの挙動にするのは一行スクリプトだと割と面倒だから素直にmakeで依存関係書いてmake -j 20とかした方がいいかも

ちなみに俺の環境で >>31 を試してみたけどちゃんと20行以降も実行される.
可能性として気になったのはnohupの位置なんだけど
もしかして実行開始してから端末閉じたりしてる?
50名無しさん@お腹いっぱい。:2012/06/12(火) 22:31:56.89
>>49
丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。

> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?
51名無しさん@お腹いっぱい。:2012/06/12(火) 22:39:01.73
>>50
俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか

52名無しさん@お腹いっぱい。:2012/06/12(火) 23:12:10.37
>>51
めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。
53名無しさん@お腹いっぱい。:2012/06/13(水) 00:35:25.15
少なくともバッチ処理なんだから nohup とか使うんじゃなくて batch とか
at コマンド使うほうが素直な気がする。

もっともバッチ処理システム入れて管理すれば batch コマンド以上に
いろいろかゆいところに手が届いていいと思うが。
54名無しさん@お腹いっぱい。:2012/06/14(木) 14:17:28.57
echo *.csv | cat

だとファイル名が表示されるだけで、

echo *.csv | xargs cat

だとファイルの中身が表示されるのはなぜでしょうか?
xargsを付けなくてもファイルの中身が表示されると思ってました。。
55名無しさん@お腹いっぱい。:2012/06/14(木) 14:20:16.35
cat がそういう作りだから。
man cat 読め。
56名無しさん@お腹いっぱい。:2012/06/14(木) 14:23:59.09
>>54の挙動だと、

$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。
57名無しさん@お腹いっぱい。:2012/06/14(木) 14:28:27.78
cat *.csv

だとファイルの中身が表示されるのに、

echo *.csv | xargs cat

だとそのようなファイルやディレクトリはありませんになることがあります。

man cat 読んでもわかりません。
58名無しさん@お腹いっぱい。:2012/06/14(木) 14:30:22.51
>>56
cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?
59名無しさん@お腹いっぱい。:2012/06/14(木) 14:41:19.14
>>57
*.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。

>>58
そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。
60名無しさん@お腹いっぱい。:2012/06/14(木) 14:44:47.08
>>59
なるほど。ありがとうございます!

cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。
61名無しさん@お腹いっぱい。:2012/06/14(木) 14:49:06.50
>>59
>*.csv にマッチするファイルがないから

*.csv にマッチするファイルはあります。
62名無しさん@お腹いっぱい。:2012/06/14(木) 14:51:34.83
>>61
んじゃファイル名にスペースが入ってるとか。
63名無しさん@お腹いっぱい。:2012/06/14(木) 15:02:46.51
ファイル名にスペースは入ってません。
64名無しさん@お腹いっぱい。:2012/06/14(木) 15:12:33.68
>>63
んじゃ具体的にどういうファイルがあるの?
65名無しさん@お腹いっぱい。:2012/06/14(木) 15:21:51.24
年金記録-'06〜'10.csv
66名無しさん@お腹いっぱい。:2012/06/14(木) 15:27:40.76
' ' が解釈されちゃってるな。
67名無しさん@お腹いっぱい。:2012/06/14(木) 15:43:59.51
>>65
これは非道い。
オレには、ファイル名にクオテーションやダブルクオテーションを含める勇気はないわ
68名無しさん@お腹いっぱい。:2012/06/14(木) 18:24:41.60
>>65
んじゃこれは
*\'*\'*.csv
でいけるのかな?
69名無しさん@お腹いっぱい。:2012/06/14(木) 18:28:50.78
>>68
そんなことしても xargsの段階で解釈されるから無理だろ
70名無しさん@お腹いっぱい。:2012/06/14(木) 18:45:30.67
どうしてもecho使いたいって条件だとキツいね
Linuxのlsなら-Qオプション使えるから
ls -Q *.csv | xargs cat
するかfind の -print0 と xargs の -0 組み合わせるぐらいだろうか。
まあfind使うならxargsじゃなくて-exec使えって話なんだろうが。
71名無しさん@お腹いっぱい。:2012/06/14(木) 18:51:16.77
あとは普通にfor文使うとか
ファイル名に空白がある場合は使えないけど
$ echo -n *.csv | xargs -d ' ' cat
という説もある
72名無しさん@お腹いっぱい。:2012/06/15(金) 07:48:47.63
すんません、ディレクトリツリー内で作成日時が最古のファイルを取得できるコマンドを教えてくださいませんか
73名無しさん@お腹いっぱい。:2012/06/15(金) 08:16:08.73
>>72
一般的な方法はない。
74名無しさん@お腹いっぱい。:2012/06/15(金) 08:23:01.23
>>73
すみませんが詳しい方のみ回答をお願いします
75名無しさん@お腹いっぱい。:2012/06/15(金) 08:28:15.12
>>72
lsで日付順で取得してheadまたはtailじゃオーバーヘッド大きすぎ?
うちはめんどくさいからそれで済ませてるんだが
76名無しさん@お腹いっぱい。:2012/06/15(金) 08:33:32.64
>>75
ディレクトリ「ツリー」だから、そもそもlsで日付順で取得できないだろw
77名無しさん@お腹いっぱい。:2012/06/15(金) 08:44:08.87
>>75
それ作成日時じゃないよ。
78名無しさん@お腹いっぱい。:2012/06/15(金) 08:48:48.06
あんまり巨大なツリーじゃなければ、zsh あたりで
ls -dtr **/* | head -1
とかか。

お題としては、ls -D か stat あたり使って、
巨大なツリーで日付ソートしろっていう方が楽しいけど。

ただし、「作成日時」には目をつぶる。
79名無しさん@お腹いっぱい。:2012/06/15(金) 08:52:37.74
そこ目をつぶっちゃだめだろw
80名無しさん@お腹いっぱい。:2012/06/15(金) 08:55:56.64
lsって最終変更日時とか状態変更日時とかアクセス日時は取れるのに、作成日時だけ取れないのな。
知らんかった。すまん。
81名無しさん@お腹いっぱい。:2012/06/15(金) 09:03:13.70
取れるかどうかの問題じゃなくて、その情報があるかどうかだ
82名無しさん@お腹いっぱい。:2012/06/15(金) 09:10:31.17
>>72
find /dir -printf '%T+ %p\n' | sort | head -1
83名無しさん@お腹いっぱい。:2012/06/15(金) 09:35:24.92
>>82
それ作成日時じゃないよ。
84名無しさん@お腹いっぱい。:2012/06/15(金) 09:40:26.32
>>83
そういうのはいいです。エスパーなら最終更新日時と詠み換えるべき。
85名無しさん@お腹いっぱい。:2012/06/15(金) 09:42:24.84
エスパーじゃないもの。
書いてあることしか読み取れんよ。
86名無しさん@お腹いっぱい。:2012/06/15(金) 10:07:26.75
>>72は聞いたっきり現れないな。
こりゃ釣られたか。
87名無しさん@お腹いっぱい。:2012/06/15(金) 10:13:35.22
ツリーだけに…
88名無しさん@お腹いっぱい。:2012/06/15(金) 10:44:32.41
ぷぷ
89名無しさん@お腹いっぱい。:2012/06/15(金) 20:59:46.79
作成時刻を保持してるUNIX系OSってあるの?
90名無しさん@お腹いっぱい。:2012/06/15(金) 21:05:44.38
UFS2にbirthtimeってのがあるらしい。
91名無しさん@お腹いっぱい。:2012/06/15(金) 21:10:03.64
Linuxのext4にもbirth timeあるね
92名無しさん@お腹いっぱい。:2012/06/16(土) 09:05:43.92
>>82
GNU依存乙
93名無しさん@お腹いっぱい。:2012/06/17(日) 08:29:54.78
GNU dateが無いともう生きていけません
完全に陥落しました
94名無しさん@お腹いっぱい。:2012/06/17(日) 14:58:07.56
>>93
どんな時に便利っすか
95名無しさん@お腹いっぱい。:2012/06/17(日) 15:13:21.09
前日の日付を取得するときとか。
96名無しさん@お腹いっぱい。:2012/06/17(日) 17:40:13.73
それは定番の手法があるだろう。
97名無しさん@お腹いっぱい。:2012/06/17(日) 17:51:43.63
GNU date使うと楽すぎて。
98名無しさん@お腹いっぱい。:2012/06/17(日) 17:52:22.83
あと変数でn日前とかも楽。
99名無しさん@お腹いっぱい。:2012/06/18(月) 09:39:45.83
こんな感じっすか。

env TZ=JST+15 date
n=5
date -v -${n}d
100名無しさん@お腹いっぱい。:2012/06/18(月) 12:19:00.38
n=20
101 忍法帖【Lv=40,xxxPT】 :2012/06/18(月) 14:36:30.11
タイムゾーンを取得する方法を教えな
102名無しさん@お腹いっぱい。:2012/06/19(火) 00:23:33.59
ターイムゾーンと叫べ!
103名無しさん@お腹いっぱい。:2012/06/19(火) 01:23:21.92
>>99
世界にはタイムゾーンがいくつもある、という事をよく分かっていない人が
そういう手法を取る結果、スクリプトがおかしな動作をする

…というところから、GNU版dateの拡張は始まっている

NetNewsがまだ生きてた時代の話
104名無しさん@お腹いっぱい。:2012/06/19(火) 09:28:29.09
世界にはタイムゾーンはいくもあるけど、
サーバは1ヶ所にあって世界中を旅するわけではないので。
105名無しさん@お腹いっぱい。:2012/06/19(火) 11:04:50.48
クライアントじゃなくてサーバかよw
106名無しさん@お腹いっぱい。:2012/06/19(火) 11:28:22.18
>>105
何かおかしいか?
107名無しさん@お腹いっぱい。:2012/06/19(火) 11:43:09.74
>>105
笑い事じゃあないぞ
108名無しさん@お腹いっぱい。:2012/06/19(火) 11:51:13.75
WebAppフレームワーク系は複数のタイムゾーン扱う仕組み持ってるよ。
django1.4もmultiple time zoneが入ったばかり。
default time zoneもcurrent time zoneも取得できる。
夏時間と遠隔地絡んだ特殊な処理も標準的にできるようになった。
またWebAppサーバのdefault time zoneはサーバの物理的な位置に合わせていると限らない。

まあシェルスクリプトの領分ではないが。
109名無しさん@お腹いっぱい。:2012/06/19(火) 12:02:54.39
date +%Z でいいんじゃね?

sshした時にTZはクライアントのがいいか、サーバのがいいかなんて一意には決められないね。
環境変数TZは、最小限の手間でその辺のことうまく扱ってるね。
110名無しさん@お腹いっぱい。:2012/06/19(火) 19:27:08.84
世界のどこか、例えばエスポレル共和国から日本のサーバにsshでアクセスし、
エスポレル共和国時間で12時間前の時刻を計算したいときって、どうすればいいの?
111名無しさん@お腹いっぱい。:2012/06/19(火) 19:33:35.80
>>110
エスポレル共和国ってどこだか知らないけど、
タイムゾーンはどうなってるの?
112名無しさん@お腹いっぱい。:2012/06/19(火) 19:34:09.40
それってsshで日本のサーバーにアクセスしてることと何か関係あるの?
いったんログアウトしてエスポレル共和国のマシンで好きにやったらいいじゃんw
113名無しさん@お腹いっぱい。:2012/06/19(火) 20:07:19.80
>>110
$ env TZ='エスポレル共和国のタイムゾーン' date --date='12 hours age'
でいいんじゃない?

GNU date依存嫌ならepoch time計算して。
114ワラ:2012/06/19(火) 20:11:25.70
age→ago
115名無しさん@お腹いっぱい。:2012/06/19(火) 21:34:29.04
>>113
でもそのスクリプトだと、別のタイムゾーンのどこかの国からアクセスした場合でも
アクセス元ではなく、常にエスポレル共和国の計算結果が出てしまうのでは
116名無しさん@お腹いっぱい。:2012/06/19(火) 22:00:52.43
つまり「ログイン元のサーバのタイムゾーンをログイン先にも反映させたい」ってこと?
それはsshのサーバ/クライアントの設定で環境変数TZを引き渡せるように
AcceptEnv/SendEnvやPermitUserEnviromentするぐらいしかないんじゃなかろうか。
117名無しさん@お腹いっぱい。:2012/06/19(火) 22:13:50.40
>>115
でも最初にそういう条件なかったよね。
118名無しさん@お腹いっぱい。:2012/06/20(水) 11:35:27.52
>>115
その先の創意工夫は自分でやるんだよ
なんでもおんぶにだっこじゃ教育によくない
119名無しさん@お腹いっぱい。:2012/06/20(水) 14:14:27.58
>>117
最初の一行目に世界のどこか、例えばって書いてあるのになにいってんの?
120名無しさん@お腹いっぱい。:2012/06/20(水) 14:28:46.20
なんか、途中から入ってきた人が意味取り間違えて会話してるね。

お題を整理しよう。

環境変数TZがすでに設定されている(日本時間とは限らない)場合も含めて、
GNU dateを使わずに、dateで1日前の日付(時刻)を取得する方法は?

というのが元のお題。
121名無しさん@お腹いっぱい。:2012/06/20(水) 14:37:08.98
>>119
ん?
どういうこと?
122名無しさん@お腹いっぱい。:2012/06/20(水) 14:40:02.24
>>120
GNU date ない環境では perl でワンライナー書いてたな。
perl すらない環境には当たったことがなかった。
123名無しさん@お腹いっぱい。:2012/06/20(水) 14:40:54.15
BSD dateはいいのか?
124名無しさん@お腹いっぱい。:2012/06/20(水) 14:43:50.35
>>123
なるべく汎用性が高い方法で、ってことじゃないなあ。
125名無しさん@お腹いっぱい。:2012/06/20(水) 14:45:03.99
×じゃないなあ
○じゃないかな
126名無しさん@お腹いっぱい。:2012/06/20(水) 14:56:47.76
>>123
>>99で出てるな。
127名無しさん@お腹いっぱい。:2012/06/20(水) 15:04:20.81
JSTとかPDTとかってどうやって取得すんの?
128名無しさん@お腹いっぱい。:2012/06/20(水) 15:06:30.87
>>122
perlといってもうちの環境じゃコアモジュールすら無いけどな
何をやるにも車輪作り直しだから楽しいといえば楽しい
129名無しさん@お腹いっぱい。:2012/06/20(水) 15:11:35.40
>>128
そういう環境では>>120はどうやるの?
130名無しさん@お腹いっぱい。:2012/06/20(水) 15:22:57.02
>>129
諦めてた
131名無しさん@お腹いっぱい。:2012/06/20(水) 15:24:14.50
コアモジュールなくても、timeとlocaltimeとprintくらいないの?
132名無しさん@お腹いっぱい。:2012/06/20(水) 16:40:08.45
>>131
標準関数はだいたいある
昨日の日付くらいなら自力でなんとかなるよ
133名無しさん@お腹いっぱい。:2012/06/24(日) 21:01:25.05
expectを使用してlsコマンドを発行、
その結果をスクリプト内の変数に入れるにはどうすればいいのん?
コマンド発行まではググってすぐにわかったんだけど結果取得がよくわかんない(´・ω・`)
134名無しさん@お腹いっぱい。:2012/06/24(日) 21:07:37.57
普通に ` ` じゃだめなん?
135名無しさん@お腹いっぱい。:2012/06/24(日) 21:54:23.75
expect内でtelnet接続
その接続先でコマンドを発行して結果を取得したいのです…
136名無しさん@お腹いっぱい。:2012/06/24(日) 22:09:29.98
それは大変高度な要求なので答える事が出来るのは日本に1人しかいない。
137名無しさん@お腹いっぱい。:2012/06/24(日) 22:10:23.28
>>135
そういうことなら ssh 使う方が楽じゃない?
138名無しさん@お腹いっぱい。:2012/06/24(日) 22:12:20.95
expect+telnetなんて使わずに普通にssh使え。
139名無しさん@お腹いっぱい。:2012/06/24(日) 23:24:18.51
>>135
前回の 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"
}
140名無しさん@お腹いっぱい。:2012/06/24(日) 23:44:45.76
自分で書いててなんですが、ls /var/log/wtmp でいいですよね。
出力行数をコマンド側で極力減らしておく、ということを言いたかったのですが
例としては不適切でした。
141ワラ:2012/06/25(月) 23:34:27.36
>>133>>135
シェルスクリプトはどちらで動くのですか?
142名無しさん@お腹いっぱい。:2012/06/26(火) 09:23:23.94
回答が全て難しすぎてワロタ
expect -c "
spawn telnet 127.0.0.1
expect \"$ \"
send \"ls\r\"
expect eof
"
こんな風に書いてて
「よーしとりあえずexpectの外でecho $expect_out(buffer)を入れてlsの結果を表示するぞー」
とか思ってたらなんかどこに入れるかわからんかった
というより、expectの使い方がわかってない気がした…
143名無しさん@お腹いっぱい。:2012/06/26(火) 11:39:01.09
回答が難しいってより質問がわけわからんくて。
鍵設定して
OUT=`ssh [email protected] ls`
とかでいいじゃん。
144名無しさん@お腹いっぱい。:2012/06/26(火) 12:03:19.34
ふむ。
端からexpectありき、で考えること自体が間違っているわな。
145名無しさん@お腹いっぱい。:2012/06/26(火) 15:29:34.23
telnet接続限定なのでどうしてもexpectを使用してlogin passwordを自動化しないといけないんですよね…
146ワラ:2012/06/26(火) 15:57:31.38
>>141はどうなんだよ。

シェルスクリプトは全部こっちで動かすとして、

#! /usr/bin/expect -f
spawn telnet ホスト名
expect "login:\ "
send "ログイン名\r"
expect "assword:"
send "パスワード\r"
expect "^ホゲ$ "
send "ls¥r"
expect "^ホゲ$ "
send "exit\r"

を下請けコマンドにしてやってみれ。(プロンプトは"ホゲ$ "と仮定)
147名無しさん@お腹いっぱい。:2012/06/26(火) 16:08:59.94
質問者は名前書いとくれ。
148133:2012/06/26(火) 16:18:50.38
>>146
動かす方は全てクライアント側です
早速そのスクリプトを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.というエラーが…
むむむ…
149名無しさん@お腹いっぱい。:2012/06/26(火) 16:21:53.21
ルータか?
ならそれを先に言えよ。
そもそもls使えんのか?
150133:2012/06/26(火) 16:25:27.80
Yes
シリアル接続のルータです
lsは仮で使用出来るコマンドを発行してます
でもexpect -f e.sh や expect e.shだとOKなんですが
シェルスクリプト内でやると駄目だよーと怒られるんです(´・ω・`)
151名無しさん@お腹いっぱい。:2012/06/26(火) 16:27:25.92
「駄目だよー」じゃわからん。
152名無しさん@お腹いっぱい。:2012/06/26(火) 16:27:40.89
×シリアル接続のルータ
○シリアル接続が出来るルータ
153名無しさん@お腹いっぱい。:2012/06/26(火) 16:28:08.54
ウソついたり隠し事したりするやつはめんどう見きれん。
154133:2012/06/26(火) 16:28:19.13
>>151
エラー内容は>>148です
155名無しさん@お腹いっぱい。:2012/06/26(火) 16:29:27.55
たぶんそれ出来ないよ。
だからperl何かをみんな使う。
156名無しさん@お腹いっぱい。:2012/06/26(火) 16:29:29.22
>>154
それエラーじゃないでしょ。
向こう側が接続を切った、って言ってるだけ。
157133:2012/06/26(火) 16:33:03.55
>>155
そうなんだ…
>>156
expect e.shだと出来るんですよね
でもシェルスクリプト内で呼び出すと先ほどのエラーがでちゃう
うーむ…
158名無しさん@お腹いっぱい。:2012/06/26(火) 16:40:34.41
>>157
標準出力が端末以外の状態だとダメなんだろ。

expect e.sh だとOKでも、
expect e.sh | cat ではNGとか。

だったら OUT=`expect e.sh` も NGになる。
159133:2012/06/26(火) 16:44:09.27
>>158
いえ、expect e.sh | catと打ち込んでも出来ました
でもシェルスクリプト内で>>148のようにするとエラーが返って来ちゃうんです
160名無しさん@お腹いっぱい。:2012/06/26(火) 16:48:13.20
>>159
シェルスクリプトの「外」で、

OUT=`expect e.sh`
echo "$OUT"

って打ち込むとどうなる?
161ワラ:2012/06/26(火) 16:49:51.33
J. Noel Chiappaさん、久しぶりだなあ。
162133:2012/06/26(火) 16:50:03.46
>>160
>>148のエラーが$OUTにはいってました
163名無しさん@お腹いっぱい。:2012/06/26(火) 16:53:23.12
>>162
じゃあ、

expect e.sh > OUT
cat OUT

で妥協。
164133:2012/06/26(火) 16:57:30.29
>>163
ばっちり出来ますた!
ちなみに別ファイルを用意せずにシェルスクリプト内でexpect -c ""みたいにする事は出来ないのかな?
出来ないから別ファイル用意してexpectやperlを使用するようにと言われてるような気もするけど…
165ワラ:2012/06/26(火) 17:02:26.40
出来るよ。
たぶんあんたが色々勘違いしてるだけ。
ルータの連続ログイン禁止に抵触してたり。
エラー処理がない>>146もどうかと思うけど。
166名無しさん@お腹いっぱい。:2012/06/26(火) 17:04:50.56
>>165
連続ログイン?
そういったルールによるアクセス制御はありませんよ
ちなみにexpect -cだと具体的に>>146はどう書くんです?
167名無しさん@お腹いっぱい。:2012/06/26(火) 17:09:57.50
全出力を他のファイルに落としてゴニョゴニョするよりperlのNet::Telnetでも使った方がいい気がする。
168名無しさん@お腹いっぱい。:2012/06/26(火) 17:26:29.45
>>166
シングルクオートでくくって、¥等をエスケープするだけ。
169名無しさん@お腹いっぱい。:2012/06/26(火) 18:57:55.22
>>166
expect -c "
spawn telnet ${HOST}
expect \"login: \"
send \"${USER}\r\"
expect \"assword: \"
send \"${PASS}\r\"
expect \"$\"
" > OUT
cat OUT
でもこうやって全出力を他のファイルに落としてゴニョゴニョするより(ry
170名無しさん@お腹いっぱい。:2012/06/26(火) 19:08:18.81
一般論として考えよう。

コマンド > OUT
cat OUT

なら動作するのに、

OUT=`コマンド`
echo "$OUT"

では動作しないのって、どういうケースが考えられる?
171名無しさん@お腹いっぱい。:2012/06/26(火) 19:32:35.02
どっちにしてもtelnetがconnction closedになる事はないです。
172名無しさん@お腹いっぱい。:2012/06/26(火) 19:39:47.98
>>171
そういう話はしてないだろ
173名無しさん@お腹いっぱい。:2012/06/27(水) 20:34:48.42
bashで、32bitや64bit等の固定幅整数の論理演算がやりたい時って、
普通はどうやるものなのでしょうか?
例えば左シフトする演算をやるとすると、固定幅でない場合は面倒です。
計算後に一々固定幅に除算するのは速度的にどうかと思うし、
皆さんがどのような手段をとっているのか、おすすめの方法を教えて下さい。
174名無しさん@お腹いっぱい。:2012/06/27(水) 20:35:48.09
bashでやろうってのがどうかと思う。
175名無しさん@お腹いっぱい。:2012/06/27(水) 20:56:11.44
>>173
bashなら64bit(符号付)で固定幅だよ。
左シフトしてオーバーフローしたビットは自動的にカットされる。

$ echo $((0x7fffffffffffffff))
9223372036854775807
$ echo $((0x7fffffffffffffff<<1))
-2
$ echo $((0x7fffffffffffffff<<2))
-4
176名無しさん@お腹いっぱい。:2012/06/27(水) 21:28:12.13
>>175
1.
bashが64bit幅(符号付)というのは、bashの仕様でしょうか?
それとも、事実上、それが基本になっている事が多いということでしょうか?

2.
32bit幅の固定幅bit演算、符号なしの論理演算をする時は、
やはり %0xFFFFFFFF 等と、演算を行った後に
適宜修正して計算するのが普通なのでしょうか?
177名無しさん@お腹いっぱい。:2012/06/27(水) 23:10:24.88
ループバックってなんですか?
178名無しさん@お腹いっぱい。:2012/06/27(水) 23:11:20.59
くるっと自分のところに戻る
179名無しさん@お腹いっぱい。:2012/06/28(木) 07:54:55.06
で、結局ループバックってなんですか?
180名無しさん@お腹いっぱい。:2012/06/28(木) 10:56:16.20
くるっと自分のところに戻る
181名無しさん@お腹いっぱい。:2012/06/28(木) 10:59:29.13
だから、結局ループバックってなんなんですか?
182名無しさん@お腹いっぱい。:2012/06/28(木) 11:03:12.48
くるっと自分のところに戻る
183名無しさん@お腹いっぱい。:2012/06/28(木) 11:27:39.66
ルーフバッグってなんですか?
184名無しさん@お腹いっぱい。:2012/06/28(木) 11:28:26.83
屋根袋
185名無しさん@お腹いっぱい。:2012/06/28(木) 13:34:47.48
>>177
流れを読んでいないけど、
男なら黙ってmanだろ。
$ man -k loopback
lo(4) - software loopback network interface
186名無しさん@お腹いっぱい。:2012/06/28(木) 13:37:43.27
$ man -k loopback
loopback: nothing appropriate.
$ man loopback
No manual entry for loopback
187名無しさん@お腹いっぱい。:2012/06/28(木) 13:55:49.47
そもそもどのループバックのことなのか。
シェルスクリプトとは別の話じゃないのか。
188名無しさん@お腹いっぱい。:2012/06/28(木) 14:17:25.20
超エスパーすると、エコーバックのことを聞いてるとか
189名無しさん@お腹いっぱい。:2012/06/28(木) 18:04:41.35
俺はレジ袋もらう派だ
190名無しさん@お腹いっぱい。:2012/06/28(木) 18:07:40.50
それはエコバッグ
191名無しさん@お腹いっぱい。: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)
は思いついたけどなんか嫌だし、副作用もあるので
192名無しさん@お腹いっぱい。: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)
...
193191:2012/06/30(土) 16:40:38.69
>>192
bash --version
GNU bash, バージョン 4.2.28(1)-release (x86_64-redhat-linux-gnu)

4.2.10では起きてなかったと思う
194名無しさん@お腹いっぱい。:2012/06/30(土) 16:43:18.58
ふつー、ポジションパラメータ
195名無しさん@お腹いっぱい。:2012/06/30(土) 16:54:47.17
4.2.10でも再現した
$ 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
196名無しさん@お腹いっぱい。:2012/06/30(土) 17:02:02.66
4.2.29でも同じだった
>>192
echo が引用符が除去するからそれをやってもわからない
set -xで見ないと
197名無しさん@お腹いっぱい。:2012/06/30(土) 17:10:30.74
4.1でも3.2でも同じだから俺がエスケープされる仕様に気付いてなかっただけっぽ
198名無しさん@お腹いっぱい。:2012/06/30(土) 17:11:54.01
>>196
set -xで見て付いてるクォートは実際には除去されるから問題ない
199名無しさん@お腹いっぱい。:2012/06/30(土) 17:49:22.14
>>194
setでポジショナルパラメータに代入しても
結局ポジショナルパラメータの展開時にエスケープされちゃう
$*でも$@でも"$@"でも同じ
逆に*をあらかじめクォートしなければうまくいくようにも思えるが
クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い

>>198
set -xでやたら'が増えるのはわかってるけど、そういう問題じゃないから
コマンド引数として「*」記号を渡したい
あらかじめ文字列中に裸の「*」を入れておくとglob展開される
「'*'」や「\*」を入れておくとパラメータ展開時に'や\までエスケープされてしまうって話
>>192の例でoが「'*'」の時
echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
記号「*」だけを表示して欲しいわけ

そのためにはoを「*」をにしてecho "$o"とやるしか方法がない
そういう仕様だからしかたないと納得した
つまり俺の
> パラメータに空白で区切って複数のオプション入れて、
> それをコマンド引数に渡すってことをやってたんだけど
がそもそも間違ってた。特殊記号が入る時はそういう事やっちゃいけないんだろう
200名無しさん@お腹いっぱい。:2012/07/02(月) 13:20:07.03
>>191 やりたい事がこれで出来るならば、
options=(+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 "'*'"の結果が同じになるのは変だろ
201200:2012/07/02(月) 13:38:21.36
ああ、オプションだから、区切られないといけませんね。
後ほど
202200:2012/07/02(月) 13:57:02.19
$ cat convert.sh
#!/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

これでまだ勘違いしていたら、夜にでも考えます
203名無しさん@お腹いっぱい。:2012/07/02(月) 14:46:36.09
個人的にはbashとkshの両方で動くならArrayでいいかって気になってます
特にデータが外部から来る場合は"${array[@]}"がセキュリティ面を考えると安心だし
204200:2012/07/02(月) 19:47:27.73
変数を区切るのでもなければ、eval set は不要で単に set で充分ですね。
変な点はまだ有るかもしれませんが、まあ Array で動いていてそれで良いなら、
不要な様なのでこれ以上訂正しません。

205名無しさん@お腹いっぱい。:2012/07/07(土) 04:32:03.14
>>200
不要です。
以上。
↓はい次の方。
206名無しさん@お腹いっぱい。:2012/07/07(土) 07:45:06.26
↑リフレクト
207名無しさん@お腹いっぱい。:2012/07/07(土) 21:04:25.66
戻り値がゼロのとき真 ってのやめてほしい
208名無しさん@お腹いっぱい。:2012/07/07(土) 21:24:19.25
算術式展開では 真で1

$ echo $((123==123))
1

算術式評価では 真で0

$ ((123==123)); echo $?
0

・・・そういうものです
209名無しさん@お腹いっぱい。:2012/07/08(日) 00:05:05.40
かき回すなよバカ。

echo false; echo $?
意味ねーだろ。
210名無しさん@お腹いっぱい。:2012/07/08(日) 08:43:03.23
>>209 が 「echo false」で例えてるのが的外れ。
>>209>>208 の意味を理解してない。たぶん、算術式評価を知らないと見た。

echo $((123==123)); echo $? じゃなくて、
((123==123)); echo $? を実行してるんだから。
211名無しさん@お腹いっぱい。:2012/07/08(日) 08:58:09.05
それを踏まえたうえで、>>207が「戻り値のゼロ」を問題にしているのに、
標準出力の1/0を持ち出すのは「echo false」と同じくらい意味ねーといっているのだ。
わかるか? バカ。
212名無しさん@お腹いっぱい。:2012/07/08(日) 09:00:39.71
罵倒はいらんよ。
213名無しさん@お腹いっぱい。:2012/07/08(日) 09:04:04.78
>>211
>>208 が指摘してるのは、
戻り値では0が真だが、展開値を出力とする算術式展開では1が真だよという点。
で、その算術式展開と算術式評価もまた違うという点。

やっぱり >>209 は算術式理解してなかったんだね。
214名無しさん@お腹いっぱい。:2012/07/08(日) 09:08:53.37
>>211 は多分↓みたいなコマンド理解できないだろう。

$ ((0)); echo $?
1

↑結果は偽ね。
215名無しさん@お腹いっぱい。:2012/07/08(日) 09:40:18.88
>>213
コマンドの戻り値が0で真が気持ち悪いというのが>>207が言っている事。

それに対して、算術展開とか持ち出した>>208の間抜けさを指摘しているのだ。 バカには難しすぎかい?


>>214
バカすぎる。つーか意味不明。当たり前のように理解不能。
行頭の$は何だよプロンプトか? w
216名無しさん@お腹いっぱい。:2012/07/08(日) 09:45:04.93
>>215
>当たり前のように理解不能。

↑敗北宣言乙w
217名無しさん@お腹いっぱい。:2012/07/08(日) 10:04:40.89
>>215
> >>214
> 行頭の$は何だよプロンプトか? w

その通りだよw
218名無しさん@お腹いっぱい。:2012/07/08(日) 10:12:49.26
なんだbashの記法か。マジで知らんかったわ。w
で、それが「戻り値が0で真は気持ち悪い」となんの関係があるんだ? マヌケ
219名無しさん@お腹いっぱい。:2012/07/08(日) 13:35:39.83
ここはシェルスクリプトのスレなんだから、bashはbashスレでやれ。
220名無しさん@お腹いっぱい。:2012/07/08(日) 15:01:13.59
分かってねえやつは黙ってろマヌケw
221名無しさん@お腹いっぱい。:2012/07/08(日) 19:16:09.74
戻り値がゼロのとき菊地真
222名無しさん@お腹いっぱい。:2012/07/08(日) 19:58:11.85
シェルから使う外部コマンドは正常終了するとき exit(EXIT_SUCCESS) するわけで
/usr/include/stdlib.h:#define EXIT_SUCCESS 0 /* Successful exit status. */
になっているのだからしょうがないでしょうよ。
223名無しさん@お腹いっぱい。:2012/07/08(日) 21:08:41.46
本当、ここはマヌケばかりだw

色々と勉強しなおせ
224名無しさん@お腹いっぱい。:2012/07/08(日) 21:14:25.84
ん? 何スレか前の /dev/tcpで大恥かいた奴が暴れてるのか?w
225名無しさん@お腹いっぱい。:2012/07/08(日) 21:18:14.89
>>222
しょうがないのはいいんだけど、こういうときに頭がこんがらがる

test -f hoge.txt が成功したら「真」だから
test -f hoge.txt && echo unko
のときにちゃんとunkoが出るんだけどさ、ここまでいいんだけど

test -f hoge.txt の結果、$?ってゼロじゃん? だからさっきのも
ゼロ && echo unko
みたいな感じで unko出ねぇ って一瞬思っちゃうんだよ
226名無しさん@お腹いっぱい。:2012/07/08(日) 21:23:20.80
アゼンブラで、演算結果が0の時に Zフラグが1になる(0なのに1になる)
という感覚に慣れていればどうってことない。
227名無しさん@お腹いっぱい。:2012/07/09(月) 09:44:10.37
>>226
Zフラグでもなんでもどういうたとえを使ってもいいけど、
そのたとえを当てはめるまでにタイムラグがおこる
228名無しさん@お腹いっぱい。:2012/07/09(月) 10:56:32.71
lua だと 0 でも 1 でも "" でも真だからどうってことない。
229名無しさん@お腹いっぱい:2012/07/10(火) 21:53:14.00
VMCPU="cotex-a8"
QEMUOPTS="${VMCPU:+-cpu $VMCPU}"
この文の
VMCPU:+ ってのは何のためにあるんでしょうか?
230名無しさん@お腹いっぱい。:2012/07/10(火) 21:56:15.24
>>229
>>229
$VMCPU に値が設定されている時のみ -cpu $VMCPU に展開する。

$VMCPU が設定されていない時に -cpu のオプションだけが QEMUOPTS に代入されるのを防ぐ。
231名無しさん@お腹いっぱい。:2012/07/10(火) 22:04:39.97
>>230
だから、VMCPUには常に値を代入してるんですが、、
232229:2012/07/10(火) 22:34:35.51
>230
:-
:+
:=
こんな使い方があったんですね。ありがとうございました
233名無しさん@お腹いっぱい。:2012/07/12(木) 17:37:48.08
##### evalの危険性について #####
シェルスクリプト学習中の初心者です。

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"

また、この点に気を付ければ良い等、機械的に安全を得るやり方は有りますか?
もしくは、皆さんが使用時に、気を付ける点などあればご教示下さい。
234名無しさん@お腹いっぱい。:2012/07/12(木) 21:28:20.42
> 機械的に安全を得るやり方は有りますか?
無い。信頼できるソース以外からの文字列をevalしてはいけない。
235名無しさん@お腹いっぱい。:2012/07/12(木) 21:57:05.58
そもそもevalなんて滅多に使わないしなー。
evalを頻繁に使うようなトリッキーなコードは読みにくくなりがちだしね。
236名無しさん@お腹いっぱい。:2012/07/12(木) 22:14:43.03
configure発明したやつに言ってやってくれ
237名無しさん@お腹いっぱい。:2012/07/12(木) 22:18:43.10
発明w
238名無しさん@お腹いっぱい。:2012/07/12(木) 22:20:16.41
configureは人間が読み書きするものじゃなくてautoconfに作らせるものだから
239名無しさん@お腹いっぱい:2012/07/13(金) 22:22:49.32
公開鍵を使わず、パスワード認証でsshdを使ってます。
アクセスを集計しようと
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されませ。
どこがマズイでしょうか?
240名無しさん@お腹いっぱい。:2012/07/13(金) 22:36:54.90
カンマが一つ抜けてるんじゃねーの
241239:2012/07/13(金) 22:57:53.20
>240
カンマ抜けてました
でも、カンマいれると全てが1行表示になりました。
242名無しさん@お腹いっぱい。:2012/07/13(金) 23:10:09.05
cat /var/log/auth.log | grep "Failed password"
ここが環境依存だから答えられん。
awkに対してどんな入力を期待してるの?
243名無しさん@お腹いっぱい。:2012/07/13(金) 23:40:29.47
関係ないけど、grep|awk っていうパイプラインよく見る気がする。
ついついやりたくなるのは分かるがawkがかわいそうに思えてくる。
244名無しさん@お腹いっぱい。:2012/07/13(金) 23:45:38.52
awkはちょっと強力なcutという用途にしか使われてないことは多そうだな。
かと言って全部awkでしちゃうとgrepとかsedの立場がなくなる。
245名無しさん@お腹いっぱい。:2012/07/13(金) 23:49:01.38
最初のcatが無駄だろっていう人は最近来なくなったのねw
246名無しさん@お腹いっぱい。:2012/07/14(土) 00:33:02.57
cat使ったほうが分かりやすい
247名無しさん@お腹いっぱい。:2012/07/14(土) 00:45:52.23
catを使わなかったら、ファイルを対象にするコマンドと、パイプで入ってくるものを
対象にするコマンドが混在することになるからな

出力はcat、処理はパイプ、と分けた方が、保守性は高まるんじゃないかな
248名無しさん@お腹いっぱい。:2012/07/14(土) 01:19:38.10
cat議論は一スレで二回ぐらい発生するのが恒例行事。
249名無しさん@お腹いっぱい。:2012/07/14(土) 06:53:20.81
議論され尽くしてるものの議論は、やはり面白いですな
250名無しさん@お腹いっぱい。:2012/07/14(土) 07:15:53.03
>>243,244
わかるわww
ただawkを使いこなせるようになるには時間がかかるし、若い奴にこんな時代遅れなものを今から全部学べとは言えないからな。
必要最小限な使い方だけ教えると、grepやsedやuniqなんかと組み合わせた使い方をしてくるんだよね。
251239:2012/07/14(土) 07:55:25.81
寝てしまった
Failed 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 のアドレスでまとめたいだけなんです。
連続したアドレスをまとめて、カウントできれば
252名無しさん@お腹いっぱい。:2012/07/14(土) 07:56:18.63
テンプレやいろいろな場所でcshがヤバめというのは自覚してるんですが教えてください。
あのcsh使わされてるんですけど標準入力のアスタリスクを文字として扱えないんですけどどうしたらいいんですか。
標準入力からsetした変数でいろいろ分岐したいんですけど*を入れた場合だけ構文エラーとかワイルドカード展開になってしまいます。
ちなみにUNIX環境は全くわかりません。
マジでお願いします。
253名無しさん@お腹いっぱい。:2012/07/14(土) 08:37:53.40
>251
なら前半は
awk '/failure/{print $1,$2,$3,$(NF-5),$(NF-3),$(NF-1)}' /var/log/messages
で済みそう。時間的な連続性を気にしなければ数え上げもawk内でやりたいが。
254251:2012/07/14(土) 09:00:52.31
>253
failureの行をつかうたんですね

思うように集計されないのは、uniqの使い方に問題があったみたいです。
sortが前提みたいですね。
ただ、時間的に連続したfailureのアドレスをまとめたい、できればカウントつきで

255名無しさん@お腹いっぱい。:2012/07/14(土) 09:15:24.77
数え上げはawkじゃなくてuniq -cあたりに任せたいところ。
256名無しさん@お腹いっぱい。:2012/07/14(土) 10:46:53.42
アドレスだけでいいならuniq -c -f 4じゃないの?
257名無しさん@お腹いっぱい。:2012/07/14(土) 15:21:41.03
>>252
こういう事か?

set hoge = "$<"
echo "$hoge"
258名無しさん@お腹いっぱい。:2012/07/14(土) 15:28:23.55
今月はじめ、職場に新しいPC(Core i7の結構ハイエンド構成)が入りました。
多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や
シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを
使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは
#!/bin/tcshという文字列でした。

「うへぇ〜、よりによってtcshかよ」

ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、
今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、
今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、
スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。
おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が
強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。

昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた
cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。

これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか
$<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって
実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し
(だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。
そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が
再現され、それに巻き込まれるのでしょう。もう今からうんざりです。

だからお願いです。教育現場ではbashでもzshでもkshでもashでも
Bourne shでもなんでもいいですがBシェル系のシェルにしてください。

教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
259名無しさん@お腹いっぱい。:2012/07/14(土) 15:32:28.73
どうでもいいけど日本のシェル界なんてものの存在を初めて知った。
260名無しさん@お腹いっぱい。:2012/07/14(土) 16:52:49.19
Solaris編もあったね
261名無しさん@お腹いっぱい。:2012/07/14(土) 16:56:34.37
シェル王が住んでる。
262名無しさん@お腹いっぱい。:2012/07/14(土) 18:01:11.45
なんでこんなコピペ気にいったんだこいつ。
263名無しさん@お腹いっぱい。:2012/07/14(土) 19:39:52.83
>>262
サルにマスかき覚えさせると血が出るまでやめないのと同じだよ
覚えたてで嬉しいんだろう
264名無しさん@お腹いっぱい。:2012/07/14(土) 19:52:41.06
多分、覚えたてのコピペを貼るように>>252が釣った。
今時csh使ってるところなんかあるわけねーだろ。
265名無しさん@お腹いっぱい。:2012/07/14(土) 20:00:46.43
コピペだったのか。マジレスしそうになったよw
266名無しさん@お腹いっぱい。:2012/07/14(土) 22:00:42.21
コピペはさておき、カーソルキーでヒストリ機能を使おうと思うと
tcshが一番手っ取り早い時期があった

bashでの、カーソルキーによるヒストリ機能の正式サポートと実装は、
netnewsでは結構祭レベルで好評だったのに対し、fj界隈では
カーソルキーなんて使わないじゃんSVR4とかwwwみたいに
ガラパゴスってた事が、tcshユーザが大量生産したことと
因果関係は有ると思うね
267名無しさん@お腹いっぱい。:2012/07/14(土) 23:13:13.33
ガラガラ話にしても仕方なかろう

BSD界隈では csh 系にそれなりの人気があり
FreeBSD なんかデフォルトのshellは未だにcshだ(実体はtcsh)
268名無しさん@お腹いっぱい。:2012/07/14(土) 23:16:17.42
WITHOUT_TCSHで問題なく動くけどな。
269名無しさん@お腹いっぱい。:2012/07/15(日) 03:26:56.35
>>267
ashじゃなかったっけ
270名無しさん@お腹いっぱい。:2012/07/15(日) 04:05:13.03
271名無しさん@お腹いっぱい。:2012/07/15(日) 07:21:31.45
FreeBSDはなんで今でもcshがデフォルトなの?何か理由あるの?
272名無しさん@お腹いっぱい。:2012/07/15(日) 12:20:29.92
BSD だから,に尽きるんじゃないかな
273名無しさん@お腹いっぱい。:2012/07/15(日) 13:30:12.88
そもそもcsh自体がBSD発祥なんだっけ
274名無しさん@お腹いっぱい。:2012/07/15(日) 17:10:34.35
宗教上の理由でbashが使えないから
275名無しさん@お腹いっぱい。:2012/07/15(日) 20:13:13.73
bashはGNUライセンスだからなんじゃないの?
276名無しさん@お腹いっぱい。:2012/07/15(日) 20:53:59.04
パブリック
277名無しさん@お腹いっぱい。:2012/07/16(月) 02:01:54.23
>>273
Bill Joy先生の作品ですよ。
ジョブコントロール関係のカーネル拡張も。
他にはviとか、page単位の仮想記憶とか。
近代的なUNIXカーネルの創始者の一人。

cshスクリプトの是非については、
csh programming considered harmful.を読めばいい。
278名無しさん@お腹いっぱい。:2012/07/16(月) 16:33:07.10
Linux、bashを使用しています
シェルスクリプトを書いたのですが、
そのスクリプト(***.sh)が入っているディレクトリと入っていないディレクトリで
挙動が変わってしまいます
これはもともとそういう仕様?なのでしょうか
それとも書いたスクリプトに間違いがあってこうなっているのでしょうか
すみませんがアドバイス宜しくお願いします
279名無しさん@お腹いっぱい。:2012/07/16(月) 16:57:50.70
相対パスつこうてるんやろ
280名無しさん@お腹いっぱい。:2012/07/16(月) 17:05:30.38
カレントディレクトリという概念を理解してない。
カレントディレクトリはスクリプトの属性ではなくプロセスの属性。
281名無しさん@お腹いっぱい。:2012/07/16(月) 17:14:22.95
>>279
パスはその都度引数で指定する仕様で
絶対パスで指定しているのでそんなことはない、と思うのですが…
>>280
カレントディレクトリで、なおかつそのスクリプトが入ってるときにしか
動作しない、ということでしょうか…?
すみません、浅学でしてLinuxに関しては学び始めたばかりなのです
282名無しさん@お腹いっぱい。:2012/07/16(月) 17:17:14.41
pastebinか何かにそのスクリプトを晒しなさい
http://pastebin.com/
283名無しさん@お腹いっぱい。:2012/07/16(月) 17:23:10.76
別にLinuxだけの話じゃ無さそうだな
284名無しさん@お腹いっぱい。:2012/07/16(月) 17:24:30.42
>>282
これであってますでしょうか…?
http://pastebin.com/5CHY53XG
285名無しさん@お腹いっぱい。:2012/07/16(月) 17:27:48.35
付け足しですが、こちら「for FILE in _______________」となっていて
inの後ろを穴埋めしろ、という課題なのです
拡張子はtexやdviに限る必要はありません
ただし何かしらの文字列を含まないファイルを
一括で削除するスクリプトを作りましょう、ということなのですが…
286名無しさん@お腹いっぱい。:2012/07/16(月) 17:30:36.51
ls "$DIR"の間違いだろ。
grepのところもegrep -v ".tex$|.dvi$"くらいの意図か?
287名無しさん@お腹いっぱい。:2012/07/16(月) 17:33:28.31
>>286
それも試したんですが削除しますか?と聞かれるファイルがひとつしかないのです>"$DIR"
実際にはもっとたくさんあるんですが…
grepのは特定の文字列を含まないファイルをリストしたいという意図です
".tex$|.dvi$"←これのように「|」を入れないと2つの文字列を除外することはできないのでしょうか?
288名無しさん@お腹いっぱい。:2012/07/16(月) 18:39:06.72
grep -v".txt .dvi" は
何か1文字、t、x、t、スペース、何か1文字、d、v、i
というひとつながりの文字列がある行を除外する。
289名無しさん@お腹いっぱい。:2012/07/16(月) 18:40:30.30
texだたハズカシー

290名無しさん@お腹いっぱい。:2012/07/16(月) 18:52:03.84
>>285
>「for FILE in _______________」となっていて
>inの後ろを穴埋めしろ、という課題なのです

変な課題w

課題関係なしなら
↓で、grep使わずにできる。(lsも使わずに内部コマンドだけで)

cd "$DIR"
for FILE in *
do
case $FILE in
*.tex|*.dvi);;
*) rm -i "$FILE";;
esac
done
291名無しさん@お腹いっぱい。:2012/07/16(月) 19:39:40.80
無理矢理「for FILE in _______________」の中に別のfor文入れちゃえ。
正常に動くよ。

for FILE in `for f in *; do case $f in *.tex|*.dvi)echo "$f";;esac;done`
do
以下略
292名無しさん@お腹いっぱい。:2012/07/16(月) 22:01:42.45
>>288
なるほど…ありがとうございます
検索条件に.○○はダメだったんですね

>>290
正直別なところもいじらせてほしいですorz
スクリプト例もありがとうございます、参考にさせて頂きます

>>291
その手がありましたね…!>for文入れる
有り難うございます、これで行けると思います


長々とどうもすみませんでした
アドバイスしてくれた皆様ありがとうございました
293名無しさん@お腹いっぱい。:2012/07/16(月) 22:05:25.55
あのさぁ…ま いっか
294名無しさん@お腹いっぱい。:2012/07/16(月) 22:27:57.35
ls に絶対パス出力するオプションあるんじゃねーのと思ったらそんなことはなかった
find 使えばいくね?
find "$DIR" -maxdepth 1 -type f

ていうかHOME以下のファイル消すスクリプトとかこえーな
295名無しさん@お腹いっぱい。:2012/07/17(火) 00:37:58.25
>>291 面白w
find -E "$DIR" -type f -regex '.*\.(conf|wrapper)$' -delete
でいいのに

制約があるので>>291よりおふざけ感が低減される
for FILE in `find -E . -type f -regex '.*\.(conf|wrapper)$'`
do
以下略
296名無しさん@お腹いっぱい。:2012/07/17(火) 00:41:30.49
>>295
find -E "$DIR" -type f -regex '.*\.(tex|div)$' -delete
for FILE in `find -E "${DIR}" -type f -regex '.*\.(tex|div)$'`
297名無しさん@お腹いっぱい。:2012/07/17(火) 03:06:32.79
>>292
grep -v -e .tex -e .dvi
egrep -v ".tex|.dvi"

12行目あたりに echo $FILE いれるとか、内容をチェックしてみる癖はつけたほうがいいぞ。
298名無しさん@お腹いっぱい。:2012/07/17(火) 07:26:54.87
>>293
何よ。
299名無しさん@お腹いっぱい。:2012/07/17(火) 15:54:04.83
検索語がまずいのか調べても分からないので、教えてください。

デスクトップ環境(X Window上)のターミナルエミュレータか、
sshログインしたときなどのコンソール上かで、シェルスクリプトの挙動を変えたいのですが、
どのような工夫をすればよいか、何で条件分岐すればよいのか思いつきません。
お願いします。
300名無しさん@お腹いっぱい。:2012/07/17(火) 16:02:19.68
ターミナルエミュレータからsshログインしたときは?
301名無しさん@お腹いっぱい。:2012/07/17(火) 16:03:00.94
>>299
> デスクトップ環境(X Window上)のターミナルエミュレータか、

DISPLAY環境変数が設定されていれば。

> sshログインしたときなどの

SSH_CLIENT環境変数が設定されていれば。

> コンソール上かで、

ttyコマンド使えばこれも判別できる。
302名無しさん@お腹いっぱい。:2012/07/17(火) 16:13:55.08
すみませんが詳しい方のみ回答をお願いします
303名無しさん@お腹いっぱい。:2012/07/17(火) 16:22:19.33
>>301
ありがとう。DISPLAYはsshログインしたときでもたまに設定するので使えません、
ttyコマンドの出力を使う方法は、仮想コンソールだと区別が付きそうですが、
sshログインした場合は区別が付きませんでした。
SSH_CLIENTを見てみました。
SSH_CLIENT, SSH_TTY, SSH_CONNECTIONはsshログインしたときのみに設定されるようなので、
これを使って条件分岐することにします。
ご教示感謝します。>>300さんもありがとうございました。
304名無しさん@お腹いっぱい。:2012/07/17(火) 16:49:06.86
余談だが、
コンソールってのは本体に物理的に接続されてるキーボード/ディスプレーのことな。
パイプオルガンの鍵盤の付いた演奏台由来の名前。
パイプオルガンの本体はパイプだから。
305名無しさん@お腹いっぱい。:2012/07/17(火) 18:45:11.74
先生!ターミナルとコンソールってどう違うんですか?!
306名無しさん@お腹いっぱい。:2012/07/17(火) 18:51:03.45
コンソールはホスト本体の画面とキーボード。
ターミナルはあくまでも別の機械からのリモートログイン。

xtermなどのことをターミナルと呼んでしまうこともあるが、
正しくはターミナルエミュレータなので、純粋なターミナルとは異なる。
307名無しさん@お腹いっぱい。:2012/07/17(火) 19:32:14.58
>>306
本体に接続されたディスプレイとキーボードを使うのに「ターミナル(遠隔操作端末)エミュレータ」だから直感的に混乱するよね。
308名無しさん@お腹いっぱい。:2012/07/17(火) 23:13:42.44
/dev/pts (/dev/pty), /dev/tty, /dev/console
とかのデバイスによって、コンソール、端末(ターミナル、物理端末、制御端末、広義のコンソール等)、
疑似端末(仮想端末、仮想ターミナル、シュードターミナル等)が分かれる。(はずです。多分。)

カーネルをロードしてinit起動してるやつがコンソール
LinuxとかでAlt+2とかで切り替えられる奴がターミナル
他が疑似端末

でOK。(だと思う。多分。)
コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず、あとデーモン類とか
端末持たないプロセス(ps -efとかで見たとき端末のカラムが?になってるプロセス)が標準出力の代わりに/dev/consoleにメッセージ出してきたりする。

まぁ組み込み系の人以外、端末、ターミナル、コンソールをあまり区別せずに使う場合のが多いし、
大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
309名無しさん@お腹いっぱい。:2012/07/18(水) 00:05:24.12
>>308
> コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず

スレ違いな上に出鱈目。最低だ。
310名無しさん@お腹いっぱい。:2012/07/18(水) 09:45:01.28
うん、ムチャクチャにもほどがある。

>大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。

自分がちゃんと覚えていないなら、それをわきまえて黙ってろ。
311名無しさん@お腹いっぱい。:2012/07/18(水) 10:01:19.01
端末のことを英語でターミナルって言うのも知らないんだろな。
端末とターミナルを別物のように説明してるしw
312名無しさん@お腹いっぱい。:2012/07/18(水) 11:07:30.77
>>308がフルボッコにされてるから読んでみたけど
たしかにこれはひどいな
313名無しさん@お腹いっぱい。:2012/07/18(水) 11:13:48.49
>>309
古典/bin/shなrootログインでしかコンソールを触ったことがなかった爺と思われ。
SunOS辺りか?
314名無しさん@お腹いっぱい。:2012/07/18(水) 13:07:04.12
cp file1 /mnt/file2 &
みたいにやっておいて、
mv file2 file3
した場合、最初のコピーにmvが追いついた時ってどうなるの?
315名無しさん@お腹いっぱい。:2012/07/18(水) 13:13:20.91
>>314
この場合のmvは同一ファイルシステムだから、
実際にはrename(2)が呼ばれるだけで、
cpでコピー途中かどうかに関係なくファイル名だけがリネームされる。
また、リネーム後もcpはオープン済みのファイル記述子でコピーを続けるので
コピーも無事file3に対して行なわれる。
よって無問題。
316名無しさん@お腹いっぱい。:2012/07/18(水) 13:18:37.48
>>315
あ、ごめんなさい、
mv /mnt/file2 file3
でした。この場合も問題なしですか?
317名無しさん@お腹いっぱい。:2012/07/18(水) 13:24:13.19
>>316
異なるファイルシステムの場合は
mvが追い付いてしまったらそこでEOFとみなされるので
file3は後半が切れた短いファイルになる。

mvによるコピー後、mvはfile2をunlink(2)する。
cpはファイル記述子でコピー中なので、unlink(2)に気づかずにfile2にコピーするが、
file2はそのまま消滅する。

よって問題あり。
318名無しさん@お腹いっぱい。:2012/07/18(水) 13:33:12.07
>>317
ありがとうございます!
319名無しさん@お腹いっぱい。:2012/07/18(水) 15:15:13.34
最近はこういう自演が流行ってんの?
320名無しさん@お腹いっぱい。:2012/07/18(水) 15:16:56.45
自演じゃないよ。
321名無しさん@お腹いっぱい。:2012/07/18(水) 22:31:50.13
unlink相当の事をした時にどうなるかは、使ってるファイルシステムに依るんじゃないかなぁ
322名無しさん@お腹いっぱい。:2012/07/19(木) 00:40:03.43
UNIX由来のファイルシステムで判例ある?
323名無しさん@お腹いっぱい。:2012/07/19(木) 08:23:00.94
>>321
いや。

OSがUNIXなら、たとえFATファイルシステムであっても
unlinkの挙動は同じになってるよ。
(unlink後もfile descriptorで書き込み等可能、プロセス終了で実体削除)
324名無しさん@お腹いっぱい。:2012/07/19(木) 09:34:12.27
ふーん、どうやってるんだろう。UNIXのファイルシステムと違ってunlink
して(ディレクトリエントリから削除)実体を解放しない(FATには残ってい
る)状態は、ファイルシステムとして壊れた状態なんだけど。
325名無しさん@お腹いっぱい。:2012/07/19(木) 10:50:31.77
どうやってるんだろうとか言ってないで自分で試せよ。
326名無しさん@お腹いっぱい。:2012/07/19(木) 11:54:23.00
>>323
NFSだと違うくね?
327名無しさん@お腹いっぱい。:2012/07/19(木) 11:55:45.52
>>324
全員closeするまでunlinkされないよ
328名無しさん@お腹いっぱい。:2012/07/19(木) 12:10:15.79
>>327
ディレクトリからunlinkはされるけど
closeするまで実体は隠れたところに残ってる、が正しい
329名無しさん@お腹いっぱい。:2012/07/19(木) 12:13:46.17
それunlinkじゃなくてrenameじゃね?
330名無しさん@お腹いっぱい。:2012/07/19(木) 12:14:14.27
ねぇ、この照れ隠しっていつまで続くの?
331名無しさん@お腹いっぱい。:2012/07/19(木) 12:24:14.27
>>329
いや、renameじゃなくてunlink。ディレクトリ上にはどこにも存在しない。
332名無しさん@お腹いっぱい。:2012/07/19(木) 13:47:29.51
>>326
NFSだとサーバ実装にもよるんだけど、
オープンされてるファイルをunlinkすると.nfsXXXというパス名にして、
ls -aなら見えるタイプの実装があるね。
本家のSunOSがそうだった。
今時の商用NASは見えないのが多い。
333名無しさん@お腹いっぱい。:2012/07/19(木) 17:24:45.23
>>324
ファイルシステムとして壊れた状態かどうかはOS側の解釈に過ぎない。
unlinkして実体を解放しないまま何らかの原因で強制ummountされたら、
fsck_msdosfs(FreeBSD)またはfsck.msdos(Linux)で修復できる。

通常のUNIXのファイルシステムのfsckの場合ととくに変わらない。
334名無しさん@お腹いっぱい。:2012/07/19(木) 18:18:26.99
>>332
最近のLinuxのNFSサーバも同じ挙動をする
NFSv3かv4の仕様なんだと思ってた
335名無しさん@お腹いっぱい。:2012/07/19(木) 18:28:40.79
いや.nfsXXXは仕様じゃない。(NFS3以降はRFCになっているので仕様が読める)
NFSは仕様上、ファイルサーバがクラッシュした後、再起動すれば、
クライアントがオープンしていたファイルについて問題なく処理を続行できる必要がある。
そのため、回収されてしまわないようピン止めしているだけ。
商用NASでは.nfsXXXではなく不揮発メモリ上の内部DBに格納して保存している。
336名無しさん@お腹いっぱい。:2012/07/19(木) 20:42:29.05
>>331
ディレクトリから消えるだけっしょ
337名無しさん@お腹いっぱい。:2012/07/19(木) 20:57:26.28
>>336
お前は何を言ってるんだ?
338名無しさん@お腹いっぱい。:2012/07/19(木) 21:11:53.31
以上、知ったかの >>324 君の照れ隠し&自爆をお送りしました。
十分お楽しみいただけましたか?

それでは次の方どうぞ
339名無しさん@お腹いっぱい。:2012/07/19(木) 21:46:23.95
↑リフレクト!
340名無しさん@お腹いっぱい。:2012/07/20(金) 23:28:32.13
cat file1 file2 ってやると file1 のあとに file2 がつながり以下の様になりますが
a
b
c
1
2
3
下のようになるコマンドってありますか
a1
b2
c3
341名無しさん@お腹いっぱい。:2012/07/20(金) 23:31:16.63
>>340
paste
342名無しさん@お腹いっぱい。:2012/07/20(金) 23:31:53.26
つ join
343名無しさん@お腹いっぱい。:2012/07/21(土) 08:02:00.38
>>341 の正解の後で 間違いを書き込む >>342
しかも「つ」とか恥ずかしい文字使ってwww
344名無しさん@お腹いっぱい。:2012/07/21(土) 08:09:55.50
>>340
補足すると、デリミタを空文字にするようにオプション付けてね。

paste -d '' file1 file2
345名無しさん@お腹いっぱい。:2012/07/21(土) 15:59:34.92
>>341>>344
ありがとうございました、望み通りのものです
346名無しさん@お腹いっぱい。:2012/07/21(土) 16:48:21.35
cpuの使用量を確認するのにtop/psを利用しているのですが、
ppid指定で子プロセスの累積値を出すオプション等ありますか?

軽いプロセスをループで呼び続けてるものがcpu%でソートした場合
浮かんで来ないというのを解決するのが目的です

psを利用してppid指定で自前っていうのをやってみようかと思いましたが
それだと、目的の物がpsに出てくる間隔で呼び続ける必要になりそうなので
「軽いプロセスを呼び続ける」ものを監視したいっていう目的に反してるなと・・
347名無しさん@お腹いっぱい。:2012/07/21(土) 21:03:14.45
>>346
Linuxなら、psに S オプションを付けると子プロセスのCPU時間が親に加算されるけど。
348名無しさん@お腹いっぱい。:2012/07/21(土) 21:28:04.70
xinitを打つと左上に白のシェルが出てプロンプトは実行できるようですが、
マウスが反応しません。あ、マウス自体は動いてるんですがクリックしても
何もなりません。タスクバーとかはどうやって出すんですか?
349名無しさん@お腹いっぱい。:2012/07/21(土) 21:36:58.32
xinitじゃなくてstartxでどうよ?
というかシェルスクリプトか?
350名無しさん@お腹いっぱい。:2012/07/21(土) 23:15:22.59
dwm入ってる?
351名無しさん@お腹いっぱい。:2012/07/22(日) 03:02:09.25
>>348
gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
352名無しさん@お腹いっぱい。:2012/07/23(月) 21:56:01.86
すみませんが詳しい方のみ解答をお願いします。
353名無しさん@お腹いっぱい。:2012/07/23(月) 22:11:18.53
スレちがいの戯言は放置するスルーカを習得しよう。
354名無しさん@お腹いっぱい。:2012/07/23(月) 22:21:56.21
355名無しさん@お腹いっぱい。:2012/07/24(火) 00:34:24.03
もしかして:ヤリイカ
356名無しさん@お腹いっぱい。:2012/07/24(火) 00:36:18.47
いや、モンゴウイカじゃね?
357名無しさん@お腹いっぱい。:2012/07/24(火) 23:56:17.62
>>353
xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
358名無しさん@お腹いっぱい。:2012/07/25(水) 03:21:11.56
>>357
352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
359名無しさん@お腹いっぱい。:2012/07/25(水) 21:35:30.31
>>358
おう、そうか。スルーしよう。ありがとう。
360名無しさん@お腹いっぱい。:2012/07/27(金) 20:48:33.81
標準出力はそのままに、標準エラー出力だけgrepかけたいとか
思うんだけど、どうしたらいいでしょか
361名無しさん@お腹いっぱい。:2012/07/27(金) 20:52:17.05
>>360
((コマンド 2>&1 1>&3) | grep hoge) 3>&1
362名無しさん@お腹いっぱい。:2012/07/28(土) 03:58:28.71
>>361
なるほど
いろいろできるもんだな
363名無しさん@お腹いっぱい。:2012/07/28(土) 07:49:40.42
興味本位で聞いただけかよ。無礼な奴だ。
364名無しさん@お腹いっぱい。:2012/07/28(土) 07:56:32.30
アスペさんちっす
365名無しさん@お腹いっぱい。:2012/07/28(土) 09:41:50.79
>>361
サブシェルが1個無駄です。

(コマンド 2>&1 1>&3 | grep hoge) 3>&1

---
サブシェルなしにもできます。

exec 3>&1
コマンド 2>&1 1>&3 | grep hoge
366名無しさん@お腹いっぱい。:2012/07/28(土) 10:07:31.29
>>365
なるほど
いろいろできるもんだな
367名無しさん@お腹いっぱい。:2012/07/28(土) 10:11:09.01
>>366
若ハゲチッス
368名無しさん@お腹いっぱい。:2012/07/28(土) 11:36:30.41
すみませんが詳しい方のみ解答をお願いします。
369名無しさん@お腹いっぱい。:2012/07/28(土) 11:45:46.68
>>366
興味本位で聞いただけかよ。無礼な奴だ。
370名無しさん@お腹いっぱい。:2012/07/28(土) 12:12:34.03
学校の技術の時間、コンピュータについての授業があった。
「コンピュータにはいろんなシェルがある。みんなの知ってるシェルを1つずつ
挙げていこう。誰かわかる人?」と先生が言った。
エクスプローラは真っ先に答えられた。
誰かがGNOMEと答えたが、先生はNautilusと修正して黒板に書いた。
command.comという声も挙がった。
そのあと隣の奴がDOS窓と答えた。
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
キミの答えはここに既に含まれているという、ちょっと屈辱的な対応だ。
満を持してボクは手を挙げて答えた。「bash」
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
371名無しさん@お腹いっぱい。:2012/07/28(土) 12:26:54.24
>>370
オチが分からん。解説よろ
372名無しさん@お腹いっぱい。:2012/07/28(土) 12:32:16.23
FreeBSDがLinuxに含まれるってやつのコピペだよ
373名無しさん@お腹いっぱい。:2012/07/28(土) 15:36:27.50
360じゃないんですが
if ! ERROR=$(command 2>&1);then
exit 1
fi
で、commandが正常終了しても、successedなどのメッセージが返されて
全て、if中に入ってしまいます。
ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
374名無しさん@お腹いっぱい。:2012/07/28(土) 15:38:36.28
手作りと言ってお店のおにぎりを差し入れしてやったわ! フハハ!
375名無しさん@お腹いっぱい。:2012/07/28(土) 15:50:27.43
>>373
こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
376名無しさん@お腹いっぱい。:2012/07/28(土) 15:57:24.14
ばかもん、commandの正体が何かを推察するエスパー検定じゃ。やり直し!
377373:2012/07/28(土) 16:33:01.71
>374
if ! ERROR=$(genext2fs -b $IMAGESIZE -i $BYTEINODE -d $ROOTFS $IMAGENAME 2>&1);then
error "E: $ERROR"
cleanup
fi
E:successed で、cleanup 終了してるみたいで
本当にここか確かめては無いんですが、
378名無しさん@お腹いっぱい。: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
$
379名無しさん@お腹いっぱい。:2012/07/28(土) 17:09:30.14
$()はash依存だから禁止。 はいロンパー
380名無しさん@お腹いっぱい。:2012/07/28(土) 17:26:15.70
再現テスト
$ ERROR=`echo test; true` || echo "$ERROR"
$ ERROR=`echo test; false` || echo "$ERROR"
test
$
381名無しさん@お腹いっぱい。:2012/07/28(土) 17:59:00.49
$()が使えないシェルなんて無視していい。
382名無しさん@お腹いっぱい。:2012/07/28(土) 20:55:59.07
ロンパー、ロンパー、ロンパー
383名無しさん@お腹いっぱい。:2012/07/28(土) 21:59:11.38
大手SIerでは$( )は使わないのが常識です。
384名無しさん@お腹いっぱい。:2012/07/28(土) 22:06:33.76
じゃあ、bashでもzshでもkshでも使える
(( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。
使えないのはashだけだし。
385名無しさん@お腹いっぱい。:2012/07/28(土) 22:13:28.29
使えるならどんどん使っちゃえばいいと思うよ。
せっかく作者が用意してくれた機能なんだし。
386名無しさん@お腹いっぱい。:2012/07/28(土) 22:18:09.18
>( ) や <( ) は使っていいですか? posixでは使えませんが。
387名無しさん@お腹いっぱい。:2012/07/28(土) 22:36:30.01
>>384
そいつらはPOSIXで定義されてるの?
388名無しさん@お腹いっぱい。:2012/07/28(土) 22:39:14.34
(( )) は定義されてる
389名無しさん@お腹いっぱい。:2012/07/29(日) 03:16:10.95
390名無しさん@お腹いっぱい。:2012/07/29(日) 08:10:37.46
・bash/zsh/kshの共通項に合わせる

か、

・純shに合わせる

かの2択。(posix(笑)は現実的じゃないから判断基準にならない)
ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。
あと、ashで仕様の違う「let」コマンドを廃止しろ。
391名無しさん@お腹いっぱい。:2012/07/29(日) 08:18:36.31
>>390
・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
392名無しさん@お腹いっぱい。:2012/07/29(日) 08:36:22.88
>>386
>( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
393377:2012/07/29(日) 09:15:42.62
やはり、エラーの判定になってますが、genext2fsは成功しているな
E: genext2fs: output filesystem image: Success

この場合、結果を標準エラーのみにするには、どうすれば良いですか?

394名無しさん@お腹いっぱい。:2012/07/29(日) 09:19:54.80
>>393
もしかして genext2fsって正しいexit statusを返さないんじゃないの?

標準エラーのみにするには、

if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..

2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
395名無しさん@お腹いっぱい。:2012/07/29(日) 09:27:49.34
ashを否定したせいでposixまで否定する羽目になっちまって大変だな。ロンパー爺さん。
396名無しさん@お腹いっぱい。:2012/07/29(日) 09:29:52.83
俺はash関係なくPOSIXには否定的だけど、何の話?
397名無しさん@お腹いっぱい。:2012/07/29(日) 09:44:58.55
>>393
終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?

ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
398名無しさん@お腹いっぱい。:2012/07/29(日) 10:21:14.14
>>396
じゃあさ。

> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
399名無しさん@お腹いっぱい。:2012/07/29(日) 10:37:10.90
>>398
bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。

一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
400名無しさん@お腹いっぱい。:2012/07/29(日) 10:56:34.72
ポータビリティが必要ならシェルスクリプトは使わないで下さい。
401名無しさん@お腹いっぱい。:2012/07/29(日) 11:02:57.05
POSIXには現物がない。ハイ、ロンパー
402名無しさん@お腹いっぱい。:2012/07/29(日) 11:14:50.01
>>399
> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
403名無しさん@お腹いっぱい。:2012/07/29(日) 11:35:07.43
POSIXには現物シェルがない。だから机上の空論って言われるんだよ。
404名無しさん@お腹いっぱい。:2012/07/29(日) 11:38:14.68
マニュアル3冊のAND取る作業は楽しいかい?
405名無しさん@お腹いっぱい。:2012/07/29(日) 11:46:03.68
当然のごとく複数のシェルのマニュアル参照しながらやってるけど、
煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?

他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
406名無しさん@お腹いっぱい。:2012/07/29(日) 12:15:51.33
末端のプロ(笑い)が家内制手工業でANDとってる姿があわれ。
POSIXがAND取ってくれてるんだからそれを使えばいいのに。
407名無しさん@お腹いっぱい。:2012/07/29(日) 12:19:09.97
>>406
POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
408名無しさん@お腹いっぱい。:2012/07/29(日) 12:19:25.10
また通信系SEプロさんですか
409名無しさん@お腹いっぱい。:2012/07/29(日) 12:21:49.12
posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
410名無しさん@お腹いっぱい。:2012/07/29(日) 12:24:48.99
>>407
動くよ。動かないというなら実例を挙げる事。
411名無しさん@お腹いっぱい。:2012/07/29(日) 12:26:37.54
bash/ksh/zshのバージョンはどうするんだろう?
どれも最新のバージョンを使うこと前提?
412名無しさん@お腹いっぱい。:2012/07/29(日) 12:27:00.63
413名無しさん@お腹いっぱい。:2012/07/29(日) 12:32:10.32
夏、だなぁ

通信業界さんも夏休みですか?
414名無しさん@お腹いっぱい。:2012/07/29(日) 12:43:31.16
>>412
降参ですか?
415名無しさん@お腹いっぱい。:2012/07/29(日) 12:49:36.17
なんでやねん。欲嫁。
416名無しさん@お腹いっぱい。:2012/07/29(日) 12:51:26.75
>>409
見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。

どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
417名無しさん@お腹いっぱい。:2012/07/29(日) 12:51:49.11
POSIXには現物がない。ハイ、ロンパー
覆すにはPOSIX通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
418名無しさん@お腹いっぱい。:2012/07/29(日) 12:53:59.46
ふーむ、3つのシェルのANDとった規格(笑)と合同なシェルは存在するのか?
(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
419名無しさん@お腹いっぱい。:2012/07/29(日) 12:56:27.23
>>418
直接存在しなくても現物シェルのANDで表せるんだからOK。

POSIXの場合は現物シェルのANDでも表せない。
420名無しさん@お腹いっぱい。:2012/07/29(日) 13:16:53.94
その現物シェル達はお前が言い出した条件満たしてないじゃん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)

それともAND規格でのみ動作するとかいうスイッチでもあるのか?
421名無しさん@お腹いっぱい。:2012/07/29(日) 13:22:40.49
むかーし見た流れだな

自称プロ(夏休み中)はスルーでよくねえか
422名無しさん@お腹いっぱい。:2012/07/29(日) 13:25:05.75
>>420
POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。

bash/zsh/kshは現物シェルのANDで表せる。

実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。

POSIXではそれができない。
423名無しさん@お腹いっぱい。:2012/07/29(日) 13:28:30.18
posixか、bash/zsh/kshのand?かで議論されてますが、
/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
424名無しさん@お腹いっぱい。:2012/07/29(日) 13:33:07.06
自分から言い出した条件をあっさり撤回して意味不明の言い訳繰り返す
家内制手工業のプロさん。

> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
425名無しさん@お腹いっぱい。:2012/07/29(日) 13:35:51.04
>>423
v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
426名無しさん@お腹いっぱい。:2012/07/29(日) 13:38:15.67
POSIXには現物がない。ハイ、ロンパー
427名無しさん@お腹いっぱい。:2012/07/29(日) 13:39:10.75
>>424
撤回してないぞ。よくよめ。
428名無しさん@お腹いっぱい。:2012/07/29(日) 13:39:29.54
AND規格には現物がない。はい、ロンパー
429名無しさん@お腹いっぱい。:2012/07/29(日) 13:41:58.86
>>427
bashもzshもkshも全部AND規格(笑)の上位互換
430名無しさん@お腹いっぱい。:2012/07/29(日) 13:43:45.90
>>428
それ以前にPOSIXには現物がないんだから >>428 では論破になってない。

A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
431名無しさん@お腹いっぱい。:2012/07/29(日) 13:52:44.60
>>439
> それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
それ以前にAND規格には現物がないんだから >>426 では論破になってない。

> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが>>426

> A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。

現物がないという条件なら両方同じと言っているだけだ。
432名無しさん@お腹いっぱい。:2012/07/29(日) 14:15:04.40
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
433名無しさん@お腹いっぱい。:2012/07/29(日) 14:43:09.24
>>413
これか、「夏だなぁ厨」ってのは
434名無しさん@お腹いっぱい。:2012/07/29(日) 14:48:40.91
夏はまだ、始まったばかり。
435名無しさん@お腹いっぱい。:2012/07/29(日) 14:50:44.43
>>423
VMwareの上でSolaris2.5を動かして確認してる。
436名無しさん@お腹いっぱい。:2012/07/29(日) 17:01:06.41
AND規格の現物シェルは存在しない。はい、ロンパー
437名無しさん@お腹いっぱい。:2012/07/29(日) 17:07:14.87
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
438名無しさん@お腹いっぱい。:2012/07/29(日) 17:10:50.82
スーパーセットなシェルじゃダメだという主張は引っ込めるのか?
> (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
439名無しさん@お腹いっぱい。:2012/07/29(日) 17:15:25.23
bash/zsh/kshのANDは、現物シェルのANDのスーパーセットじゃなくてイコール。
ハイ、ロンパー
440名無しさん@お腹いっぱい。:2012/07/29(日) 17:25:31.70
>>439
↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?

$ bash script
$ zsh script
$ ksh script
441名無しさん@お腹いっぱい。:2012/07/29(日) 17:36:32.38
ルイージ理論的には違う。はい論破www
442名無しさん@お腹いっぱい。:2012/07/29(日) 17:51:38.94
飽きない?
443名無しさん@お腹いっぱい。:2012/07/29(日) 17:56:40.12
どうでもいいが、$ zsh -y script にするべきだな。
SH_WORD_SPLITを有効にしないと互換性ないよ。
444名無しさん@お腹いっぱい。:2012/07/29(日) 18:10:03.73
うつみみどり
445名無しさん@お腹いっぱい。:2012/07/29(日) 18:31:38.08
ハイハイロンパールームロンパールーム
446名無しさん@お腹いっぱい。:2012/07/29(日) 21:35:16.58
家内制手工業の自称プロはANDとる作業に戻ったらしい。
447名無しさん@お腹いっぱい。:2012/07/29(日) 21:45:10.93
久しぶりに来たら変なの湧いてるな。
ash, bash あたりは POSIXシェルの現物じゃん。
zshは >>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)

基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)

とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
448名無しさん@お腹いっぱい。:2012/07/29(日) 21:47:07.40
bashで書いておいてbashがない環境ならbashをインストールする。
って手段すら取れないような環境にいるやつってどれだけいるんだろ。
449名無しさん@お腹いっぱい。:2012/07/29(日) 21:58:53.44
まあそれで良ければbashでもいいと思うよ。

でも、ちゃんと言語仕様を勉強してれば、POSIX範囲内で書くのも苦じゃ
ないので、bash入れる手間はたいしたことないけど、それも省くために
POSIX範囲内で書くってのもアリでしょ。

もっと多いのはオープンソースでソフトウェアを配布する場合で、
*BSDとかDebianとかはbashが入ってる保証はないから(入れるのは簡単だけどね)、
POSIX範囲内におさまるように(時にはv7 シェル程度でも動くように)書くのが普通。
450名無しさん@お腹いっぱい。:2012/07/29(日) 22:08:43.38
さすがにシェルファンクションないv7はない。
451名無しさん@お腹いっぱい。:2012/07/29(日) 22:13:23.77
まあ自分で普通に書く場合は、それが最低譲れない線だわ。
ただautoconf使う場合は、autoconfマクロでシェル関数を代替できるので、
シェル関数使わずに書くけど。
452名無しさん@お腹いっぱい。:2012/07/29(日) 22:14:29.06
autoconfマクロじゃなくてm4マクロと言うべきか?
まあ意味分かるよね。
453名無しさん@お腹いっぱい。:2012/07/30(月) 06:23:35.06
posixでは、echoには -n -e とかのオプションがない。
常に、-e オプションが付いたような状態で動作しなければならない。
例えば echo 'hoge\c' で改行なしになるとか、
echo -n は -n をそのまま(改行付きで)出力とか。

FreeBSDのashはその仕様に従っていないので、
posixだけ見て書くとechoの部分が正常に動かない。

だからposixには実用性がない。
454名無しさん@お腹いっぱい。:2012/07/30(月) 07:47:46.92
man echo
に、echoはポータビィリティに問題があり、代わりにprintfが使えると書いてる。
455名無しさん@お腹いっぱい。:2012/07/30(月) 07:54:35.33
ばんな
456名無しさん@お腹いっぱい。:2012/07/30(月) 07:56:07.99
>>454
それは知ってるよ。

ashはposixを満たしてると言う主張に対する反論ね。
457名無しさん@お腹いっぱい。:2012/07/30(月) 07:59:52.14
>>454
FreeBSDのashにはprintfが組み込まれてない(外部)ので、
printfの使用はパフォーマンス的にダメージ。
実際、FreeBSDのスクリプトはechoが多用されてる。
458名無しさん@お腹いっぱい。:2012/07/30(月) 08:58:27.43
> 常に、-e オプションが付いたような状態で動作しなければならない。
ダウト。-nは実装依存と書かれているわけだが。
459名無しさん@お腹いっぱい。:2012/07/30(月) 09:33:41.12
>>458
いいや、バックスラッシュ付き文字の解釈は必須。
-n はオプションではないとも明記されてる。
460名無しさん@お腹いっぱい。:2012/07/30(月) 09:49:52.52
実装定義と書かれているわけだが。

A 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.
461名無しさん@お腹いっぱい。:2012/07/30(月) 09:50:58.33
>>458
> -nは実装依存と書かれているわけだが。

実装依存なら使っちゃダメじゃんwww
FreeBSDのrcスクリプトは echo -n バンバン使ってるぞ。
この件だけでも「POSIXだけ守ってれば良い」の反証として十分だよね。
462名無しさん@お腹いっぱい。:2012/07/30(月) 09:54:33.32
echo


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はオプションじゃなく文字列として扱え、
以下の(\)シーケンスを認識しろ、

と書かれてるね。
463名無しさん@お腹いっぱい。:2012/07/30(月) 09:59:16.71
それはここでbash依存の質問をしてくるようなもんw
464名無しさん@お腹いっぱい。:2012/07/30(月) 10:06:31.42
>>461
FreeBSDが使っている事と「POSIXだけ守ってれば良い」は全く独立なわけだが。

>>462
それはSUSv2。POSIXじゃない。
465名無しさん@お腹いっぱい。:2012/07/30(月) 10:07:00.53
お前ら、ちゃんとdashのことも考えろよな
466名無しさん@お腹いっぱい。:2012/07/30(月) 10:14:40.58
>>464
いや、ここでは「POSIXだけ守ってれば良い」が否定されればそれでいいので
もう結論が出たよ。

>それはSUSv2。POSIXじゃない。
いや、POSIXだよ。1997年のだけど。
少なくともこの時点でのPOSIXがこんなことを言ってたんだから、
役に立たないというのも判ろうもの。
467名無しさん@お腹いっぱい。:2012/07/30(月) 10:16:54.62
>>457
> 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 な仕様を利用するのは駄目だが。
468名無しさん@お腹いっぱい。:2012/07/30(月) 10:22:50.67
>>467
>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>んだよ。undefined な仕様を利用するのは駄目だが。

後出し条件追加ですか?w
469名無しさん@お腹いっぱい。:2012/07/30(月) 10:33:03.72
>>それはSUSv2。POSIXじゃない。

> いや、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 って書いてある。
470名無しさん@お腹いっぱい。:2012/07/30(月) 10:40:01.92
>>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>>んだよ。undefined な仕様を利用するのは駄目だが。

> 後出し条件追加ですか?w

オイオイ、規格書の読み方も知らんのか…
もし implementation-defined な仕様の利用が許されないのなら、
そもそも、なんでわざわざそんな仕様を決めるんだよ。
状況が許せば使っていいからに決まってるだろ。
規格書読む上では、implementation-defined と unspecified と undefined の
違いくらい常識だから、勉強しておくように。
471名無しさん@お腹いっぱい。:2012/07/30(月) 10:45:07.83
>>470
論点がずれてるし、そんなこと言ってないよ。

「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
472名無しさん@お腹いっぱい。:2012/07/30(月) 10:51:04.06
>>471

嘘書いておいて、謝罪もなしか、厚顔無恥とはお前のためにあるような
言葉だな。

> 論点がずれてるし、そんなこと言ってないよ。
> 「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。

論点がずれているのは、おまえさんの方。
もともと「POSIXだけ守ってれば良い」っていうのは、
「ポータブルなスクリプトを書く」という目的を達成するための手段の話だ。

FreeBSD の OS 附属のスクリプトなんて、ポータブルである必要がそもそも
全くない。シェルは ash、OS は FreeBSD だけ考えれば十分だ。
だから、POSIX を守る必要なんてそもそもない。
そういうものを挙げて「POSIXだけ守ってれば良い」っていう意見への反論だと
思うってことは、お前がそもそも、何の話をしているのか理解してないって
ことだな。
473名無しさん@お腹いっぱい。:2012/07/30(月) 10:54:17.05
>>472
>だから、POSIX を守る必要なんてそもそもない。


POSIXを守る必要なんてそもそもないんですね、駄目押しありがとう。
474名無しさん@お腹いっぱい。:2012/07/30(月) 11:01:41.95
家内制手工業に従事する自称プロは「POSIXだけ守ってれば良い」とかいう
命題勝手に作り出してそれを強制終了する以外にチンケなプライド守る方法が
無くなってしまったんだよ。

元々の噴飯ものの主張が
>>390
> ・bash/zsh/kshの共通項に合わせる
> か、
> ・純shに合わせる
> かの2択。
それで、共通項は手作業でAND取るんだって。プロwww
これでechoにかかわる非互換はどう解消されるんだろう。
475名無しさん@お腹いっぱい。:2012/07/30(月) 11:03:16.64
なんだ、最初から「FreeBSD でだけ動けば良いスクリプト」の話をしてたのかよ。
そういう限定した話を、OS限定しないスレで明示せずに主張してたのか。
悲しい奴だな。

一応指摘しておくが、たとえ「FreeBSD でだけ動けば良いスクリプト」を書く
場合でも(POSIX を守る『必要』はないが)、「POSIX を読んで理解しておく」
方がいいことは明白だ。
POSIX を参照せず、個々のシェルのマニュアルだけ読んでいるってのは、
C++言語の仕様も知らずに、Visual C++ のマニュアルだけ読んでるってのと
同じで、全く褒められた話じゃないからな。
もちろん、ash/bash/zsh すべてで動くスクリプトを書くつもりがあるのであれば、
たとえ FreeBSD 限定であっても POSIX を読んでおいた方がいい。その方が
知識取得の効率がいいからな。
ash/bash/zsh すべてのマニュアルを読んでおくのも勿論良い姿勢で、これまで
それで済んでいたのは分かるが、効率の点からは POSIX を読まないというのは
損であるとしか言いようがない。まあ自分の時間を無駄にしたいのであれば、
それでも構わんが、一般論としてスレでそれを主張するのはやめとけ。
476名無しさん@お腹いっぱい。:2012/07/30(月) 11:03:31.55
>>474
>これでechoにかかわる非互換はどう解消されるんだろう。

AND取る時点で自動的に解消されてるよ。
477名無しさん@お腹いっぱい。:2012/07/30(月) 11:06:07.21
>>476
はあ?
bash/ksh/zsh/ashで動くスクリプト要求されたらどうするんですかあ?
ANDが空集合だから出来ません。と断るんですか? www
プロは仕事を選ぶ www
478名無しさん@お腹いっぱい。:2012/07/30(月) 11:09:55.97
なんでこうトロくさいやり方に固執するかねえ。まあ、これまで うまく
いってたやり方を続けたいってのは人間の性質としてありがちではあるが。

ちょっと考えれば全部読んでANDするなんて効率悪いことぐらい分かりそうなのに。
エンジニアだったら、時間を効率的に使うことが美徳であることくらい知ってる
だろうに、恥ずかしくならないのかな。
479名無しさん@お腹いっぱい。:2012/07/30(月) 11:11:49.79
>>477
実際にAND取ってみればわかるが、空集合にはならない。
その集合だけでOKの用途の場合はechoを使う。
そうじゃない場合はecho以外の手段を使う。

ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
何の解決にもならない。批判してるのはそういう点だよ。
480名無しさん@お腹いっぱい。:2012/07/30(月) 11:14:59.11
> ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
> 何の解決にもならない。批判してるのはそういう点だよ。

いや、POSIXに従うのであれば printf を使えば解決する。FreeBSD でも動くよ。

まあ FreeBSD 5.X〜8.X では、ちょっと遅いが、それは FreeBSD が一時期、
判断間違えてただけの話(しかも、もう直ってる)。
FreeBSD 5.X〜8.X 固有のマイナーな問題点を、OS を限定しないスレで主張すんな。
481名無しさん@お腹いっぱい。:2012/07/30(月) 11:16:06.92
> その集合だけでOKの用途の場合はechoを使う。
> そうじゃない場合はecho以外の手段を使う。
ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。 www
482名無しさん@お腹いっぱい。:2012/07/30(月) 11:20:56.87
> ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。www

ご苦労さんとしか言いようがないよなあ。
POSIX にズバリそのまま書いてあることを、3つのマニュアルを見比べて、
自分の頭の中でANDするという手間ヒマかけて再発見とか。
まあ、それだけ暇な仕事なんだろう。ある意味うらやましいな。
真似は絶対したくないがw

483名無しさん@お腹いっぱい。:2012/07/30(月) 11:27:08.81
>>477 ってPOSIX読んでないだろ。
指摘されるまで AND取ったら空集合だと思い込んでたみたいだし。
484名無しさん@お腹いっぱい。:2012/07/30(月) 11:48:32.16
>>483
はあ? AND取るのにPOSIXは関係ありませんが。
4つのシェルのANDとるなんてバカな作業はもちろんやったことないですけど。www
485名無しさん@お腹いっぱい。:2012/07/30(月) 11:50:29.32
4つのシェルの仕様のANDをとるのがバカだということは分かるのに、
3つのシェルの仕様のANDをとるのはバカじゃないって思ってんの?
フツー1つの仕様(POSIX)読んで終りだろう、常識的に考えて。
486名無しさん@お腹いっぱい。:2012/07/30(月) 11:54:55.78
>>485
やだなあ。レス番よく追ってよ。僕(>>477)は、3つのシェルの仕様のANDを
取ってる自称プロを弄ってた方だよ。
487名無しさん@お腹いっぱい。:2012/07/30(月) 12:02:20.94
あ、そういうことか。勘違いした。
まあ >>477 の主張はちょっと不明確な気がする。
4つのシェルの仕様のANDとって、空集合になるなんてことはあまりない
(だいたいは代替手段がある)ので、何が言いたいのか分からないな。
4つのシェルの仕様をちゃんと読めば、目的が果たせることには変わりない。
問題なのは、それがとんでもない時間の無駄使いだってことだろう。
488名無しさん@お腹いっぱい。:2012/07/30(月) 12:02:51.87
POSIXでは、echoの引数に -n が(最初に)使われてる場合、
または
バックスラッシュが使われている場合が implementation-defined
と書かれている。

実はこれダウトなんだよ。
bashやzshのechoとか、-E (大文字)も特別扱いするから、(-eもだけど)

echo -E は、POSIXで言うところのimplementation-definedに該当しないはずなのに
ポータビリティーがない。

-E -e の件はPOSIX読んだだけでは書かれていないから、
正確なことを知るには自分でAND取るしかない。
489名無しさん@お腹いっぱい。:2012/07/30(月) 12:08:03.50
うん、今のたいていのシェルはPOSIX準拠だからね。ANDをとればPOSIXになる。
でも、自称プロは自分でANDを取る。 w
延べ数千人のレビューを経たPOSIXより、自分でANDを取った規約の方が上。
490名無しさん@お腹いっぱい。:2012/07/30(月) 12:11:17.53
>>489
延べ数千人のレビューを得ても echo -E / echo -e を見落としたんですか?
491名無しさん@お腹いっぱい。:2012/07/30(月) 12:18:41.90
> -E -e の件はPOSIX読んだだけでは書かれていないから、
> 正確なことを知るには自分で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」は最後でいい。テストでコケるまで参照しなくても
いいくらいに優先順位が低い。

492名無しさん@お腹いっぱい。:2012/07/30(月) 13:58:58.26
むしろFreeBSDやashが排除されるのが合理的。
493名無しさん@お腹いっぱい。:2012/07/30(月) 14:03:07.82
FreeBSDだけやったところで、NetBSD, OpenBSD, DragonflyBSD,
それに Debian GNU/Linux があるぜ。
まあ FreeBSD だけに限っても無理だろうけど。
494名無しさん@お腹いっぱい。:2012/07/30(月) 22:42:54.26
ポータブルなスクリプトを作るってスペースを減らすしかないんじゃないの?
495名無しさん@お腹いっぱい。:2012/07/30(月) 23:13:07.54
んっ…はぁっ、あっ
496名無しさん@お腹いっぱい。:2012/07/31(火) 00:37:56.28
そもそも改行無しのechoなんて使わなきゃいいのに
497名無しさん@お腹いっぱい。:2012/07/31(火) 00:57:04.92
posixシェルを否定する唯一の材料みたいだからね。
ANDとる作業で工数水増ししてるのかもね。w
498名無しさん@お腹いっぱい。:2012/07/31(火) 01:04:07.56
すみませn
""rm
という記述を見たんですが、""ってなんか意味があるんでしょうか?
499名無しさん@お腹いっぱい。:2012/07/31(火) 02:14:35.41
rmがaliasになってるときにaliasを展開しないためじゃないかな
500名無しさん@お腹いっぱい。:2012/07/31(火) 06:30:16.07
シェルスクリプト中で alias使うってすごいな。
501名無しさん@お腹いっぱい。:2012/07/31(火) 12:35:16.71
>>500
だからだろ
502名無しさん@お腹いっぱい。:2012/07/31(火) 12:46:26.03
シェルスクリプト中でジョブコントロールには勝てないだろw
503名無しさん@お腹いっぱい。:2012/07/31(火) 14:19:59.11
ジョブコントロールはふつーに使うでしょ。
なんか重い処理を並列で走らせるときに

cmd1 &
cmd2 &
cmd3 &
wait

みたいな感じで。
504名無しさん@お腹いっぱい。:2012/07/31(火) 14:34:56.99
>>503
それジョブコントロールちゃう。ただのバックグラウンド。

SIGTSTPで止めてバックに回して、
あとで fgしたりするやつ。
505名無しさん@お腹いっぱい。:2012/07/31(火) 15:01:13.63
>>504
節子、を付けるべきだなw
506名無しさん@お腹いっぱい。:2012/07/31(火) 15:07:12.60
バックグラウンドで動かすのもジョブコントロールの一部でしょ。
507名無しさん@お腹いっぱい。:2012/07/31(火) 15:16:47.63
>>506
ちがう。

決定的な違いはプロセスグループIDの処理。
ジョブコントロールの場合は各コマンドのプロセスグループIDを別々にして、
親のシェルからは独立する。ttyの端末プロセスグループIDを
フォアグラウンドプロセスと同一にし、管理を行なう。

一方、ジョブコントロールなしの場合は、fork/execのあと、
単にwaitしないというだけの処理で、プロセスグループIDは親シェルと同じ。
だから、Ctrl-Cで同一プロセスグループIDのプロセスが死なないように
&を付けたコマンドはSIGINTを無視するようにしている。
(ジョブコントロール有りの場合はSIGINTはそのまま無視しない)


ジョブコントロールは、今のシェルなら set +m で無効にできる。
set +m でジョブコントロール無効にした状態でも
& や waitは実行できる。

純正/bin/shにはジョブコントロールがなかったが、
& や waitは当然実行できる。
508名無しさん@お腹いっぱい。:2012/07/31(火) 15:31:33.28
>>499
それって\の方がシンプルだよね?
509名無しさん@お腹いっぱい。:2012/08/01(水) 22:19:00.88
MNT=$(mount | grep "rootfs/proc")
if [ -z "$MNT" ]; then
mount -t proc proc ../rootfs/proc/
fi
この構文は短縮できないんでしょうか
510名無しさん@お腹いっぱい。:2012/08/01(水) 22:22:35.02
>>509
mount | grep -q 'rootfs/proc' && mount -t proc proc ../rootfs/proc
511510:2012/08/01(水) 22:23:46.64
&&ではなく、
|| に。
512509:2012/08/01(水) 22:32:13.39
>>510
ははあー
513名無しさん@お腹いっぱい。:2012/08/02(木) 08:59:36.06
いちいち判定しなくても二重にマウントされることはないんだから、
mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1 || :
でいいじゃね?
514名無しさん@お腹いっぱい。:2012/08/02(木) 09:25:31.26
いちいち||判定しなくても最後のステータスが有効なんだから、
mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1; :
でいいじゃね?
515名無しさん@お腹いっぱい。:2012/08/02(木) 09:28:56.05
書き込んだらセミコロン(;)消えた、、まあ、set -eなんてしてないという前提で。
516名無しさん@お腹いっぱい。:2012/08/02(木) 20:18:32.37
jikken () {
command hoge $@
}
という関数を定義してたんですが

jikken -m "" -n "" unko

というコマンドを実行すると
hoge -m -n unko
というコマンドの実行になってしまうんですよね。
引数をきっちり hoge に渡すには
どうしたらいいんですかね
517名無しさん@お腹いっぱい。:2012/08/02(木) 20:24:44.26
command hoge "$@"
518名無しさん@お腹いっぱい。:2012/08/02(木) 20:29:19.70
>>517
ありがとう
519名無しさん@お腹いっぱい。:2012/08/08(水) 12:58:57.06
bash だと変数の部分文字列を ${a:m:n} で取得できるけど、
同じことを bash の拡張機能を使わず、かつ内部コマンドだけでやる方法ってないかな?

いまは echo $a | cut -c$x-$y でやってるけど、
スクリプト中で何百回と呼ばれていて、これのせいでかなり速度が遅くなっちゃってる。
520名無しさん@お腹いっぱい。:2012/08/08(水) 13:18:46.05
>>519
頭の3文字と後ろの2文字をカットしたい場合、

a=ABCDEFG
b=${a#???}
echo "${b%??}"

みたいにするしかないかな。この例では DE が残る。
521名無しさん@お腹いっぱい。:2012/08/08(水) 14:17:12.55
ありがとう。それは考えたんだけど、位置を数値指定したいんだよね。
? を指定回数数並べた文字列を作るのにまためんどくさい手間がかかるのはちょっと。

とはいえ、やっぱり方法はそれしかないよなぁ。
522名無しさん@お腹いっぱい。:2012/08/08(水) 14:18:52.44
>>521
printf %.5s '??????????????'

で5個の ????? が得られるよ。
523名無しさん@お腹いっぱい。:2012/08/08(水) 14:20:25.24
欲しいのはこっちだろ
printf "%.*s" 5 '?????????????????????????????'
524名無しさん@お腹いっぱい。:2012/08/08(水) 14:24:59.78
>>523
>>522 で合ってる。 %.${a}s にすればいいだけ
525名無しさん@お腹いっぱい。:2012/08/08(水) 14:35:28.32
おお、ありがとです。なんとかなりそうだ。
526名無しさん@お腹いっぱい。:2012/08/08(水) 15:49:08.27
実行速度が3倍になった。ありがとう。
527名無しさん@お腹いっぱい。:2012/08/08(水) 21:33:50.42
名前付きパイプの使い方を修得した (`・ω・´)

一時ファイルの代わりにこれを使えばHDDガリガリしなくて済むんだよね?
528名無しさん@お腹いっぱい。:2012/08/09(木) 00:33:59.19
まあその通りだが、いまのシェルだと
diff -u <(ls /old) <(ls /new)
とかできるから、わざわざ名前つけたりは、ほとんどしなくなったなあ。
529名無しさん@お腹いっぱい。:2012/08/09(木) 06:48:33.30
>>528 のことを「名前付きパイプ」って呼んでる可能性もあるわけで・・
(mkfifoのことじゃなくて)
530名無しさん@お腹いっぱい。:2012/08/09(木) 10:01:01.43
そうだとすると言葉の誤用なので (実装は pipe(2)でできるし)、
それはないと思いたいところだけどなあ。どうだろね。
531名無しさん@お腹いっぱい。:2012/08/09(木) 10:45:19.41
>>530
実装依存だな。(言葉の誤用ではない)
FreeBSDだと本当にnamed pipeで実装されてるよ。

bash$ file <(:)
/tmp/sh-np-4033202023: fifo (named pipe)
532名無しさん@お腹いっぱい。:2012/08/09(木) 10:57:37.18
コマンドがパス名を必要としている引数位置で使うのに、
どうやってnamed pipe以外で実装するんだよ。
533名無しさん@お腹いっぱい。:2012/08/09(木) 10:59:51.72
>>532
Linuxだと、普通のpipeで実装して、それを/dev/fd/n(/proc/self/fd/n)経由で参照する 。
だからnamed pipeにする必要はない。
534名無しさん@お腹いっぱい。:2012/08/09(木) 11:09:46.25
Named pipeの後始末は誰がする?
535名無しさん@お腹いっぱい。:2012/08/09(木) 11:47:08.57
私自らが処罰を与える
536名無しさん@お腹いっぱい。:2012/08/09(木) 11:49:03.21
>>531
いや、実装依存だから、名前の誤用なんだよ。
「<(コマンド)」の実装に常に named pipe が必要ならばともかく、
pipe(2) で実装されたり named pipe で実装されたりするものを、
named pipe って呼んじゃ駄目でしょ。
537名無しさん@お腹いっぱい。:2012/08/09(木) 11:50:51.69
>>534
「<(コマンド)」の場合なら、これを解釈するシェルが始末する。

自力で named pipe 作ってるシェルスクリプトなら、ふつうは
そのスクリプトの中で trap とか使ってやるんじゃない?
(named pipe の目的にもよるので状況によりけりだけど)
538名無しさん@お腹いっぱい。:2012/08/09(木) 12:06:58.48
>>536
もともと「named pipeを自動で」という設計思想で設計されたものだから、
結果の実装がどうあれ、named pipeと呼んで良い。
539名無しさん@お腹いっぱい。:2012/08/09(木) 12:13:15.06
>>527がおいてけぼりになっとる。
540名無しさん@お腹いっぱい。:2012/08/09(木) 12:23:57.33
上の例だとdiff終了時点でshellが削除だろうね。
541名無しさん@お腹いっぱい。:2012/08/09(木) 12:31:51.13
全子孫が終了するまで削除しちゃだめだよね。

こんなのとか
daemon hoge <(hage)
542名無しさん@お腹いっぱい。:2012/08/09(木) 13:19:33.96
>>538
え、そんなの初めて聞いたぞ。

「"named pipe" "shell script"」でググって出てくる上位5サイトに
「<(コマンド)」や「>(コマンド)」の話が、チラっとも出てこない
ことからして、君の組織だけで生まれたローカルな用法なんじゃねえ?
543名無しさん@お腹いっぱい。:2012/08/09(木) 13:32:16.61
プロセス置換 (process substitution) がサポートされるのは、 名前付きパイプ (FIFO) または ファイル・ディスクリプターの /dev/fd 形式での指定 をサポートしているシステムです。
544名無しさん@お腹いっぱい。:2012/08/09(木) 13:35:52.74
UNIX domain socketでも何とかなるでしょ。
545名無しさん@お腹いっぱい。:2012/08/09(木) 13:40:06.41
>>543はbashのman page
546名無しさん@お腹いっぱい。:2012/08/09(木) 13:40:10.34
>>544
UNIX domain socketでは、そのファイル名を渡されたコマンド側が
open()でオープンできないから無理。
547名無しさん@お腹いっぱい。:2012/08/09(木) 13:41:12.87
>>544
openできないからだめ。
548名無しさん@お腹いっぱい。:2012/08/09(木) 14:21:53.82
>>543
「コマンド置換」と、
「名前つきパイプ または ファイル・ディスクリプターの /dev/fd 形式での指定」が、
きちんと分離して書かれてるね。

しかも、名前つきパイプが使えることと、コマンド置換が使えることは等価ではない
(ファイル・ディスクリプターの /dev/fd 形式での指定ができればコマンド置換が
使える)ことも明確に書かれている。

ますます >>538 が、何を読んで、コマンド置換のことを名前つきパイプだと
思い込んだのか知りたくなるな。まさか >>543 の文章じゃないよな。
549548:2012/08/09(木) 14:26:25.67
s/コマンド置換/プロセス置換/
だった。
550名無しさん@お腹いっぱい。:2012/08/09(木) 14:26:36.71
初期のshellは”コマンド置換”的な文法だったと「UNIX原典」にあった。
551名無しさん@お腹いっぱい。:2012/08/09(木) 14:27:37.29
>>548
「コマンド置換」??www

いつの間にコマンド置換に話になったんだよw

プロセス置換を理解していない無知自慢かよwww
552名無しさん@お腹いっぱい。:2012/08/09(木) 15:34:32.97
<( … )の形でパイプが使えると知らなかったときは
/dev/shmに一時ファイル作ってガリガリ言わんようにしてたな
他に何も代わりの方法を思いつかなかったからだが

パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
最近マルチコアが当たり前だし、キャッシュも利くだろうから、
一時ファイル作る方が速く処理が終わるかもしれん
553名無しさん@お腹いっぱい。:2012/08/09(木) 15:52:20.68
>>552
> パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
でかい出力処理 | less
とかやったことないの?

> 最近マルチコアが当たり前

> 一時ファイル作る方が速く
が、全然つながんねえ
554名無しさん@お腹いっぱい。:2012/08/09(木) 15:56:31.53
> > 最近マルチコアが当たり前
> と
> > 一時ファイル作る方が速く
> が、全然つながんねえ

だね。
名前つき/なしに関わらず、パイプやソケットならマルチコアで
並列に動く可能性がある(マルチコアを生かせる)けど、
ファイル経由してたら、シングルコアと性能変わらん。

>>551
で、結局、「プロセス置換のことを、named pipe と呼ぶ」っていうのは
どこかの組織のローカルルールの話だったってことで OK?
世の中に広まってる話なら、ソースよろ

555名無しさん@お腹いっぱい。:2012/08/09(木) 16:12:16.26
>>554
ggrks
556名無しさん@お腹いっぱい。: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回ぐらいあるような感じなんですが、
これってなんでなんですか。
557名無しさん@お腹いっぱい。:2012/08/09(木) 16:26:30.18
readの次に
sleep 0.5
とか入れてみればほぼ100%再現するよ
558名無しさん@お腹いっぱい。:2012/08/09(木) 16:28:06.39
>>555
答えられないのね。
559名無しさん@お腹いっぱい。:2012/08/09(木) 16:29:35.46
>>557
うん、そうなんですよね。どういうことなんでしょうか。
ていうか、プログラムのコピペミスってますね、さーせん。
560名無しさん@お腹いっぱい。:2012/08/09(木) 16:33:00.69
あぁ、sleep中に打ち込んでるからってことでしょうか。なるほろ×2。
本当にありがとうございました。
561名無しさん@お腹いっぱい。:2012/08/09(木) 16:36:14.11
>>555
グーグルは存在の検索はできるが、非存在の検索は出来ない。
562名無しさん@お腹いっぱい。:2012/08/09(木) 16:36:26.28
いや、でもやっぱりそれっておかしくねえ?
readの変数への代入がwhileループ始まるより遅いってこと?
563名無しさん@お腹いっぱい。:2012/08/09(木) 16:38:02.93
あぁ、おかしくないか、打ちこんでる間のタイムアウトの方が早くて次のループに入ってるだけの話か。そういうことっすよね?
本当にありがとうございました。
564名無しさん@お腹いっぱい。:2012/08/09(木) 16:38:42.42
改行して、whileで一度中に入って、時刻表示して、次のreadで取り込まれて、while抜ける
565名無しさん@お腹いっぱい。:2012/08/09(木) 16:39:14.15
>>562
変数への代入じゃなくて、
read実行開始時に端末のバッファをフラッシュする関係で
直前のEnterを取りこぼすということ。
566名無しさん@お腹いっぱい。:2012/08/09(木) 16:42:25.90
>>565
いや、それは違うだろ
567名無しさん@お腹いっぱい。:2012/08/09(木) 16:45:15.73
read -t 0.01 とか sleep 0.5 とか、Linux限定全開ですな
568名無しさん@お腹いっぱい。:2012/08/09(木) 16:47:58.63
昔gccがgasにpipeで渡すか、それとも一時ファイルかという議論があった時は、
性能評価のレポートによりpipeで渡す方が効率が良いということになった。
もちろんSSDが主流になるといろいろと変わってくると思われるが。
569名無しさん@お腹いっぱい。:2012/08/09(木) 16:49:47.73
read -t は駄目だけど、sleep 0.5 は *BSD でも動くよ。
まあどっちも POSIX 外で、移植性はないけどな。
570名無しさん@お腹いっぱい。:2012/08/09(木) 16:52:50.82
zsh限定って最初から断わってんだから、read -t も有り
571名無しさん@お腹いっぱい。:2012/08/09(木) 16:55:46.68
sleepってビルトイン関数じゃないからzsh関係ないような。
572名無しさん@お腹いっぱい。:2012/08/09(木) 17:02:39.79
だからー
sleep 0.5 は *BSD で可なので、Linux限定ではない
read -t は zsh で可なので、Linux限定ではない
573556:2012/08/09(木) 17:18:27.14
-tの時間を少なくしていくと、
While文の条件判定の所で一番時間が掛かるようになっていって、
そこの間でEnterを打ち込むから、echoが二度効いてしまうように見えるってことかな?

最初はecho中にEnterが効いてるからと思ったけど、それならWhileループに二度目突入しないものね。
574名無しさん@お腹いっぱい。:2012/08/09(木) 17:25:58.46
readがタイムアウトした瞬間から、
echoの最初の文字を出力する瞬間までの、どこでもありうるね
echoが二度効いてるんじゃなくて、Enterで次の行に行っちゃったから、
そこにechoしてるだけ。
575名無しさん@お腹いっぱい。:2012/08/09(木) 17:58:01.77
世界最強ってところには誰も突っこまないのか。
576名無しさん@お腹いっぱい。:2012/08/09(木) 18:20:53.39
そこつっこんでも面白くならない。
577名無しさん@お腹いっぱい。:2012/08/09(木) 18:38:20.10
突っ込まれたくないなら世界で2番目くらいに強いって言っとけばいい

所で、時計なのに一定時間待つって処理でいいの?タイマ設定してシグナル送ってもらった方が正確じゃね
578556:2012/08/09(木) 18:59:37.13
command-line clock v2 - Pastebin.com
http://pastebin.com/nRfEbSZF

ちょっと改変して、コマンドのreturnの値を条件式として使うように、
こんな風にしてみました。

でも、こうしても-tの値を減少させていくと、二重にechoってるようになるのが
どうしても解せません。なんでだよ!さすがにおかしいだろ!
やっぱり順次処理されてないのでは?

>>577
そんな格好いいのが出来るなら、敗北は認めなければなりませんね。
そこに美しさがあれば世界金メダルは譲ります。
579名無しさん@お腹いっぱい。:2012/08/09(木) 19:02:59.50
readでタイムアウトしてからechoまで0秒じゃないんだから、
そこでEnter打ったらなるんだよ
echoの前に sleep 入れてみたら確認できるだろ
580556:2012/08/09(木) 19:06:32.81
>>579
あ、前のechoが残ってるのか、
どうやらオバカさん世界一の金メダルは私のもののようですね。ふっふっふっ。

本当にどうもありがとうございました。
581名無しさん@お腹いっぱい。:2012/08/09(木) 19:18:48.76
てゆーか、この程度なら、別に zsh の read -t とか、
BSD&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
582名無しさん@お腹いっぱい。:2012/08/09(木) 19:25:37.74
sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、
1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?
583名無しさん@お腹いっぱい。:2012/08/09(木) 19:26:03.35
>>581
せっかくそこまでするなら $( ) は ` ` にすべき。
584名無しさん@お腹いっぱい。:2012/08/09(木) 19:35:13.63
> sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、
> 1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?

対話的シェルにリアルタイム保証なんてないから、read -t の時刻指定を
いくら細かくしたところで、マシン負荷が高くなれば、2秒どころかもっと
進む可能性はあるよ。そういう、対話的シェルで実現困難な仕様は、そもそも
盛り込むべきじゃないだろう。

ちょっとの負荷で2秒とびが嫌だっていうなら、拡張sleepに依存して
sleep 1 を sleep 0.9 ぐらいにするって手は、まあないわけではない。
read -t や sleep で指定する秒数をあまり小さくすると、無駄なマシン負荷が
増えるので、あまり小さくするのは推奨せんが。

>>583
Solaris の古いシェルとかで動かすことも考慮するなら、その通りだな。
まあ、そこは常識で分かると判断した。
585名無しさん@お腹いっぱい。:2012/08/09(木) 19:36:24.68
それをいっちゃあ、リアルタイムOSじゃないのに、xclockとかありえんって話になる
586名無しさん@お腹いっぱい。:2012/08/09(木) 19:39:33.95
date +%N で現在時刻のナノ秒を取得して、
それを sleep 0.123 とかの小数点以下に(計算の上)反映すれば
無駄にプロセスを使わずにうまく同期できるのでは?
587名無しさん@お腹いっぱい。:2012/08/09(木) 19:41:11.55
逆逆。
リアルタイムOSじゃないので、xclockだって、更新間隔が1秒より大きくなる
こともある。それが仕様。
xclock にだって不可能なことを、シェルスクリプトに求めるなんて、そもそも
そういう要求自体がおかしいってこと。
588名無しさん@お腹いっぱい。:2012/08/09(木) 19:43:59.25
>>586
高負荷時のことを考慮に入れるのなら、そんなんじゃ全くもって無理。

鯆管って、ほんとリアルタイム処理を分かってないなーって言っちゃうよ。
ちゃんと考えてみなよ。

どうしても分かんなければ説明するので、その場合は降参と宣言することw
589名無しさん@お腹いっぱい。:2012/08/09(木) 19:46:52.91
よし降参だ説明くれ
590名無しさん@お腹いっぱい。:2012/08/09(木) 19:47:45.98
>>588
高負荷時のことはどうでも良くて、
位相的にきっちり合わせたいということでしょ。

非同期で突然 sleep 1 を whileループで回せば、
最初から誤差が最大 0.99999... 秒になる。
これを、毎回 date +%N で 1秒未満の残り時間を把握しつつ
sleep 0.9821 とかすれば「位相」が同期する。
591556:2012/08/09(木) 19:50:02.71
>>581
つーか、これでいいっすね。&使ってバックグラウンドに回しても表示効くのね。
しかもそいつをreadでインプット待ちにしておいて、インプット来たら殺すとかすげー。
でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
バックグラウンドジョブにしてるから?わかる人本当にお願いします。

>>582
そういう意図はありまくりんぐでしたけど、>>581さんのやり方でsleepの時間をさらに小さくするだけでいいように思います。負荷との兼ね合いですが。
592名無しさん@お腹いっぱい。:2012/08/09(木) 19:53:13.20
>>589
答えは、
 高負荷時には、date +%N の実行だけで数秒ないしそれ以上の
 時間がかかることがあるから
だ。

分かりやすい例でいうと、メモリが溢れていて、date コマンド
どころか、シェルまで swap に追い出されていて、スラッシング
しまくりの状況を考えてみるといい。

たとえメモリが足りててても、CPUその他のリソースが足りてなければ
数秒程度の遅延は普通に起こる。

まあ、鯆管的には、そんなに高負荷になる前にリソースなりマシンなりを
増やせってことになるので気にしてないだろうが、高負荷を気にしないなら
sleep 0.9 でも十分だ。

>>590
なるほど。
そういう意図であれば、確かに拡張sleepに依存するのもいいな。
593名無しさん@お腹いっぱい。:2012/08/09(木) 19:59:25.40
>>591
> でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。

read と kill の間に、時間のかかるdateみたいな処理がないから、
その間にechoが動いてしまう可能性が確率的に非常に少ない。
そこにダミーのsleepでも入れれば二重表示にできるよ。
594名無しさん@お腹いっぱい。:2012/08/09(木) 20:01:56.63
>>593 の言う通りだ。

read x
sleep 1
kill $pid

に変更すれば、二重表示が簡単に確認できる。
595556:2012/08/09(木) 20:12:11.80
>>593>>594
おぉ、本当だ。お前らかっこいいなぁ。ワクワクさん並に輝いてるわ。

どうも本当にありがとうございました。
596527:2012/08/09(木) 21:43:53.53
後始末について聞いてみたかったんだけど
やめといたほうがいいのかな… (; ・ω・)
597名無しさん@お腹いっぱい。:2012/08/09(木) 21:56:40.30
終了したからいいよね。named pipeだった時の
>>541の後始末のタイミングは?
598名無しさん@お腹いっぱい。:2012/08/09(木) 22:20:41.64
よく知らんけど、たぶん、named pipe を使ったプロセス置換の実装の場合、
>>541 は、うまく動かない可能性もあるんじゃないかな。
まだ使用する前なのに消されてしまうことがあると予想。

ただ、コマンド hoge が既に named pipe をオープンし終えていれば、
ディレクトリツリーから named pipe が消されても、named pipe の実体は
残っている。その場合は動く。
というわけで、これは 消される前にオープンできるか否かという
race condition があるケースであり、うまいこと動くこともあるとは思う。

named pipe ではなく、pipe と /dev/fd/ を使った実装なら、
そういう race condition なしで動くだろうけど。
599名無しさん@お腹いっぱい。:2012/08/09(木) 22:32:03.31
>>598
<(...) や >(...) が named pipeで実装されてるFreeBSDのbashでちょっと
試してみたが、daemonみたいに子が先にexitして孫が残るケースでも無問題。

どうやら、named pipeに対する読み手と書き手が揃ってパイプがつながった段階で
unlink(2)される模様。プロセス実行中に先にunlinkされてる。
600名無しさん@お腹いっぱい。:2012/08/09(木) 22:34:14.50
検証どうも。
以外な結果だなあ。
孫が、引数をオープンする前に、たとえば10秒くらい待つような場合、
named pipe を管理するシェルはずっと待機しているってこと?
601名無しさん@お腹いっぱい。: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);
}
}
602名無しさん@お腹いっぱい。:2012/08/09(木) 22:39:20.34
>>600
読み手と書き手が揃わない場合は、named pipe は放置されるww

例えば、
bash$ ls <(:)
bash$ exit

なんてやると、lsコマンドも :コマンドもnamed pipeにアクセスしないから、
/tmp/np-sh-XXXXX みたいなファイルが残ったまま bashが終了できてしまう。
bash終了時にはunlinkしないみたい。
603名無しさん@お腹いっぱい。:2012/08/09(木) 22:42:25.58
cat <(ls)
でも残るんだが
604名無しさん@お腹いっぱい。:2012/08/09(木) 22:42:51.12
> 読み手と書き手が揃わない場合は、named pipe は放置されるww

これはひどいw
FreeBSD でも /dev/fd/ が実際にはあるわけだから、named pipe じゃ
なくて、そっち使うように直した方がいいんじゃ。
605名無しさん@お腹いっぱい。:2012/08/09(木) 22:46:21.67
>>603
残らないよ。(bash/FreeBSDで)
606名無しさん@お腹いっぱい。:2012/08/09(木) 22:48:04.29
> cat <(ls)
> でも残るんだが

FreeBSD-7.3 + bash-4.0.24 の組合せで確認した。
確かに /var/tmp/sh-np-数字 という名称で残る。

>>605
バージョンは?
607名無しさん@お腹いっぱい。:2012/08/09(木) 22:50:00.77
>>604

ls /dev/fd 3< file

↑これとか実行してみるとわかるが、
FreeBSDの /dev/fd は、0 1 2 しかファイル記述子に対応してない。(3以降ダメ)
608名無しさん@お腹いっぱい。:2012/08/09(木) 22:50:56.70
>>606
FreeBSD-8.1 bash-4.1.7
609名無しさん@お腹いっぱい。:2012/08/09(木) 22:55:26.55
>>607
マジか、知らなかった… が、確かにそのようだ。確認した。
NetBSD あたりから動く実装持ってくればいいのに。
NetBSD の方では、zsh も bash も /dev/fd/ 使ってる。
610名無しさん@お腹いっぱい。:2012/08/09(木) 22:58:20.47
bash-4.2.37/FreeBSD-9.0だけど残る
611名無しさん@お腹いっぱい。:2012/08/09(木) 23:02:10.30
よくよく確認したら、3以上のディスクリプタについても、
FreeBSD-4.3 なら動いたよ。
/dev/fd/* の実体はキャラクタ型のデバイス・ファイルなので、
デバイス自体はたぶん FreeBSD-7 でも動くんじゃないかな。

つまり、devfs 導入時にデグレったんだ、これ。
612名無しさん@お腹いっぱい。:2012/08/09(木) 23:05:07.38
FreeBSD-7.3 上で bash-4.2 の配布物そのままを野良ビルドしてみたが、
やっぱり named pipe が /var/tmp/ に残るね。
bash のバージョンの違いが原因ではなさそう。
613名無しさん@お腹いっぱい。:2012/08/09(木) 23:10:05.47
残らないという環境の>>608は、何が原因なんだろう
そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?
614名無しさん@お腹いっぱい。:2012/08/09(木) 23:14:54.36
> そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?

そう、自分もそれが疑問だった。
kqueue(2) にはそういう機能なさそうだから、無理じゃないか。

まあ kdump(1) と同じことするって手がないわけじゃないが、
bash のやるようなことじゃない。
615名無しさん@お腹いっぱい。:2012/08/09(木) 23:14:56.99
>>613
オレもそれ考えてたんだけど、
named pipeに対して select(2)してパイプがつながったかどうか検出してるとか。
616名無しさん@お腹いっぱい。:2012/08/09(木) 23:15:48.98
cat <(ls) して、しばらくほっといたら消えた!
617名無しさん@お腹いっぱい。:2012/08/09(木) 23:16:35.39
読み手が繋がったことは、それじゃ分からないよ。
書き手についても、書き込みが起こるか、あるいは書き込みオープン後クローズ
されれば分かるけど、書き込みオープンされただけじゃ分からない。
618名無しさん@お腹いっぱい。:2012/08/09(木) 23:41:09.94
bash-4.2.37/FreeBSD-9.0だけど

cat <(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が読まれたかどうかを確認していることになる。

どうやってかは知らない。
619名無しさん@お腹いっぱい。:2012/08/09(木) 23:51:57.74
そもそも残ってることって問題か?/tmp 以下なら再起動で消えそうだけど
別の話だけど、名前付きパイプだと全く関係の無い別のプロセスからも
読み書きできるから大丈夫なのって思う
620名無しさん@お腹いっぱい。:2012/08/09(木) 23:58:35.21
パーミッションが自分にしか出てないからいいんじゃない?
621名無しさん@お腹いっぱい。:2012/08/10(金) 00:09:04.36
>>609
kldload fdescfs
622名無しさん@お腹いっぱい。:2012/08/10(金) 00:39:28.35
dbus-*地獄とか勘弁w
623名無しさん@お腹いっぱい。:2012/08/10(金) 01:00:01.40
/var/tmpだから再起動じゃ消えない。
頻繁に呼ばれるCGIとかでこれが起きたらやっぱりやだよ。
624名無しさん@お腹いっぱい。:2012/08/10(金) 01:06:07.46
bashのソース(subst.c)読んだ。自分用まとめ。

・ <(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する。
625名無しさん@お腹いっぱい。:2012/08/10(金) 01:13:15.04
bash実装の場合、ソース読むと、
コマンド列の最後のコマンド終了した時に消してるみたい。
626名無しさん@お腹いっぱい。:2012/08/10(金) 01:18:16.27
そだね。
cat <(ls)
だと、子シェルが死ぬタイミングがちょっと遅れるみたいで、
直後にはfifoがunlinkされない。
cat <(ls); sleep 1
だと、確実に残らない。
627名無しさん@お腹いっぱい。:2012/08/10(金) 01:19:10.77
結論としてnamed pipe版プロセス置換はカス。でいい?
628名無しさん@お腹いっぱい。:2012/08/10(金) 01:21:11.65
>>627
OK! おやすみ!
629名無しさん@お腹いっぱい。:2012/08/10(金) 01:34:51.13
最近のFreeBSDではmount -t fdescfs fdescfs /dev/fd
してからbashを作るとpipe+/dev/fdで作成される。
630名無しさん@お腹いっぱい。:2012/08/10(金) 01:39:01.51
>>629
コンパイル時決め打ちだからちょっとまずいね。
631名無しさん@お腹いっぱい。:2012/08/10(金) 01:58:31.64
send-prしといて
632名無しさん@お腹いっぱい。:2012/08/10(金) 07:29:33.75
質問させてください。

現在、'nc -l 12345'コマンドを発行し、それに対しsocket通信を行い、期待した通信が行われているか確認しています。
しかし、上記コマンドでは1回closeしてしまうと、上記コマンドも終了してしまいます。
連続的にsocket通信を行い、期待した結果が入っているかチェックを行いたかったので、以下のようなスクリプトを書きました

while :
do
  `nc -l 12345`
done

しかし、上記を実行して、socket通信を行うと、なぜか、送信したデータを表示するのではなく、実行しようとして、エラーメッセージが出ます
socket通信を受けるたびに、nc -l... コマンドを発行し通信内容を表示するにはどうすればいいのでしょうか?

よろしくお願いいたします。



633名無しさん@お腹いっぱい。:2012/08/10(金) 07:34:47.58
>>632

` ` が余計だろ。
634名無しさん@お腹いっぱい。:2012/08/10(金) 07:57:12.67
>>632
わざわざシェルスクリプトにしなくても、

nc -k -l 12345

を発行(笑)すればcloseしても終了しないよ。
635名無しさん@お腹いっぱい。:2012/08/10(金) 13:05:30.89
発行って言葉使っちゃいかんの?
636名無しさん@お腹いっぱい。:2012/08/10(金) 13:07:59.84
コマンドは普通は「実行」する。
637名無しさん@お腹いっぱい。:2012/08/10(金) 13:23:20.11
起動だな
638名無しさん@お腹いっぱい。:2012/08/10(金) 13:32:30.35
execute
639名無しさん@お腹いっぱい。:2012/08/10(金) 13:39:44.13
起動は終了を伴わないdaemonプロセスのような場合。

> nc -k -l 12345
に使うのは正しいが、

> を起動
とは使わない。
> のように起動
640名無しさん@お腹いっぱい。:2012/08/10(金) 13:49:30.52
>>639
ktkr
641名無しさん@お腹いっぱい。:2012/08/10(金) 14:01:15.32
コマンドラインで打つならinvokeってのもあるんだぜ。
issueは機械語命令レベルならアリだけどな。
642名無しさん@お腹いっぱい。:2012/08/10(金) 14:24:21.06
そういえば命令は発行するもんだな。
643名無しさん@お腹いっぱい。:2012/08/10(金) 15:47:16.98
汎用機やDBの世界はjobをissueする。
644名無しさん@お腹いっぱい。:2012/08/10(金) 17:51:11.83
>>624, >>625



> ・ fifoのwrite openは、readするプロセスがいなければブロックされる。

そうか、これで read 側のオープンを検知できるのね。勉強になった。
この named pipe を使わう場合の実装、面倒臭そうだなー。


645名無しさん@お腹いっぱい。:2012/08/10(金) 18:01:48.99
検知というかブロックね。
646名無しさん@お腹いっぱい。:2012/08/10(金) 18:03:28.19
>>645
open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。
647名無しさん@お腹いっぱい。:2012/08/10(金) 18:04:12.63
>>645
なにいってんの?
read側のオープンをブロックするって何?
648名無しさん@お腹いっぱい。:2012/08/10(金) 18:04:46.74
fdescfsって何故デフォで有効になってないの? 何か問題あるの?
procfsがデフォで有効になってないこととも関係ある?
649名無しさん@お腹いっぱい。:2012/08/10(金) 18:07:24.02
>>646
O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。
650名無しさん@お腹いっぱい。:2012/08/10(金) 18:16:22.36
bashは書込みopenでO_NONBLOCKつけてないよ。
相手が読出しopenしてブロック解除されたことで「検出」してる。
651名無しさん@お腹いっぱい。:2012/08/10(金) 18:33:26.93
cmd1 <(cmd2)
だと
1. named pipe作成
2. 読み出しオープン→cmd1実行
3. 書き込みオープン→cmd2実行
こんな順のはず。SIGPIPE/EPIPE食らわないように。
652名無しさん@お腹いっぱい。:2012/08/10(金) 19:26:29.50
>>648
procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。
653名無しさん@お腹いっぱい。:2012/08/10(金) 19:36:16.75
どうぞどうぞ
654名無しさん@お腹いっぱい。:2012/08/10(金) 19:52:21.85
> procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。

またそういう嘘をつかないように。
/proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。
*BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。
655名無しさん@お腹いっぱい。:2012/08/10(金) 20:09:40.36
発祥について言ってるんじゃなくて、
FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。
Linuxとは違って各コマンドが /procに依存してない。
だから今のFreeBSDは /procを外す方向でしょ。
fdescfsの方は知らんけど。
656名無しさん@お腹いっぱい。:2012/08/10(金) 20:13:34.09
FreeBSDって何で/procデフォルトでマウントしないんだろうか。
FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。
Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。
657名無しさん@お腹いっぱい。:2012/08/10(金) 20:14:23.29
>>652のような街頭演説はFreeBSDのスレでどうぞ。
658名無しさん@お腹いっぱい。:2012/08/10(金) 20:24:09.55
NetBSDの場合、/procよりptrace(2)の方が効率いいから/proc積極的に使う
意味ないじゃんみたいなことを偉い人が言ったせいだって話を、どっかで
誰かが書いてたような気がする。
NetBSDは昔っから/procはマウントしてない。

で、fdescfs使うかどうかはあまり問題じゃなくて、/dev/fd/*がちゃんと
使えればそれでいいんだと思うよ。devfs登場前のFreeBSDとか、NetBSDとかは
fdescfsなしでも/dev/fd/*が、まあまあちゃんと使えたわけで、だったら
fdescfsなしでもいいじゃんみたいな発想だと思う。
devfs導入時に、/dev/fd/*が中途半端な状態になっちゃった(3未満の
ディスクリプタに対してしか動かなくなった)のが真の問題でしょう。
サポートしないつもりなら/dev/fd/*を削った方がいいし、サポートする
つもりなら、もうちょっとなんとかした方が。
659名無しさん@お腹いっぱい。:2012/08/10(金) 20:27:13.36
だからsend-prを!
660名無しさん@お腹いっぱい。:2012/08/10(金) 20:28:39.42
/procとptrace(2)じゃほとんど機能かぶらないけど…
661名無しさん@お腹いっぱい。:2012/08/10(金) 20:33:35.24
ストリーム読んでパースするより構造体で取得できるsysctlの方がrobust
662名無しさん@お腹いっぱい。:2012/08/10(金) 20:35:08.85
>>660
ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。

ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。
663名無しさん@お腹いっぱい。:2012/08/10(金) 20:37:40.19
>>661
NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。
664名無しさん@お腹いっぱい。:2012/08/10(金) 20:41:55.71
ptrace(2)する代わりに/procでioctlする糞インターフェースは死んだも同然じゃん。
/procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。
665名無しさん@お腹いっぱい。:2012/08/10(金) 20:46:25.76
>>663
それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。
666名無しさん@お腹いっぱい。:2012/08/10(金) 20:47:55.89
procfsとfdescfsの話題は混ぜるな危険。
667名無しさん@お腹いっぱい。:2012/08/10(金) 20:50:45.89
/proc/cpuinfoとか無理すぎ。
process関係ないw
processorじゃ!とかなしよん
668663:2012/08/10(金) 20:52:29.93
>>665

それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。
669名無しさん@お腹いっぱい。:2012/08/10(金) 20:55:14.28
>>667
さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。
670名無しさん@お腹いっぱい。:2012/08/10(金) 20:59:10.47
sysctlのように型がかっちり決まってるのもいいけど、
/proc, /sysみたいにテキストになってるもの素敵やん。
671名無しさん@お腹いっぱい。:2012/08/11(土) 00:12:39.76
>>670
スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
672名無しさん@お腹いっぱい。:2012/08/11(土) 00:20:16.15
性能重視じゃないスクリプトなら
中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね
673名無しさん@お腹いっぱい。:2012/08/11(土) 01:49:37.99
sysctlコマンドなんて、まさにそういう中継用コマンドだな。
/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
674名無しさん@お腹いっぱい。:2012/08/14(火) 03:35:46.04
PS1っていう環境変数は
bashだけのものですか?
他のシェルでも使える?
675名無しさん@お腹いっぱい。:2012/08/14(火) 09:38:22.60
PS1とPS2はすべてのシェル共通。PS3 PS4はbashとかのみ。

ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
676名無しさん@お腹いっぱい。:2012/08/14(火) 20:07:54.88
標準入力からzipする場合のファイル名って変えられないでしょうか?

echo abcde | zip test.zip -

ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
677名無しさん@お腹いっぱい。:2012/08/14(火) 20:15:26.80
ln -s /dev/stdin hoge.txt
echo abcde | zip test.zip hoge.txt

とか。symlinkは許せ。
678名無しさん@お腹いっぱい。:2012/08/14(火) 22:50:08.33
>>677
希望が見えました。ありがとう。
679名無しさん@お腹いっぱい。:2012/08/14(火) 23:00:48.31
zip扱うライブラリがperlやpythonにある。そういうの使うと簡単。
680名無しさん@お腹いっぱい。:2012/08/15(水) 05:39:00.88
>>677
普通にtemporaryファイルつくって消したら?
681名無しさん@お腹いっぱい。:2012/08/15(水) 06:50:20.97
なんの役にも立たない >>680 をわざわざ書く意味がわからん
682名無しさん@お腹いっぱい。:2012/08/16(木) 00:43:00.83
例えばVAR=`df- h` というような場合に
echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
683名無しさん@お腹いっぱい。:2012/08/16(木) 00:47:05.41
echo "$VAR"

って最近似たような質問見たような。
684名無しさん@お腹いっぱい。:2012/08/16(木) 01:01:11.89
>>683
すいません、""の存在をすっかり忘れていました。
ありがとうございました。
685名無しさん@お腹いっぱい。:2012/08/16(木) 13:52:12.32
演算結果を変数に入れるにはどうしたらよいか
echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?
686名無しさん@お腹いっぱい。:2012/08/16(木) 13:57:08.74
>>685
$ A=$((91-72))
$ echo $A
19

できてるけど
687名無しさん@お腹いっぱい。:2012/08/16(木) 14:00:53.80
echo $((91-72)) は出来て、
A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。
688名無しさん@お腹いっぱい。:2012/08/16(木) 16:01:24.16
「スクリプトを終了したら $Aがセットされていません」系か?
689名無しさん@お腹いっぱい。:2012/08/16(木) 17:14:30.15
sum=0; cat file | while read i; do sum=$(($sum+$i)); done; echo $sum
系とエスパー
690名無しさん@お腹いっぱい。:2012/08/16(木) 18:10:35.35
echo $(( `wc -l a.txt` / 2 ))
ってなんでエラーになるの?
691名無しさん@お腹いっぱい。:2012/08/16(木) 18:14:24.15
>>690
wcの出力にファイル名(a.txt)が出ちゃうから。

echo $(( `wc -l < a.txt` / 2 ))
で桶
692名無しさん@お腹いっぱい。:2012/08/16(木) 20:20:08.24
>>691
ありがとう
693名無しさん@お腹いっぱい。:2012/08/17(金) 12:54:21.22
>>671
ベタテキストよりオブジェクトそのままの方が扱いやすい。
694名無しさん@お腹いっぱい。:2012/08/17(金) 14:11:13.11
亀レスで新しい内容なしw
695名無しさん@お腹いっぱい。:2012/08/18(土) 09:29:13.33
2点教えて下さい。
linuxのシェルでの問題です。
@aaa="a b";echo ${aaa}
a b と半角スペースがなぜ詰まるのでしょうか?
ASJISテキストファイル編集時の文字化け
 やりたい事、csv2ファイル入力し、双方マッチングし
 条件により、行データを出力するしないを制御するだけのものです。
 そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト
 で出力したものに関しては文字化けは見受けられなかった。
 文字化けが発生したのは
 read LINEで一行読込
 echo ${LINE} >> out.cvs で追加出力
 とした場合のみ
 前者後者あまり違いが内容に思われるのですが対策って有るでしょうか?
 ちなみにlinux側の文字コードはutf8設定です。
 当編集シェル実行時のみ文字コードを環境変数なりで変えることは
 可能でしょうか?またその方法は有効でしょうか?

よろしくお願いします。
696名無しさん@お腹いっぱい。:2012/08/18(土) 09:37:46.51
1 echo "${aaa}"
2 readはバックスラッシュを解釈する。したがってSJISでは利用できない。
697名無しさん@お腹いっぱい。:2012/08/18(土) 09:39:32.05
>>695
機種依存文字使うな

aaa="a b";echo "$aaa"

echo "$LINE"

同じような質問が、>>683 で出たばかり
698名無しさん@お腹いっぱい。:2012/08/18(土) 09:42:26.61
>>695
どうせbashだろうから、

IFS= read -r LINE
echo "$LINE"

でいいな。
699名無しさん@お腹いっぱい。:2012/08/18(土) 09:56:30.06
早速の多数の方、回答ありがとうございます。
1.機種依存注意します。
2.類似質問分からず失礼しました。
職場ではnetに繋げないため、別の場所からの質問でした。
直ぐの確認できませんが、後ほど確かめます。
ありがとうございました
700名無しさん@お腹いっぱい。:2012/08/18(土) 10:32:16.48
>>697
スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。
701名無しさん@お腹いっぱい。:2012/08/18(土) 10:46:31.57
UNICODEの丸数字とSJISの丸数字はコードが違う。
702名無しさん@お腹いっぱい。:2012/08/18(土) 10:56:37.52
UNICODE ?x2460;
SJIS @
703名無しさん@お腹いっぱい。:2012/08/18(土) 11:02:46.61
>>700
Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。
704名無しさん@お腹いっぱい。:2012/08/18(土) 14:37:23.03
機種依存なんだからそんな問題が発生する機種を使ってる奴が悪いw
705名無しさん@お腹いっぱい。:2012/08/18(土) 14:43:39.83
にちゃんにきておいて機種依存文字がどうのって...
ばかじゃね?
706名無しさん@お腹いっぱい。:2012/08/18(土) 14:46:18.51
SJISの丸数字使いはこの板ではバカにされてもしょうがない。
707名無しさん@お腹いっぱい。:2012/08/18(土) 15:04:19.06
未だにこんなこという爺さんが生き残ってたんだ。すげー。
708名無しさん@お腹いっぱい。:2012/08/18(土) 15:26:19.78
丸文字は見た目がバカっぽい。
709名無しさん@お腹いっぱい。:2012/08/18(土) 15:33:34.03
そんなひっぱるほどの話でもない。
710名無しさん@お腹いっぱい。:2012/08/18(土) 16:26:28.28
機種依存馬鹿
711名無しさん@お腹いっぱい。:2012/08/18(土) 16:49:46.33
掲示板ならいいけどソースコードの中で丸数字見たらヤな気分になる人は多いのでは
712名無しさん@お腹いっぱい。:2012/08/18(土) 16:53:07.24
>>704、706
なんだかな。。。

>>711
意味不明なオレ様英語で書かれるより遥かにマシ。
713名無しさん@お腹いっぱい。:2012/08/18(土) 17:39:52.74
>>711
確かに。ヘタな英語のほうがまだマシだな。
714名無しさん@お腹いっぱい。:2012/08/18(土) 22:13:16.26
695です。
心配でしたので、自分のPCにcygwinをいれて試してみました。
1,2点確認取れました。
全く同じ環境ではないですが、問題なさそうですね。
安心しました。助かりました。
ありがとうございました。
715名無しさん@お腹いっぱい。:2012/08/19(日) 08:36:59.51
>>700
2chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。
716名無しさん@お腹いっぱい。:2012/08/19(日) 08:55:36.89
UTF-8な板もあるんじゃないの?
717名無しさん@お腹いっぱい。:2012/08/19(日) 09:32:20.05
>>716
どの板?
718名無しさん@お腹いっぱい。:2012/08/19(日) 13:27:36.99
外国語の特殊文字の顔文字が2chに氾濫してる御時勢に機種依存文字とか何だか。
スレ違いなので誘導?です↓
2chで外国語の特殊文字を使うには[unicode][専ブラ] 2
http://awabi.2ch.net/test/read.cgi/gogaku/1298542858/
719名無しさん@お腹いっぱい。:2012/08/19(日) 14:00:34.37
>>718
その板も Shift_JISだねw
720名無しさん@お腹いっぱい。:2012/08/19(日) 17:08:00.35
今の2chで機種依存文字っつーと丸数字よりケータイ絵文字の印象が強いな
721名無しさん@お腹いっぱい。:2012/08/20(月) 00:07:04.29
引数のファイル名とかディレクトリ名を
正規化してフルパスにしたいんだけど
一番かっこういい方法はどんな手順?
722名無しさん@お腹いっぱい。:2012/08/20(月) 00:10:53.29
linuxならreadlink -fかrealpath
FreBSDならrealpath
723名無しさん@お腹いっぱい。:2012/08/20(月) 00:37:28.76
>>722
NetBSDではどうしたらいいんでしょうか
724名無しさん@お腹いっぱい。:2012/08/20(月) 00:40:15.07
GNU binutilsか何かにrealpathは入ってるから、入れろ
725名無しさん@お腹いっぱい。:2012/08/20(月) 00:40:16.43
Perlのrealpath関数でも使っておけ
726名無しさん@お腹いっぱい。:2012/08/20(月) 01:00:03.17
acroreadの起動スクリプト(シェルスクリプト)とか参考になるんじゃないかな
727名無しさん@お腹いっぱい。:2012/08/20(月) 01:56:51.87
>>721
完璧な方法

1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
728721:2012/08/20(月) 02:27:37.26
>>722-727
ありがとう
readlink -f
を使うことにします
729名無しさん@お腹いっぱい。:2012/08/20(月) 06:32:20.27
>>727
それだと対象ファイルがパーミッションでopenできない時に使えない。

openせずに直接 statした方が良い。
730名無しさん@お腹いっぱい。:2012/08/20(月) 06:40:53.50
>>726
acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。
731名無しさん@お腹いっぱい。:2012/08/21(火) 15:37:54.91
パイプで最初の一行目だけを取得するにはどう書けばよいでしょうか?
ls -t | <最初の一行目を抽出するコマンド>
のような使いかたがしたいのですが。
732名無しさん@お腹いっぱい。:2012/08/21(火) 15:42:20.18
すみません、宿題で使うので説明も書いてほしいです。
733名無しさん@お腹いっぱい。:2012/08/21(火) 15:42:47.76
head -n1 じゃダメなのん?
734名無しさん@お腹いっぱい。:2012/08/21(火) 15:48:22.55
宿題なら他人と同じ答じゃ評価低いよな。

head -n 1 や head -1 は多数が回答するから面白くない。

sed -n 1p あたりで回答しとけ。評価上がるぞ。
735名無しさん@お腹いっぱい。:2012/08/21(火) 15:51:18.32
>>731
俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。
736名無しさん@お腹いっぱい。:2012/08/21(火) 15:57:36.75
じゃあ俺はbrainf*ckあたりで一行目を表示するスクリプト書くわー
737名無しさん@お腹いっぱい。:2012/08/21(火) 15:59:31.28
オレこれ↓
ls -t | (read f; echo "$f")
738731:2012/08/21(火) 16:00:29.24
教えていただけてありがとうございました。
739名無しさん@お腹いっぱい。:2012/08/21(火) 16:48:36.64
sed -n 1pとhead -n 1じゃ前者はカス。
何故カスかという効率の差に関して記述すれば評価上がるぞ。
740名無しさん@お腹いっぱい。:2012/08/21(火) 16:51:32.61
>>739
sed 1q ならどうですか?
741名無しさん@お腹いっぱい。:2012/08/21(火) 16:58:40.58
headとかsedのプロセス起動のコストを考えると
シェル側でパイプ開いてreadするのが最強
742名無しさん@お腹いっぱい。:2012/08/21(火) 20:14:52.48
シェルへのパッチをレポートに貼るのか
743名無しさん@お腹いっぱい。:2012/08/22(水) 01:21:58.16
printf 'r !ls -t\n1p\nw' | ed -

パイプは使ったが
> ls -t | <最初の一行目を抽出するコマンド>
の形になってないからだめか
744743:2012/08/22(水) 01:29:14.30
ls -t | printf "i\n`cat /dev/stdin`\n.\n1p\nw" | ed -

こうしたら一応できた
745名無しさん@お腹いっぱい。:2012/08/22(水) 01:40:47.17
FreeBSDではedがworldに含まれてるから当然インストールされてるんだけど
Linux系ではed入ってないことも多いんだよなあ。
746名無しさん@お腹いっぱい。:2012/08/22(水) 02:57:14.91
そうだっけ?Linuxでも割と入ってるイメージがある
中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw
747名無しさん@お腹いっぱい。:2012/08/22(水) 03:14:43.87
Linuxならedなしbusyboxなディストリビューションもあるわけで。
748名無しさん@お腹いっぱい。:2012/08/22(水) 15:08:45.07
edが入っていないなんてもはやunixじゃないな…ああ元々unixじゃなかった。
749名無しさん@お腹いっぱい。:2012/08/22(水) 22:33:02.24
fedoraに普通に入ってる ed-1.5-3.fc17.x86_64
750名無しさん@お腹いっぱい。:2012/08/22(水) 23:14:05.90
そういうことは聞いてない。
751名無しさん@お腹いっぱい。:2012/08/26(日) 11:54:24.95
初歩的な質問ですみません
グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、
ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか
752名無しさん@お腹いっぱい。:2012/08/26(日) 12:01:34.46
>>751
echo `echo ¥`date¥``
753名無しさん@お腹いっぱい。:2012/08/26(日) 12:03:20.51
$()が使える環境ならそっちを使う方がいいかもしれん
754名無しさん@お腹いっぱい。:2012/08/26(日) 12:11:27.99
なるほど ありがとうございます
755名無しさん@お腹いっぱい。: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からキックされる場合、引数や変数は継承されますでしょうか。
756名無しさん@お腹いっぱい。:2012/08/30(木) 23:23:26.73
>>755
ファイル名にスペース等が含まれていないなら、

for file in `cat 外部定義ファイル`; do ...
で行ける。

異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。
757名無しさん@お腹いっぱい。:2012/08/31(金) 09:31:26.31
どのシェルが普通なのか俺には分からない
少なくとも、バッシュやZSHかな大別できるのは…
Kshは癖があるな。
シェルを実行するためには、chmodのコマンド手続きがいるだろ?
そんなこと初心者には周知されていない。
コマンド入力にしても ./付けるとかひと工夫しないとだめだ。
この件も初心者には周知されていない。
初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。
しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも
わからない筈だ。
758名無しさん@お腹いっぱい。:2012/08/31(金) 09:47:52.57
詩の宿題かなんか?
759名無しさん@お腹いっぱい。:2012/08/31(金) 12:48:53.44
export PATH="$PATH,."
760名無しさん@お腹いっぱい。:2012/08/31(金) 12:50:56.18
>>759
馬鹿は無理に答えなくていいよw
761名無しさん@お腹いっぱい。:2012/08/31(金) 13:04:38.23
>>760
どっか間違ってました?
762名無しさん@お腹いっぱい。:2012/08/31(金) 13:07:21.17
,じゃなく:だろ、と
.を含めちゃいかんだろ、と。
763名無しさん@お腹いっぱい。:2012/08/31(金) 13:08:11.26
>>757
勉強不足を人のせいにされてもなぁ。
764名無しさん@お腹いっぱい。:2012/08/31(金) 13:21:45.38
>>762
ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと



あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような
765名無しさん@お腹いっぱい。:2012/08/31(金) 14:24:17.00
slっていうウイルスがいるかもよ
766名無しさん@お腹いっぱい。:2012/08/31(金) 15:34:17.51
バッシュと呼ぶのやめようぜ。
かなりカッコ悪い。
767名無しさん@お腹いっぱい。:2012/08/31(金) 15:39:47.48
良く口頭でビーシェルみたいな言い方する人いるけど
あれってbashのことなんだろうか。
768名無しさん@お腹いっぱい。:2012/08/31(金) 16:03:33.42
そういうネタはいいです
769名無しさん@お腹いっぱい。:2012/08/31(金) 23:12:05.50
>>764
大丈夫じゃねーよ、バカ。
770名無しさん@お腹いっぱい。:2012/09/01(土) 02:21:32.43
触るな危険
771名無しさん@お腹いっぱい。:2012/09/01(土) 09:17:52.29
grepして見つかった行の前5行を出力するってできないでしょうか?
772名無しさん@お腹いっぱい。:2012/09/01(土) 09:27:17.81
マッチした行を含めていいなら -B 6 でいいと思う
773名無しさん@お腹いっぱい。:2012/09/01(土) 09:31:57.03
-B 5 だろw
774名無しさん@お腹いっぱい。:2012/09/01(土) 14:01:09.12
ここでの話しはレベルが高いのか低いのかようわからんな
775名無しさん@お腹いっぱい。:2012/09/02(日) 04:13:15.79
ash=エーシェル
bash=バッシュ
csh=シーシェル
d-shell=ディーシェル
sh=ビーシェル
tcsh=ティーシーシェル
zsh=ゼットシェル

バッシュだけアホみたい。
776名無しさん@お腹いっぱい。:2012/09/02(日) 09:58:21.31
zshはcshにそろえて読まなきゃ駄目よ
777名無しさん@お腹いっぱい。:2012/09/02(日) 10:08:27.84
>>775
「z」は、
イギリス発音なら「ゼッ『ド』」
アメリカ発音なら「ズィー」
どこにも「ゼット」なんて発音はない。
中学英語からやり直しだなw
778名無しさん@お腹いっぱい。:2012/09/02(日) 15:38:49.68
Zを日本人がゼットって読むのはイギリス英語が基だったのか。勉強になった
779名無しさん@お腹いっぱい。:2012/09/02(日) 16:01:49.22
>>777
俺も z はズィーと習ったけどさ、
zsh をズィーシェルと読むヤツには会った事無い。
780名無しさん@お腹いっぱい。:2012/09/02(日) 17:01:28.91
で、dashは?
781名無しさん@お腹いっぱい。:2012/09/02(日) 17:05:15.94
>>780
鉄腕
782名無しさん@お腹いっぱい。:2012/09/02(日) 17:34:15.94
>>781
ググるとそっちばっかりヒットするよなw
783名無しさん@お腹いっぱい。:2012/09/03(月) 00:53:44.84
ゼットシェルで問題ないよ。
[zed-?el]が[?]に接続して、無声化して[zet-?el]
784名無しさん@お腹いっぱい。:2012/09/03(月) 11:20:15.54
そもそもとしてゼッドもゼットもどちらも正しいけどな
785名無しさん@お腹いっぱい。:2012/09/03(月) 11:35:09.44
zshは「ズシュ」
786名無しさん@お腹いっぱい。:2012/09/05(水) 02:43:38.45
いつもざしゅって読んじゃう。
787名無しさん@お腹いっぱい。:2012/09/05(水) 07:54:36.01
ザシャァッ(車田調
788名無しさん@お腹いっぱい。:2012/09/07(金) 00:21:56.75
雑種
789名無しさん@お腹いっぱい。:2012/09/08(土) 13:09:33.30
ゼットエスエイチとか
ゼットシェル

日本人なんだからZの読み方にこだわる必要なし
790名無しさん@お腹いっぱい。:2012/09/08(土) 15:23:53.34
だな。今後はゼータシェルって言うことにするよ
791名無しさん@お腹いっぱい。:2012/09/09(日) 11:41:33.37
世紀末風に言うとジードシェル
792名無しさん@お腹いっぱい。:2012/09/09(日) 13:14:38.93
もっと捻るかマトモなネタないのかよ
793名無しさん@お腹いっぱい。:2012/09/09(日) 13:22:46.94
仕事で古いパソコンを使っています。OSはUNIX-OSです。
このマシンにbashを入れたいのですが、UNIX-OS用のbashバイナリが
入手できるところをご存知の方いらっしゃいましたら、入手先を教えて下さい。

ソースからコンパイルするのは、私があまりUNIX-OSに詳しくないので、あまり気が
進まないのですが、もしもコンパイルするしかないのでしたら、ソース入手先を
教えて頂けないでしょうか。
また、コンパイルしか手段が無いとしたら、UNIX-OSでは、bashのバージョンいくつまで
対応可能でしょうか。
794名無しさん@お腹いっぱい。:2012/09/09(日) 13:35:34.28
ネタにしてはつまらなすぎる。マジな質問ならば今のキミの知識では無理としか答えようがない。
795名無しさん@お腹いっぱい。:2012/09/09(日) 14:25:33.64
2台セットの激安PCを買ったんですが、テレビが付いてなくて、、
ケーブル買ってやっと居間のテレビにつないだんですけど、
電源を入れるとオペラシステム、ナンバーTが見つかった、
みたいなシェル画面が出て先に進みません。2台ともそうです。
この後どういうシェルコマンドを打てばいいのでしょうか?
796名無しさん@お腹いっぱい。:2012/09/09(日) 17:39:59.21
よくわかんないけどシェルの事ならシェルに聞いてみるのが一番いいよ。
http://www.shell.co.jp/
797名無しさん@お腹いっぱい。:2012/09/09(日) 18:20:22.56
ありがとうございました。今環境がないので今度客先で試してみます。
798名無しさん@お腹いっぱい。:2012/09/09(日) 18:42:25.39
いいクオリティしてますね
799名無しさん@お腹いっぱい。:2012/09/11(火) 12:23:14.32
マスコミは特亜系エセ左翼・カルト宗教団体が行っている組織的な嫌がらせ、集団ストーキング、電磁波悪用、「ガスライティング」を報道しろ
800名無しさん@お腹いっぱい。:2012/09/13(木) 01:14:45.24
全くシェルスクリプトを触ったことない素人なのですが、cdを変更して
あるファイルをmakeするのが面倒なので自動化させたいです。
させたい処理はcd変更→makeの2点だけです。
ですが、うまくいきません。(シェルが一瞬立ち上がってそのまま終了します)
シェルにどういう引数を与えて起動させればいいでしょうか。
801名無しさん@お腹いっぱい。:2012/09/13(木) 01:23:56.91
make -C directory
802名無しさん@お腹いっぱい。:2012/09/13(木) 01:31:25.80
>>801
どういうことでしょうか?
bash make -C directoryでしょうか?
えーと、makeは-fオプションで行いたいので、bash make -f directoryですか?
803名無しさん@お腹いっぱい。:2012/09/13(木) 01:35:05.89
>>801
あ、いや、つまり-Cでcd変更を兼ねるわけですね。理解しました
それで、その前にシェルを起動させなければいけないのですが、シェル起動→make -C directoryまでを
一連の動作として行うにはどうすればいいでしょう亜k?
804名無しさん@お腹いっぱい。:2012/09/13(木) 02:03:13.41
んっと、自分の考えた「手段」に固執して
シェル起動とかいう独自用語使ってるとアドバイス来ないよ。
「何をしたら何が起きてほしい」と「目的」が重要。
805名無しさん@お腹いっぱい。:2012/09/13(木) 02:32:36.62
リンクか何かをクリックしたらbashが起動してmakefileしたいです。
806名無しさん@お腹いっぱい。:2012/09/13(木) 02:35:29.22
しかしシェルスクリプトを直接起動するのはNGで、必ずbashに引数を与えて起動させなければならないとします
807名無しさん@お腹いっぱい。:2012/09/13(木) 02:40:38.93
そして最も求めている手段がshにオプション引数としてシェルスクリプトを与えて起動し、makefileする方法です
808名無しさん@お腹いっぱい。:2012/09/13(木) 06:26:57.77
はい、次の方どうぞ
809名無しさん@お腹いっぱい。:2012/09/13(木) 06:38:48.75
先生、ぼくも同じ物を探しています
810名無しさん@お腹いっぱい。:2012/09/13(木) 07:40:19.71
「cd変更」って何だ。
811名無しさん@お腹いっぱい。:2012/09/13(木) 07:52:00.73
マウントしなおすんだと思ってたw
812名無しさん@お腹いっぱい。:2012/09/13(木) 08:36:35.52
しきりに「シェルを起動」って言ってるのは、
端末エミュレータ起動のことだろうとエスパー。
あるいはcygwin環境なのかも試練。

が、そういう低レベルの質問はお断りなので、
次の方どうぞ
813名無しさん@お腹いっぱい。:2012/09/13(木) 08:40:27.04
>>805-807
デスクトップと端末エミュレータとshとbashとシェルスクリプトとオプション引数とmakeとmakefileとcdとカレントディレクトリと手段と目的がごっちゃになってる。
整理して出直せ。
814名無しさん@お腹いっぱい。:2012/09/13(木) 10:11:28.58
端末エミュレーターxtermはUNIX系のほとんどのOSに対応してるって聞いたんですが、
xtermでFreeBSDのコマンドが実行できません。FreeBSDは対応してないんでしょうか?
関係あるかどうかわかりませんが、ホストOSはLinuxです。
815名無しさん@お腹いっぱい。:2012/09/13(木) 10:21:58.22
お薬出しておきますね

次の方どうぞ
816名無しさん@お腹いっぱい。:2012/09/13(木) 21:30:04.47
>>814
FreeBSDもLinuxもUNIXじゃありません。
817名無しさん@お腹いっぱい。:2012/09/13(木) 21:34:21.69
>>816
この板にfreeBSDスレ立ってますがイタチと言われません
→freeBSDはUNIX

UNIX系OS用ソフトの大半はLinuxで動きますしディレクトリ構造が同じです
→LinuxはUNIXライク
818名無しさん@お腹いっぱい。:2012/09/13(木) 21:51:52.27
>>817
freeBSDなんていうあなたが発明したシステムが
UNIXかどうかは、ほかの人にはわかりません。
819名無しさん@お腹いっぱい。:2012/09/13(木) 22:11:31.87
出されたお薬はちゃんと飲んでください
820名無しさん@お腹いっぱい。:2012/09/13(木) 22:18:29.90
ハイ、わかりますた。
でも飲んだか飲んでないか、すぐ忘れちゃうんです。
821名無しさん@お腹いっぱい。:2012/09/13(木) 23:02:26.98
飲んだかどうか記録するシェルスクリプト作るといいです
822名無しさん@お腹いっぱい。:2012/09/13(木) 23:28:44.84
そのスクリプトを起動する事を忘れちゃうんです

っつーかある意味、マジな話、一日一度、cronやatを使えず、どうしても手動で
動かさなければならない手順を、結構いつも忘れてしまう…
823名無しさん@お腹いっぱい。:2012/09/13(木) 23:29:59.39
$ while true; do sleep 86400; ./hoge; done
824名無しさん@お腹いっぱい。:2012/09/13(木) 23:40:27.06
まぁ、1日1回動かしゃいいって訳じゃなくて、例えば商用マシンからログ類を集計して、
USBメモリにコピって、テストマシンにアップロードして、集計して、そんで最終的に
得られたデータを所定のExcelのシートに記入して、その結果出てきた情報を
ログに書き込んでスクリプトを実行する、みたいな作業だ

昔は派遣の人にお願いしてたんだが、コストカットで人が減っちまった

自動化できるんならしたいわマジ
825名無しさん@お腹いっぱい。:2012/09/13(木) 23:41:01.52
trueの代わりに : で、とか
むしろ、sleep 86400 を条件にすりゃいんじゃねとかの、誘い水かね?
826名無しさん@お腹いっぱい。:2012/09/13(木) 23:44:38.84
>>825
それだとkillall sleepされたときに一緒に終了されちゃうじゃん。
827名無しさん@お腹いっぱい。:2012/09/13(木) 23:48:41.09
なんでsleep名指しで殺すんだよ
828名無しさん@お腹いっぱい。:2012/09/13(木) 23:53:12.25
>>825
while sleep 86400; do ./hoge; done
だと、最初の実行まで24時間待たされる。

敢えてsleepを条件に入れたいなら、
while ./hoge; sleep 86400; do :; done
だな。

でもこれだと結局 :コマンドが要るから、素直に
while :; do sleep 86400; ./hoge; done
かな。
829名無しさん@お腹いっぱい。:2012/09/13(木) 23:55:28.62
処理に10秒かかるスクリプトだと、毎日毎日10秒ずつ起動時刻が遅くなっていくんだな
830名無しさん@お腹いっぱい。:2012/09/14(金) 10:42:32.57
f(){ ./hoge; sleep 86400; f;}; f
831名無しさん@お腹いっぱい。:2012/09/14(金) 11:03:37.39
そして再帰が深くなりすぎて落ちる、と。
832名無しさん@お腹いっぱい。:2012/09/14(金) 11:04:58.51
末尾最適化するようにbash改造すれば大丈夫
833名無しさん@お腹いっぱい。:2012/09/14(金) 12:35:38.76
>>824
っていうか、なんで出来ないの?
Excelのシートに記入するところは苦戦しそうだけど。
834名無しさん@お腹いっぱい。:2012/09/14(金) 16:45:58.07
windows使っていいなら簡単でしょ。板違いなだけで。
寧ろUSBメモリ移動が鬼門。
835名無しさん@お腹いっぱい。:2012/09/15(土) 13:19:37.17
grepでタブを検索したいんですがどうしたらいいでしょうか

egrep "\t" *.txt
だと、tを検索してしまいます。
836名無しさん@お腹いっぱい。:2012/09/15(土) 13:22:50.87
あと、STX(アスキーコード0x02)も検索したいのですが
こっちもやり方がよくわかりません。
ついでに教えてください。
837名無しさん@お腹いっぱい。:2012/09/15(土) 13:32:23.77
8進printfしてコマンド置換かな
838名無しさん@お腹いっぱい。:2012/09/15(土) 13:38:45.62
>>835

対話環境での話ならCTRL-Vあたりがクォート機能に割り当てられている
シェルなら

$ grep '[CTRL-V][TAB]' *.txt

スクリプトの中ならエディタでTABコード書けるだろ。
839名無しさん@お腹いっぱい。:2012/09/15(土) 13:44:39.15
スクリプトは expand -8 とかで清書する場合もあるし、意味を持ったTABをじかに書くべきじゃないな

(じゃあMakefileは? というのは無しで)
840名無しさん@お腹いっぱい。:2012/09/15(土) 15:06:46.92
841名無しさん@お腹いっぱい。:2012/09/15(土) 21:55:57.05
>>835
grepでというのには反則だけど
perl -ne 'print if /\t/'
842名無しさん@お腹いっぱい。:2012/09/15(土) 21:59:20.76
perl使うのはこのスレでは禁止
grep -P なら許す
843名無しさん@お腹いっぱい。:2012/09/15(土) 23:49:50.18
grep -e "$(printf '\t')"
844名無しさん@お腹いっぱい。:2012/09/16(日) 09:58:27.49
巨大なディレクトリツリーの差分(ファイルの有無だけでいい)を取りたいんですが、
rsync以外で効率のいいやり方を教えて下さい。
diff -rqやfind | sort | diffでは遅すぎるのでもっといいやり方は無いでしょうか。
845名無しさん@お腹いっぱい。:2012/09/16(日) 10:10:52.16
>>844
diff <(ls -aR /dir1) <(ls -aR /dir2)
846名無しさん@お腹いっぱい。:2012/09/16(日) 10:21:29.26
>>845
ありがとうございます。確かに速いですね。
ただ、lsの出力がファイル名だけなので、diffからファイルのパスが分からないのが困ります。
他にdir1にあってdir2に無いファイルを相対/絶対パスで取得できる方法はありませんか?
情報後出しで済みません。
847名無しさん@お腹いっぱい。:2012/09/16(日) 10:26:29.46
ごめんなさい、今確認したところfind | sort | diffでもそれなりに速いことが分かりました。
勝手に遅いと思い込んでいました。とりあえずこの方法でやってみます。
回答して下さった方どうもすみませんでした。
848名無しさん@お腹いっぱい。:2012/09/16(日) 10:56:10.15
ちなみに自分が試したのは

diff -u <(cd old/ && find . | sort) <(cd new/ && find . | sort) | grep '^\+./'
rsync -naiO --ignore-existing new/ old/ | awk '{print $2}'
diff -rq old/ new/

で、上から順に速いことが分かりました。御参考まで。
849名無しさん@お腹いっぱい。:2012/09/16(日) 12:14:22.36
ディレクトリの比較は dircmp が使えるなら、dircmp を使うといいかもしれない

どちらかのみ含まれるファイルを取り出すのに diff -u して grep ^+ してるけど
commを使うといいかもしれない
850名無しさん@お腹いっぱい。:2012/09/16(日) 12:24:49.73
>>838-843
みなさん、ありがとうございました!
うちにきて弟をファックしてもいいですよ。
851名無しさん@お腹いっぱい。:2012/09/16(日) 14:49:42.09
>>849
ありがとうございます。

comm -13 <(cd old/ && find . | sort) <(cd new/ && find . | sort)

と書き換えてスッキリしました。
dircmpのほうは古いUNIXにあったコマンドみたいですね。
自分はLinuxなので使えませんでしたが、参考になりました。
852名無しさん@お腹いっぱい。:2012/09/16(日) 14:54:15.88
dircmpってSolarisに付いてるけど、
結局diffでファイルの中身比較するから遅いよ。
(ファイルの中身は比較しないで欲しいという目的なら)
853名無しさん@お腹いっぱい。:2012/09/16(日) 18:27:09.74
>>852
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/dircmp/dircmp.sh

-dオプションをつければdiffを呼ぶ
そうでない場合でも、ファイルサイズが同じ場合には cmp を呼ぶみたいですね

なるほど、同じファイル名でも違うファイルかどうかを判定する必要があるのかdircmpは
854名無しさん@お腹いっぱい。:2012/09/18(火) 14:23:13.01
ちょっと質問です。

例えば echo "test" という 1 行だけのシェルスクリプトを作成して、foo.sh という名前で
保存します。このファイルのパーミッションを 744 にしてコマンドラインで ./foo.sh と叩くと
正常に実行できてしまいました。

シェバング行が無いのに、何故実行できてしまうのでしょう? おそらく基本的なところで
私の理解が不足しているのだと思いますので「ここを読め!」等のポインタで結構ですので、
どなたかご教示いただけないでしょうか。

ちなみに FreeBSD、AIX、CentOS で試してみましたが、いずれも同じ結果でした。
855名無しさん@お腹いっぱい。:2012/09/18(火) 14:29:46.54
ないときは /bin/sh でも呼ぶようになってんじゃないの。
ちゃんと調べてないけど。
856名無しさん@お腹いっぱい。:2012/09/18(火) 14:30:51.05
カーネルソースを読め。
857名無しさん@お腹いっぱい。:2012/09/18(火) 14:31:10.83
>>854
昔のUNIXではシェバング行なんてなかった。
テキストファイルであっても chmod +xされていればexec()される。
まずはバイナリと仮定してカーネルのexec()を呼び出す。
するとフォーマットが合わないのでエラーで返ってくる。
このあと、コマンドラインのシェルの判断で、
「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
これでシェルスクリプトとして実行される。

シェバング行がある場合は最初からその行に書かれたシェルのスクリプトとして
カーネル側のexec()で直接実行される。
858名無しさん@お腹いっぱい。:2012/09/18(火) 15:12:12.83
ユーザーはソフトのインストール禁止ですが、
最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、
X権限をすることによってソフトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようなおすすめのシェルって何ですか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
859名無しさん@お腹いっぱい。:2012/09/18(火) 15:15:18.02
860名無しさん@お腹いっぱい。:2012/09/18(火) 15:19:10.12
>>858
とりあえず /home以下をnoexecでmountしちゃえば?
861名無しさん@お腹いっぱい。:2012/09/18(火) 15:27:38.12
つまらんネタにかまうな。
862名無しさん@お腹いっぱい。:2012/09/18(火) 15:52:29.12
>>857
> するとフォーマットが合わないのでエラーで返ってくる。

これは先頭の2byteを見ていたのね。
そこから#!を使うことになった。comment(#) + execute(!)

昔の実行形式の先頭2byteがどういう値だったかは、
/usr/share/file/magic/pdpを見るといい。
古典的なUNIXでは/etc/magicにある。
典型的なテキストファイルでは使わないシーケンスになってる。
863854:2012/09/18(火) 16:18:19.96
おまいら早いですねw (褒めてます)

>>857
> このあと、コマンドラインのシェルの判断で、
> 「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。

ありがとうございます。この部分以外は自分の理解とおおむね一致していました。
自分の理解度を再確認できて良かったです。

ただ、「シェルの判断で〜」の部分ってシェルのマニュアルにはちゃんと書かれて
いるのか、それとも「昔からそういうもんだ。ソース読め」のどちらなんでしょう?

手元では tcsh / ksh / bash で同じ挙動だったので「昔からそういうもんだ」
なのかな、という予感です。
864名無しさん@お腹いっぱい。:2012/09/18(火) 16:23:15.64
マニュアルに書いてあるかどうかと昔からそういうもんかどうかって
択一じゃないと思う。
865名無しさん@お腹いっぱい。:2012/09/18(火) 16:34:37.60
shellがmagic numberを見て、shell scriptを自分で実行するようになったのは、
bash移行のことじゃないか? それまではexecve(2)におまかせだったはず。
866名無しさん@お腹いっぱい。:2012/09/18(火) 16:50:35.22
一応手持ちのGentooマシンで調べてみたけど
GNU bash 4.2.37ではまだexecveしてENOEXECが返されるのを確認してから
そのスクリプトを読み直して処理してるみたい。
867名無しさん@お腹いっぱい。:2012/09/18(火) 21:16:25.81
どーでもいいけど昔のHP-UXで一行目がシェバングじゃないコメント行だと
ログインシェルで解釈されたような気がする。
868名無しさん@お腹いっぱい。:2012/09/19(水) 11:56:29.71
#!/bin/cat
Hello,world!

って書いてもcatが起動しないんだけど、なんで?
869名無しさん@お腹いっぱい。:2012/09/19(水) 11:59:22.55
ごめん、起動してたわ
870名無しさん@お腹いっぱい。:2012/09/19(水) 12:06:17.94
cat -n で起動したらいろんな誤解が一瞬で解けた
871名無しさん@お腹いっぱい。:2012/09/19(水) 12:07:42.49
日記か。
872名無しさん@お腹いっぱい。:2012/09/19(水) 13:51:27.02
知識の共有だ
873名無しさん@お腹いっぱい。:2012/09/19(水) 20:18:30.82
A=`./hoge | cat`
みたいなとき、./hogeのエラーを検知してリトライしたいんだけど
どうしたらいいかな
874名無しさん@お腹いっぱい。:2012/09/19(水) 20:40:36.49
ためしてないけど
A=`while ! ./hoge; do :; done | cat`
ってかんじかなぁ
875名無しさん@お腹いっぱい。:2012/09/19(水) 20:54:25.77
>>874
そっかその中でループしちゃえばいいのか
876名無しさん@お腹いっぱい。:2012/09/22(土) 17:58:27.45
シェルの正しい文法って誰も知らないみたいなウィキペディアにはハッカー?さんのコメントがありますが
望ましいシェルスクリプトの実行方法は実行権付与後に当ファイルを呼び出す方式か、 shコマンドで引数にファイルパスを指定する方法か、 .コマンドで同様にパス指定する方法か、どれになりますでしょうかね
実行時の状況次第で選ぶものだとは思いますが。。
877名無しさん@お腹いっぱい。:2012/09/23(日) 05:23:02.47
文法がどう呼び出し方法の話とつながっているのかわからんが、
明らかに3つとも意図するところは違うだろ。
878名無しさん@お腹いっぱい。:2012/09/23(日) 23:34:02.91
というと?
879名無しさん@お腹いっぱい。:2012/09/24(月) 03:46:37.39
というと=tweet
880名無しさん@お腹いっぱい。:2012/09/24(月) 10:04:32.63
具体的に。
881名無しさん@お腹いっぱい。:2012/09/24(月) 10:59:38.29
誰か >>876 を3行で日本語にして
882名無しさん@お腹いっぱい。:2012/09/24(月) 11:08:32.60
(1) ./hoge.sh
(2) sh hoge.sh
(3) . hoge.sh
をどう使い分けるか。
883名無しさん@お腹いっぱい。:2012/09/24(月) 11:08:44.90
シェルスクリプトって実行権限与える、shに引数渡す、sourceで読み込むと、
三種類実行方法がありますが、それぞれどんな特徴ですか?
それはさておき、文法を完全に把握してる人がいないんですね。wikipediaに書いてありました。
884名無しさん@お腹いっぱい。:2012/09/24(月) 11:19:08.75
文法はさておきすぎとして、
(1)と(2)はそれほど明確に使い分けてないかもね
パーミッションが立ってることが保証できて、
普通のコマンドと区別する理由がなければ(1)
885名無しさん@お腹いっぱい。:2012/09/24(月) 11:23:20.30
コマンドラインから頻繁に実行するなら (1) にしたい。
ただ #! とかモードとかちゃんと設定しなければならない。
その辺がめんどうなら (2) で。
(3) は (1)(2) とは動きが違う。
886名無しさん@お腹いっぱい。:2012/09/24(月) 11:33:50.71
>>885
(3)が違うというのはなにが違うというのか
887名無しさん@お腹いっぱい。:2012/09/24(月) 11:35:36.73
>>886
子プロセスで実行するか現在のプロセスで実行するか。
888名無しさん@お腹いっぱい。:2012/09/24(月) 11:36:18.77
釣りくさいけど、変数に代入したりcdしたりして比べてみろ
889名無しさん@お腹いっぱい。:2012/09/24(月) 11:36:48.66
たとえば hoge.sh 内で cd / してみ。
890名無しさん@お腹いっぱい。:2012/09/24(月) 11:37:32.27
ダウンロードして一回だけ実行って時は、(2)をさせる記述が多いね。
891名無しさん@お腹いっぱい。:2012/09/24(月) 12:11:39.88
やっぱり文法の話が気になる。
892名無しさん@お腹いっぱい。:2012/09/24(月) 12:42:24.30
文法の話、参照先読んから書きたいんだけど、臨時串がNGワードではねやがる。

bash開発時にsh互換にするのに文法で苦労したんだって。
その時の語録みたいよ。
893892:2012/09/24(月) 12:59:18.55
shのドキュメントがイマイチだったり、yaccが不完全だったんだって。
みんな使っている機能なのに。
だから「本当は誰もshの文法がどうなっているのか知らないんだよ。
ソースコードなんて読んだってほとんど役立たねえよ」ってことらしい。
894名無しさん@お腹いっぱい。:2012/09/24(月) 14:30:47.04
不完全って何だよ、もとからyaccなんか使ってねえよ
伝聞じゃなくてソース出せ
895名無しさん@お腹いっぱい。:2012/09/24(月) 14:45:31.61
896名無しさん@お腹いっぱい。:2012/09/24(月) 14:46:52.91
http://www.linuxjournal.com/article/2800?page=0,2
yaccうんぬんはこれか。
897名無しさん@お腹いっぱい。:2012/09/24(月) 15:59:04.26
「yaccが不完全」とは書いてないな。
898名無しさん@お腹いっぱい。:2012/09/24(月) 16:08:48.36
899名無しさん@お腹いっぱい。:2012/09/24(月) 16:26:39.69
えwwwいwwwごwww
We are Japanese!
900名無しさん@お腹いっぱい。:2012/09/24(月) 16:54:24.62
rcの宣伝するのにshをdisってるだけで、bashだの互換性だの関係ないじゃん。
901名無しさん@お腹いっぱい。:2012/09/24(月) 16:56:23.03
>>900
>>892>>896を読んだんだろう。
902名無しさん@お腹いっぱい。:2012/09/24(月) 17:31:58.97
who|wcがだめなのって、昔のshはパイプが^だったっていうだけのこと?
903名無しさん@お腹いっぱい。:2012/09/24(月) 18:05:51.19
>>902
7th Edition なら「|」でいいっぽい。
http://plan9.bell-labs.com/7thEdMan/v7vol2a.pdf
904名無しさん@お腹いっぱい。:2012/09/24(月) 18:31:49.56
>>903
んっと、実質いけるかじゃなくて、ドキュメント上の話ね
905名無しさん@お腹いっぱい。:2012/09/24(月) 18:36:10.23
あぁ
>>903
は、1979のドキュメントか。who|sortがちゃんと例に上がってるね。
who|wcが認められていないっていう出典は何だ?
906名無しさん@お腹いっぱい。:2012/09/24(月) 19:15:26.74
こっちだと出典が載ってる。
http://tiswww.case.edu/php/chet/bash/article.pdf

出典はこれ。>>903に含まれてるのと同じっぽい。
http://www.alcatel-lucent.com/bstj/vol57-1978/articles/bstj57-6-1971.pdf

でもなんでダメなのかはよくわからん。
907名無しさん@お腹いっぱい。:2012/09/24(月) 20:02:57.99
bstjのは who|grep $1 みたいな例があるから出典としてはおかしいんじゃないかな。
Chet 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.
の根拠がわからない点かな。

なのにあちこち引用されてるという……
908名無しさん@お腹いっぱい。:2012/09/26(水) 20:55:09.39
そんなことよりshのソースを見て驚愕しようぜ。
909名無しさん@お腹いっぱい。:2012/09/26(水) 20:58:49.31
      /⊇∧
  /⊇∧〈( ゚д゚)
`〈( ゚д゚)ヽ ⊂ニ)
 ヽ_と/ ̄ ̄ ̄/ |
  ̄\/___/ ̄ ̄
910名無しさん@お腹いっぱい。:2012/09/27(木) 13:34:15.65
ウニ臭ってさ、コマンドライン画面にエロアニメ少女のAA出して
オナニーするんだろ?

本当にキモいよな。
911名無しさん@お腹いっぱい。:2012/09/27(木) 15:53:41.99
AA ってなんですか。
912名無しさん@お腹いっぱい。:2012/09/27(木) 16:49:20.71
913名無しさん@お腹いっぱい。:2012/09/27(木) 22:53:41.05
マジレスってなんですか?
914名無しさん@お腹いっぱい。:2012/09/27(木) 23:37:10.23
915名無しさん@お腹いっぱい。: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
916名無しさん@お腹いっぱい。:2012/10/03(水) 23:54:39.82
for f in $(eval "$cmd");do
echo $f
done
917名無しさん@お腹いっぱい。:2012/10/04(木) 08:26:24.94
>>915
cmdに ' ' で代入すること " " だとバックスラッシュが解釈される。
918名無しさん@お腹いっぱい。:2012/10/08(月) 21:27:19.47
sed -e /1a porto=WPA/ wpa_supplicant.conf
で2行目にproto=WPAを挿入したしてますが、
タブ+proto=WPAを挿入するには、どうしたら出来ますか?


919名無しさん@お腹いっぱい。:2012/10/08(月) 21:38:16.14
>>918
sed -e '1a\\tporto=WPA' wpa_supplicant.conf
920918:2012/10/08(月) 22:10:14.93
>919
あ、そうか
ありがとうございます。
921名無しさん@お腹いっぱい。:2012/10/09(火) 09:23:06.07
ある特定の命令を無視しろと命令したい場合どうすればいいの?
922名無しさん@お腹いっぱい。:2012/10/09(火) 09:57:32.69
命令ってなんのこと?
923名無しさん@お腹いっぱい。:2012/10/09(火) 10:01:49.88
あ、コマンドのこと。
924名無しさん@お腹いっぱい。:2012/10/09(火) 10:22:48.32
こういう事か? 突っ込みどころはいろいろあるがキミのレベルならこれで良い。

#!/bin/sh
ls () :
ls
925名無しさん@お腹いっぱい。:2012/10/09(火) 10:28:51.78
>>921
↓この人と一緒に考えるといい。
http://toro.2ch.net/test/read.cgi/tech/1348995216/574
926名無しさん@お腹いっぱい。:2012/10/10(水) 11:22:49.71
grepコマンドで、"---Hoge"という文字列を検索できません
どうしたらよいでしょうか
927名無しさん@お腹いっぱい。:2012/10/10(水) 11:26:04.61
まさか grep -- ---Hoge というオチじゃないだろな
928名無しさん@お腹いっぱい。:2012/10/10(水) 11:28:20.39
-- が使えないgrep用の解
grep '[-]--Hoge'
929名無しさん@お腹いっぱい。:2012/10/10(水) 11:30:08.66
grep -e --Hoge
930名無しさん@お腹いっぱい。:2012/10/10(水) 15:19:10.02
>>927-929
ありがとうございました
931名無しさん@お腹いっぱい。:2012/10/12(金) 19:22:12.36
すいません、教えてください。
at コマンドで、日付を指定することはできませんか?
4日後の午前8時に実行したいのです。
at コマンドじゃなくてもかまいません。
FreeBSD 4.7 です。
よろしくお願いします。
932名無しさん@お腹いっぱい。:2012/10/12(金) 19:35:22.65
なぜmanを読まない? 時刻と日数は違うけとそのものずばりが例にかかれてる。
933名無しさん@お腹いっぱい。:2012/10/12(金) 19:39:11.88
>>932
ありがとうございました。
8am + 4 days
で、いいんですね?
934名無しさん@お腹いっぱい。:2012/10/12(金) 20:09:51.12
>>933
日付は+1しないとダメだよ
935名無しさん@お腹いっぱい。:2012/10/23(火) 23:44:42.55
ネタ切れ
936名無しさん@お腹いっぱい。:2012/10/30(火) 14:47:21.49
すいません 教えてください。
あるMakefileの中に
変数:=XXXXX
変数+=XXXXX
の記述があるんですが、これってどう言う意味でしょうか
937名無しさん@お腹いっぱい。:2012/10/30(火) 14:57:50.73
938936:2012/10/30(火) 16:07:27.79
>937
だって、あちらは誰もいないみたいなんで
939名無しさん@お腹いっぱい。:2012/10/30(火) 19:36:36.28
それはスレ違いの書き込みしていい理由にはならない。
940名無しさん@お腹いっぱい。:2012/11/03(土) 22:03:05.39
makeのこときかれても.....
941名無しさん@お腹いっぱい。:2012/11/03(土) 22:57:10.70
だってワロタ
942名無しさん@お腹いっぱい。:2012/11/04(日) 10:42:30.42
chroot後に、プロンプトを変更しようとしています。
chroot /hoge export PS1="\u@\h \w->
プロンプト変更.shを作って
chroot /hoge /hoge/プロンプト変更.sh
としても、そのようなファイルやディレクトリはないと怒られます。
何故でしょうか?

943名無しさん@お腹いっぱい。:2012/11/04(日) 11:08:51.12
釣りか?
/hoge/プロンプト変更.sh は /hoge に chroot した後は /プロンプト変更.sh だろ。
944名無しさん@お腹いっぱい。:2012/11/04(日) 14:02:09.17
しかもプロンプト変更してすぐ終了するという意味不明な攻撃。
945942:2012/11/04(日) 16:21:56.21
失礼しました。
プロンプト変更.shの中にエラーがありました
>942
どちらも試しておりましたが、スクリプトのエラーで分からなくなっていました。
おっしゃる通りですね
>944
こちらも試しては見ていたんですが
chroot ./hoge /bin/bash; /プロンプト変更.sh でしょうか
ただ、これもサブシェル内での変更になるのでしょうか、思うようにはなりませんでした。
chroot ./hoge /bin/bash; export PS1="->"
でもダメなので、bashrcを書き換えないとダメでしょうか?
946名無しさん@お腹いっぱい。:2012/11/04(日) 17:02:21.41
chroot云々は良く分からんが
. プロンプト変更.sh
source プロンプト変更.sh
じゃねーのか
947名無しさん@お腹いっぱい。:2012/11/04(日) 17:19:49.94
ツェル
948名無しさん@お腹いっぱい。:2012/11/04(日) 21:39:42.26
シェルの内部コマンドと外部コマンドの区別をつけないと。
949名無しさん@お腹いっぱい。:2012/11/05(月) 01:35:08.60
外部コマンドcdという一見不可思議なものもあったりするけどね。
950名無しさん@お腹いっぱい。:2012/11/05(月) 09:36:46.07
>>945
面倒だから正解教えてあげるけど、キミ、全然理解していない。
次に来るときはシェルの入門書を1000回読み返してからくるように。

chroot ./hoge /bin/bash --rcfile /プロンプト変更.sh
951名無しさん@お腹いっぱい。:2012/11/05(月) 11:07:47.92
>>949
そのディレクトリにcdが可能かどうかチェックはしたいけど
カレントディレクトリを変更したいわけじゃない、という場合に使う。
952名無しさん@お腹いっぱい。:2012/11/05(月) 11:10:09.44
>>951
それは (cd hoge) で十分。わざわざ/usr/bin/cd hogeとかする必要なし。
953名無しさん@お腹いっぱい。:2012/11/05(月) 11:51:33.94
/usr/bin/cd を使っちゃいけない理由もない。
954名無しさん@お腹いっぱい。:2012/11/05(月) 11:54:39.66
じゃあ外部コマンド版の以下のコマンドの意味のある用途は?

alias bg fg jobs unalias wait

もちろん、「文法チェック目的」以外で。
955名無しさん@お腹いっぱい。:2012/11/05(月) 11:56:21.15
>>953
/usr/bin/cd を使っちゃいけない理由:

/usr/bin/cdがインストールされていない環境で動かないのでポータビリティを損ねる。
956名無しさん@お腹いっぱい。:2012/11/05(月) 11:58:35.93
>>955
インストールされている環境でしか使わないスクリプトなら問題ない。
957名無しさん@お腹いっぱい。:2012/11/05(月) 12:18:17.16
>>954
POSIX Shell & Utilitiesに適合するため。
958名無しさん@お腹いっぱい。:2012/11/05(月) 12:26:50.85
>>957
POSIX Shell & Utilitiesに適合することは意味のある用途じゃないので不正解。
はい、やり直し
959名無しさん@お腹いっぱい。:2012/11/05(月) 12:32:15.46
意味ってお前が決めるものなのか?
960名無しさん@お腹いっぱい。:2012/11/05(月) 12:32:57.29
/usr/bin/cd って、どのパッケージに入ってるの?
うちの環境だと無いっぽいわ
961名無しさん@お腹いっぱい。:2012/11/05(月) 12:37:40.88
>>957
/usr/bin/cd だったら、「cd可能かどうかチェックする」という具体用途が一応示せる。
(苦し紛れだろうけど)

そういう具体例を聞いてるんだよ。
たとえば /usr/bin/fg って何に使うの?
プロセス変わるからジョブコンできるはずないし。
962名無しさん@お腹いっぱい。:2012/11/05(月) 12:44:25.01
実は /usr/bin/cd なんて存在しないんじゃないか?
どこにあるんだいったい・・・
963名無しさん@お腹いっぱい。:2012/11/05(月) 13:29:24.71
Solaris とか FreeBSD にはある。

http://docs.oracle.com/cd/E26924_01/html/E29112/cd-1.html
これにも>>951しか用途載ってないな。
964名無しさん@お腹いっぱい。:2012/11/05(月) 14:25:29.24
用途ないってw
>>957の通り。規格読んでみ。
builtinもexec出来ないといけないから。
965名無しさん@お腹いっぱい。:2012/11/05(月) 14:27:27.34
なんでそんな規格になってるんだろね。
966名無しさん@お腹いっぱい。:2012/11/05(月) 14:50:01.96
>>964
builtinもexec出来ないといけないからという理由なら、
trapとかsetとかのbuiltinもexec出来ないといけないことになる。
(実際にはtrapとかsetとかは外部コマンド版はない)

なぜ cdとかaliasとかは意味のない外部コマンド版があって、
trapとかsetとかには外部コマンド版がないのか、という疑問は解決しない。
967名無しさん@お腹いっぱい。:2012/11/05(月) 20:50:10.49
とりあえず文句が言いたいならOpenGroupへ。
ここで意味がないとか言っても何も解決しない。
968名無しさん@お腹いっぱい。:2012/11/05(月) 20:52:30.50
文句はないけど疑問ではある。
969名無しさん@お腹いっぱい。:2012/11/05(月) 21:44:16.98
シェルやシェルスクリプトをよく知らない人が
「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
って決めちゃって、そんなの意味ないって下から指摘あったけど
決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
だから、実用性優先のLinuxとかではそんな変な仕様には準拠せず、
/usr/bin/cdとかアホなコマンドはインストールしないようになってる。
970名無しさん@お腹いっぱい。:2012/11/05(月) 22:01:57.65
>>969
> シェルやシェルスクリプトをよく知らない人が
> 「builtinコマンドもexec経由で起動できるように外部コマンドを配置」
> って決めちゃって、そんなの意味ないって下から指摘あったけど
> 決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。
それはどこ情報?
971名無しさん@お腹いっぱい。:2012/11/13(火) 10:00:15.55
find SOME_DIR -type f -exec SOME_COMMAND {} \;
で、SOME_DIR 内に一つ見つかったら一回 SOME_COMMAND して、それで終わり、
次のファイルはもう処理しない、という方法はありますか ?
-exit とかあったような気がして man 見直したら、見当たらない…
972名無しさん@お腹いっぱい。:2012/11/13(火) 10:57:30.97
-quitの事か?
973971:2012/11/13(火) 11:40:06.17
ありがとう! -quit だ。
しかし、なぜ man find に出てこないんだろう…
974名無しさん@お腹いっぱい。:2012/11/13(火) 11:42:39.49
うちの man には書いてあるけど。
975名無しさん@お腹いっぱい。:2012/11/13(火) 12:05:46.68
>>973
OSは何?
976名無しさん@お腹いっぱい。:2012/11/13(火) 12:18:32.27
GNU限定の話ってだけのこと
977名無しさん@お腹いっぱい。:2012/11/13(火) 12:22:31.28
* Copyright (c) 1991, 1993, 1994
*The Regents of the University of California. All rights reserved.
と書いてあるfindにもあるけど。
978名無しさん@お腹いっぱい。:2012/11/13(火) 12:34:55.40
ポジックス(笑)には載ってないから使っちゃ駄目
ハイ論破
979名無しさん@お腹いっぱい。:2012/11/13(火) 12:38:30.29
ポンッと押すだけでパッとつく
ハイポンパ
980971:2012/11/13(火) 13:17:00.75
Mac OS 10.8.2(Mountain Lion) の /usr/bin/find 。
-quit は、効くけど、/usr/bin/man find には出てこないという…
981名無しさん@お腹いっぱい。:2012/11/13(火) 13:43:17.37
Macは知らんわ。
982名無しさん@お腹いっぱい。:2012/11/13(火) 14:51:52.16
何なら知ってる?
983名無しさん@お腹いっぱい。:2012/11/13(火) 18:55:48.29
カレーパン
984名無しさん@お腹いっぱい。:2012/11/13(火) 19:03:34.72
manも完全じゃないしな

日本語manに至っては、数年前から誤記が放置だ
985名無しさん@お腹いっぱい。:2012/11/13(火) 19:12:08.46
manはobsoleteで今後更新されないから、
今後はアンサーブックを使えって聞いたよ。
もちろん閲覧はHotJavaを使うこと。
986名無しさん@お腹いっぱい。:2012/11/13(火) 20:28:03.43
>>984
お前も放置してる1人だろ。
987名無しさん@お腹いっぱい。:2012/11/14(水) 10:18:00.47
FreeBSDの find(1)のman に -quit ないね

MacOSXもその状況をひきずっていそう
988名無しさん@お腹いっぱい。:2012/11/14(水) 11:31:26.58
.\" $FreeBSD: head/usr.bin/find/find.1 240299 2012-09-10 07:56:59Z des $
にはあるよ。いつからあるかは知らない。
989名無しさん@お腹いっぱい。:2012/11/14(水) 12:06:38.79
コードの方は2008/2、マニュアルは2012/9だな。
コメントが
Document -quit, four and a half years after it was implemented.
だと。
990名無しさん@お腹いっぱい。:2012/11/14(水) 14:08:21.73
>989
まーじーでーーー
991名無しさん@お腹いっぱい。:2012/11/14(水) 20:51:36.07
だから、そういうおかしなmanページの差し替え版を売り、サポートもするという商売が
成り立つのだよね
992名無しさん@お腹いっぱい。:2012/11/14(水) 21:39:15.28
-quit なんてのは逃げだろ。
男らしくない。
BSD にはいらん。
軟弱な Linux でも使ってろ。
993名無しさん@お腹いっぱい。:2012/11/15(木) 00:12:41.93
こうして*BSDユーザのオサーン率が高まり、犬女ばかり増殖する…。

ってか次スレ建てろよ>>980
994名無しさん@お腹いっぱい。:2012/11/15(木) 16:34:11.28
{Free,Net,Open}BSDは人がいないからドキュメント更新遅れてる。
実物より古いバージョンのままなんて日常茶飯事。
995名無しさん@お腹いっぱい。:2012/11/15(木) 18:59:46.37
なぜ動かないのでしょう?

#!/bin/sh
/usr/bin/cc $argv[1].c -o $argv[1] -lm
996名無しさん@お腹いっぱい。:2012/11/15(木) 19:28:10.21
>>995
1点。

ハイ次の方どうぞ
997名無しさん@お腹いっぱい。:2012/11/15(木) 19:30:19.71
ガッコでは動いたんやshの場所もccの場所も確認したんや...
(´・ω・`)
998名無しさん@お腹いっぱい。:2012/11/15(木) 19:41:03.39
zshでも/bin/shで起動されるとsh互換になるはずなんだがな
999名無しさん@お腹いっぱい。:2012/11/15(木) 19:43:50.00
$argv[1] って・・・
/bin/shじゃねぇのか?
C,PHP,Perlとかならおkだろうけど
shなら$1ちゃうんかい?
1000名無しさん@お腹いっぱい。:2012/11/15(木) 19:45:03.49
スマソ
動いてはいるんだけども
cc:エラー:[1].c:そのようなファイルやディレクトリはありません
って怒られる...(´・ω・`)あるのに
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。