太古の昔に レイヤードシェル もしくは シェルレイヤー という物が存在していたらしいのですが、 どんな物だったのでしょうか? ジョブコントロールできるらしいのですが。
おつ
UNIXとかいう糞PCwwwwwww京とかいう存在しても価値ないただただ無意味に速度早くしただけのコンピューターとかもあるしww 何のための板だよここwww
ようこそ、その糞みたいな板にワザワザご苦労様。
Q. シェルは UNIX の勉強に使えますか? A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、 UNIX の勉強には向いていません。
>>6 頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw
>>2 GNUScreenから画面管理を引いたようなもの。
>>6 つまり座学で基礎理論を学んでから出直せってこと?
>>2 衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。
>>8 が端的に説明できてる。ただscreen知らないとわからない。
シェルといえば、ガソスタだろ?または、
>>10 だな。常識。
... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。
grepで取り出した10行のうちの2行目を取り出したいのですが、 何か簡便な方法はありませんか?
sed -n 2p
>>14 素人は grep 〜 | head -n 2 | tail -n 1 なんてするところだろうな
Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる
>>14 grep -A1
でいいじゃん。
一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。
>>17 それは一致した行の次の行を取り出したい場合だろw 欲嫁
なぜにfgetsじゃなくてfgetc?
…などとデバッグしてるぐらいなら head -n 2 | tail -n 1 の方がずっと早いな。
まあ、ふつーはそれすらせずに
>>15 だが。
「grepで引っかかる行が10行あります。これら10行それぞれの次の行(2行目)を 取り出したいのですが、何か簡便な方法はありませんか?」 という質問だったとしたら?
効率的には grep -m2 〜 | tail -n1 とかの方がいいのかね
質問がわかりにくくて済みません。実は
>>21 さんの意味で質問しました。
何か簡便な方法がありましたらお願いします。
>>24 次の行も欲しいってのなら
>>17 の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep 〜 | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ
26 :
25 :2012/06/09(土) 21:49:49.12
環境変数IFSってforとread以外に使い道あるのかしら
コマンドを実行した複数行の結果を変数に格納した後、その各行に処理を行いたいのですが、 たとえば hoge=`ls -l` とやると、改行が格納されません。 改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?
>>28 hoge=`ls -l` で改行は格納される。
echo $hoge ではなく、
echo "$hoge"
で変数の値を取り出すこと。
早速の回答、誠にありがとうございまする
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行分しか処理されずに止まっちゃうんだけど・・・泣
expectコマンドを使わずにシェルスクリプトでパスワードを自動入力させるにはどのようにすればよいでしょうか? #!/bin/bash ssh user@hostname パスワードを入力するコマンド 上記のようなスクリプトが作りたいです。 どなたか教えて頂けないでしょうか。よろしくお願いします。
>>32 echo unko | ssh user@hostname
>>33 試してみたのですが、パスワード入力を求められました。。
>>34 パスワード入力したいです。
>>31 20行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。
>>38 すみませんが詳しい方のみ回答をお願いします
>>31 > progress.log じゃなくて
>> progress.log じゃないの?
>>40 すみませんが詳しい方のみ回答をお願いします
パイプ出力なのに ls -1 とかやるのは素人
すみませんが詳しい方のみ質問をお願いしますw
>>42 すみませんが詳しい方のみ回答をお願いします
すみませんが詳しい方のご健闘をお祈りします
>>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
って感じにしたいわけだけど。
ちなみに39とかは質問者(31+46)じゃないから。 お願いだから邪魔しないで。
出力はまああまり気にしてなくて、 むしろ ./a.out a ./a.out b ====ここで止まっちゃう のが大問題。
>>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の位置なんだけど
もしかして実行開始してから端末閉じたりしてる?
>>49 丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。
> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?
>>50 俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか
>>51 めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。
少なくともバッチ処理なんだから nohup とか使うんじゃなくて batch とか at コマンド使うほうが素直な気がする。 もっともバッチ処理システム入れて管理すれば batch コマンド以上に いろいろかゆいところに手が届いていいと思うが。
echo *.csv | cat だとファイル名が表示されるだけで、 echo *.csv | xargs cat だとファイルの中身が表示されるのはなぜでしょうか? xargsを付けなくてもファイルの中身が表示されると思ってました。。
cat がそういう作りだから。 man cat 読め。
>>54 の挙動だと、
$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。
cat *.csv だとファイルの中身が表示されるのに、 echo *.csv | xargs cat だとそのようなファイルやディレクトリはありませんになることがあります。 man cat 読んでもわかりません。
>>56 cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?
>>57 *.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。
>>58 そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。
>>59 なるほど。ありがとうございます!
cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。
>>59 >*.csv にマッチするファイルがないから
*.csv にマッチするファイルはあります。
>>61 んじゃファイル名にスペースが入ってるとか。
ファイル名にスペースは入ってません。
>>63 んじゃ具体的にどういうファイルがあるの?
年金記録-'06〜'10.csv
' ' が解釈されちゃってるな。
>>65 これは非道い。
オレには、ファイル名にクオテーションやダブルクオテーションを含める勇気はないわ
>>65 んじゃこれは
*\'*\'*.csv
でいけるのかな?
>>68 そんなことしても xargsの段階で解釈されるから無理だろ
どうしてもecho使いたいって条件だとキツいね Linuxのlsなら-Qオプション使えるから ls -Q *.csv | xargs cat するかfind の -print0 と xargs の -0 組み合わせるぐらいだろうか。 まあfind使うならxargsじゃなくて-exec使えって話なんだろうが。
あとは普通にfor文使うとか ファイル名に空白がある場合は使えないけど $ echo -n *.csv | xargs -d ' ' cat という説もある
72 :
名無しさん@お腹いっぱい。 :2012/06/15(金) 07:48:47.63
すんません、ディレクトリツリー内で作成日時が最古のファイルを取得できるコマンドを教えてくださいませんか
>>73 すみませんが詳しい方のみ回答をお願いします
>>72 lsで日付順で取得してheadまたはtailじゃオーバーヘッド大きすぎ?
うちはめんどくさいからそれで済ませてるんだが
>>75 ディレクトリ「ツリー」だから、そもそもlsで日付順で取得できないだろw
あんまり巨大なツリーじゃなければ、zsh あたりで ls -dtr **/* | head -1 とかか。 お題としては、ls -D か stat あたり使って、 巨大なツリーで日付ソートしろっていう方が楽しいけど。 ただし、「作成日時」には目をつぶる。
そこ目をつぶっちゃだめだろw
lsって最終変更日時とか状態変更日時とかアクセス日時は取れるのに、作成日時だけ取れないのな。 知らんかった。すまん。
取れるかどうかの問題じゃなくて、その情報があるかどうかだ
>>72 find /dir -printf '%T+ %p\n' | sort | head -1
>>83 そういうのはいいです。エスパーなら最終更新日時と詠み換えるべき。
エスパーじゃないもの。 書いてあることしか読み取れんよ。
>>72 は聞いたっきり現れないな。
こりゃ釣られたか。
ツリーだけに…
88 :
名無しさん@お腹いっぱい。 :2012/06/15(金) 10:44:32.41
ぷぷ
89 :
名無しさん@お腹いっぱい。 :2012/06/15(金) 20:59:46.79
作成時刻を保持してるUNIX系OSってあるの?
UFS2にbirthtimeってのがあるらしい。
Linuxのext4にもbirth timeあるね
GNU dateが無いともう生きていけません 完全に陥落しました
前日の日付を取得するときとか。
それは定番の手法があるだろう。
GNU date使うと楽すぎて。
あと変数でn日前とかも楽。
こんな感じっすか。 env TZ=JST+15 date n=5 date -v -${n}d
n=20
タイムゾーンを取得する方法を教えな
ターイムゾーンと叫べ!
>>99 世界にはタイムゾーンがいくつもある、という事をよく分かっていない人が
そういう手法を取る結果、スクリプトがおかしな動作をする
…というところから、GNU版dateの拡張は始まっている
NetNewsがまだ生きてた時代の話
世界にはタイムゾーンはいくもあるけど、 サーバは1ヶ所にあって世界中を旅するわけではないので。
クライアントじゃなくてサーバかよw
WebAppフレームワーク系は複数のタイムゾーン扱う仕組み持ってるよ。 django1.4もmultiple time zoneが入ったばかり。 default time zoneもcurrent time zoneも取得できる。 夏時間と遠隔地絡んだ特殊な処理も標準的にできるようになった。 またWebAppサーバのdefault time zoneはサーバの物理的な位置に合わせていると限らない。 まあシェルスクリプトの領分ではないが。
date +%Z でいいんじゃね? sshした時にTZはクライアントのがいいか、サーバのがいいかなんて一意には決められないね。 環境変数TZは、最小限の手間でその辺のことうまく扱ってるね。
世界のどこか、例えばエスポレル共和国から日本のサーバにsshでアクセスし、 エスポレル共和国時間で12時間前の時刻を計算したいときって、どうすればいいの?
>>110 エスポレル共和国ってどこだか知らないけど、
タイムゾーンはどうなってるの?
それってsshで日本のサーバーにアクセスしてることと何か関係あるの? いったんログアウトしてエスポレル共和国のマシンで好きにやったらいいじゃんw
>>110 $ env TZ='エスポレル共和国のタイムゾーン' date --date='12 hours age'
でいいんじゃない?
GNU date依存嫌ならepoch time計算して。
114 :
ワラ :2012/06/19(火) 20:11:25.70
age→ago
>>113 でもそのスクリプトだと、別のタイムゾーンのどこかの国からアクセスした場合でも
アクセス元ではなく、常にエスポレル共和国の計算結果が出てしまうのでは
つまり「ログイン元のサーバのタイムゾーンをログイン先にも反映させたい」ってこと? それはsshのサーバ/クライアントの設定で環境変数TZを引き渡せるように AcceptEnv/SendEnvやPermitUserEnviromentするぐらいしかないんじゃなかろうか。
>>115 その先の創意工夫は自分でやるんだよ
なんでもおんぶにだっこじゃ教育によくない
>>117 最初の一行目に世界のどこか、例えばって書いてあるのになにいってんの?
なんか、途中から入ってきた人が意味取り間違えて会話してるね。 お題を整理しよう。 環境変数TZがすでに設定されている(日本時間とは限らない)場合も含めて、 GNU dateを使わずに、dateで1日前の日付(時刻)を取得する方法は? というのが元のお題。
>>120 GNU date ない環境では perl でワンライナー書いてたな。
perl すらない環境には当たったことがなかった。
BSD dateはいいのか?
>>123 なるべく汎用性が高い方法で、ってことじゃないなあ。
×じゃないなあ ○じゃないかな
JSTとかPDTとかってどうやって取得すんの?
>>122 perlといってもうちの環境じゃコアモジュールすら無いけどな
何をやるにも車輪作り直しだから楽しいといえば楽しい
コアモジュールなくても、timeとlocaltimeとprintくらいないの?
>>131 標準関数はだいたいある
昨日の日付くらいなら自力でなんとかなるよ
expectを使用してlsコマンドを発行、 その結果をスクリプト内の変数に入れるにはどうすればいいのん? コマンド発行まではググってすぐにわかったんだけど結果取得がよくわかんない(´・ω・`)
普通に ` ` じゃだめなん?
expect内でtelnet接続 その接続先でコマンドを発行して結果を取得したいのです…
それは大変高度な要求なので答える事が出来るのは日本に1人しかいない。
>>135 そういうことなら ssh 使う方が楽じゃない?
expect+telnetなんて使わずに普通にssh使え。
>>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"
}
自分で書いててなんですが、ls /var/log/wtmp でいいですよね。 出力行数をコマンド側で極力減らしておく、ということを言いたかったのですが 例としては不適切でした。
141 :
ワラ :2012/06/25(月) 23:34:27.36
回答が全て難しすぎてワロタ expect -c " spawn telnet 127.0.0.1 expect \"$ \" send \"ls\r\" expect eof " こんな風に書いてて 「よーしとりあえずexpectの外でecho $expect_out(buffer)を入れてlsの結果を表示するぞー」 とか思ってたらなんかどこに入れるかわからんかった というより、expectの使い方がわかってない気がした…
ふむ。 端からexpectありき、で考えること自体が間違っているわな。
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"
を下請けコマンドにしてやってみれ。(プロンプトは"ホゲ$ "と仮定)
質問者は名前書いとくれ。
148 :
133 :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.というエラーが…
むむむ…
ルータか? ならそれを先に言えよ。 そもそもls使えんのか?
150 :
133 :2012/06/26(火) 16:25:27.80
Yes シリアル接続のルータです lsは仮で使用出来るコマンドを発行してます でもexpect -f e.sh や expect e.shだとOKなんですが シェルスクリプト内でやると駄目だよーと怒られるんです(´・ω・`)
「駄目だよー」じゃわからん。
×シリアル接続のルータ ○シリアル接続が出来るルータ
ウソついたり隠し事したりするやつはめんどう見きれん。
154 :
133 :2012/06/26(火) 16:28:19.13
たぶんそれ出来ないよ。 だからperl何かをみんな使う。
>>154 それエラーじゃないでしょ。
向こう側が接続を切った、って言ってるだけ。
157 :
133 :2012/06/26(火) 16:33:03.55
>>155 そうなんだ…
>>156 expect e.shだと出来るんですよね
でもシェルスクリプト内で呼び出すと先ほどのエラーがでちゃう
うーむ…
>>157 標準出力が端末以外の状態だとダメなんだろ。
expect e.sh だとOKでも、
expect e.sh | cat ではNGとか。
だったら OUT=`expect e.sh` も NGになる。
159 :
133 :2012/06/26(火) 16:44:09.27
>>158 いえ、expect e.sh | catと打ち込んでも出来ました
でもシェルスクリプト内で
>>148 のようにするとエラーが返って来ちゃうんです
>>159 シェルスクリプトの「外」で、
OUT=`expect e.sh`
echo "$OUT"
って打ち込むとどうなる?
161 :
ワラ :2012/06/26(火) 16:49:51.33
J. Noel Chiappaさん、久しぶりだなあ。
162 :
133 :2012/06/26(火) 16:50:03.46
>>162 じゃあ、
expect e.sh > OUT
cat OUT
で妥協。
164 :
133 :2012/06/26(火) 16:57:30.29
>>163 ばっちり出来ますた!
ちなみに別ファイルを用意せずにシェルスクリプト内でexpect -c ""みたいにする事は出来ないのかな?
出来ないから別ファイル用意してexpectやperlを使用するようにと言われてるような気もするけど…
165 :
ワラ :2012/06/26(火) 17:02:26.40
出来るよ。
たぶんあんたが色々勘違いしてるだけ。
ルータの連続ログイン禁止に抵触してたり。
エラー処理がない
>>146 もどうかと思うけど。
>>165 連続ログイン?
そういったルールによるアクセス制御はありませんよ
ちなみにexpect -cだと具体的に
>>146 はどう書くんです?
全出力を他のファイルに落としてゴニョゴニョするよりperlのNet::Telnetでも使った方がいい気がする。
>>166 シングルクオートでくくって、¥等をエスケープするだけ。
>>166 expect -c "
spawn telnet ${HOST}
expect \"login: \"
send \"${USER}\r\"
expect \"assword: \"
send \"${PASS}\r\"
expect \"$\"
" > OUT
cat OUT
でもこうやって全出力を他のファイルに落としてゴニョゴニョするより(ry
一般論として考えよう。 コマンド > OUT cat OUT なら動作するのに、 OUT=`コマンド` echo "$OUT" では動作しないのって、どういうケースが考えられる?
どっちにしてもtelnetがconnction closedになる事はないです。
bashで、32bitや64bit等の固定幅整数の論理演算がやりたい時って、 普通はどうやるものなのでしょうか? 例えば左シフトする演算をやるとすると、固定幅でない場合は面倒です。 計算後に一々固定幅に除算するのは速度的にどうかと思うし、 皆さんがどのような手段をとっているのか、おすすめの方法を教えて下さい。
bashでやろうってのがどうかと思う。
>>173 bashなら64bit(符号付)で固定幅だよ。
左シフトしてオーバーフローしたビットは自動的にカットされる。
$ echo $((0x7fffffffffffffff))
9223372036854775807
$ echo $((0x7fffffffffffffff<<1))
-2
$ echo $((0x7fffffffffffffff<<2))
-4
>>175 1.
bashが64bit幅(符号付)というのは、bashの仕様でしょうか?
それとも、事実上、それが基本になっている事が多いということでしょうか?
2.
32bit幅の固定幅bit演算、符号なしの論理演算をする時は、
やはり %0xFFFFFFFF 等と、演算を行った後に
適宜修正して計算するのが普通なのでしょうか?
177 :
名無しさん@お腹いっぱい。 :2012/06/27(水) 23:10:24.88
ループバックってなんですか?
くるっと自分のところに戻る
で、結局ループバックってなんですか?
くるっと自分のところに戻る
だから、結局ループバックってなんなんですか?
くるっと自分のところに戻る
ルーフバッグってなんですか?
屋根袋
>>177 流れを読んでいないけど、
男なら黙ってmanだろ。
$ man -k loopback
lo(4) - software loopback network interface
$ man -k loopback loopback: nothing appropriate. $ man loopback No manual entry for loopback
そもそもどのループバックのことなのか。 シェルスクリプトとは別の話じゃないのか。
超エスパーすると、エコーバックのことを聞いてるとか
俺はレジ袋もらう派だ
それはエコバッグ
パラメータに空白で区切って複数のオプション入れて、 それをコマンド引数に渡すってことをやってたんだけど $ 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) は思いついたけどなんか嫌だし、副作用もあるので
そんな事にはならないけど? $ 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) ...
193 :
191 :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では起きてなかったと思う
ふつー、ポジションパラメータ
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
4.2.29でも同じだった
>>192 echo が引用符が除去するからそれをやってもわからない
set -xで見ないと
4.1でも3.2でも同じだから俺がエスケープされる仕様に気付いてなかっただけっぽ
>>196 set -xで見て付いてるクォートは実際には除去されるから問題ない
>>194 setでポジショナルパラメータに代入しても
結局ポジショナルパラメータの展開時にエスケープされちゃう
$*でも$@でも"$@"でも同じ
逆に*をあらかじめクォートしなければうまくいくようにも思えるが
クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い
>>198 set -xでやたら'が増えるのはわかってるけど、そういう問題じゃないから
コマンド引数として「*」記号を渡したい
あらかじめ文字列中に裸の「*」を入れておくとglob展開される
「'*'」や「\*」を入れておくとパラメータ展開時に'や\までエスケープされてしまうって話
>>192 の例でoが「'*'」の時
echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
記号「*」だけを表示して欲しいわけ
そのためにはoを「*」をにしてecho "$o"とやるしか方法がない
そういう仕様だからしかたないと納得した
つまり俺の
> パラメータに空白で区切って複数のオプション入れて、
> それをコマンド引数に渡すってことをやってたんだけど
がそもそも間違ってた。特殊記号が入る時はそういう事やっちゃいけないんだろう
>>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 "'*'"の結果が同じになるのは変だろ
201 :
200 :2012/07/02(月) 13:38:21.36
ああ、オプションだから、区切られないといけませんね。 後ほど
202 :
200 :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 これでまだ勘違いしていたら、夜にでも考えます
個人的にはbashとkshの両方で動くならArrayでいいかって気になってます 特にデータが外部から来る場合は"${array[@]}"がセキュリティ面を考えると安心だし
204 :
200 :2012/07/02(月) 19:47:27.73
変数を区切るのでもなければ、eval set は不要で単に set で充分ですね。 変な点はまだ有るかもしれませんが、まあ Array で動いていてそれで良いなら、 不要な様なのでこれ以上訂正しません。
↑リフレクト
戻り値がゼロのとき真 ってのやめてほしい
算術式展開では 真で1 ↓ $ echo $((123==123)) 1 算術式評価では 真で0 ↓ $ ((123==123)); echo $? 0 ・・・そういうものです
かき回すなよバカ。 echo false; echo $? 意味ねーだろ。
>>209 が 「echo false」で例えてるのが的外れ。
>>209 は
>>208 の意味を理解してない。たぶん、算術式評価を知らないと見た。
echo $((123==123)); echo $? じゃなくて、
((123==123)); echo $? を実行してるんだから。
それを踏まえたうえで、
>>207 が「戻り値のゼロ」を問題にしているのに、
標準出力の1/0を持ち出すのは「echo false」と同じくらい意味ねーといっているのだ。
わかるか? バカ。
罵倒はいらんよ。
>>211 >>208 が指摘してるのは、
戻り値では0が真だが、展開値を出力とする算術式展開では1が真だよという点。
で、その算術式展開と算術式評価もまた違うという点。
やっぱり
>>209 は算術式理解してなかったんだね。
>>211 は多分↓みたいなコマンド理解できないだろう。
$ ((0)); echo $?
1
↑結果は偽ね。
>>213 コマンドの戻り値が0で真が気持ち悪いというのが
>>207 が言っている事。
それに対して、算術展開とか持ち出した
>>208 の間抜けさを指摘しているのだ。 バカには難しすぎかい?
>>214 バカすぎる。つーか意味不明。当たり前のように理解不能。
行頭の$は何だよプロンプトか? w
>>215 >当たり前のように理解不能。
↑敗北宣言乙w
なんだbashの記法か。マジで知らんかったわ。w で、それが「戻り値が0で真は気持ち悪い」となんの関係があるんだ? マヌケ
ここはシェルスクリプトのスレなんだから、bashはbashスレでやれ。
分かってねえやつは黙ってろマヌケw
戻り値がゼロのとき菊地真
シェルから使う外部コマンドは正常終了するとき exit(EXIT_SUCCESS) するわけで /usr/include/stdlib.h:#define EXIT_SUCCESS 0 /* Successful exit status. */ になっているのだからしょうがないでしょうよ。
本当、ここはマヌケばかりだw 色々と勉強しなおせ
ん? 何スレか前の /dev/tcpで大恥かいた奴が暴れてるのか?w
>>222 しょうがないのはいいんだけど、こういうときに頭がこんがらがる
test -f hoge.txt が成功したら「真」だから
test -f hoge.txt && echo unko
のときにちゃんとunkoが出るんだけどさ、ここまでいいんだけど
test -f hoge.txt の結果、$?ってゼロじゃん? だからさっきのも
ゼロ && echo unko
みたいな感じで unko出ねぇ って一瞬思っちゃうんだよ
アゼンブラで、演算結果が0の時に Zフラグが1になる(0なのに1になる) という感覚に慣れていればどうってことない。
>>226 Zフラグでもなんでもどういうたとえを使ってもいいけど、
そのたとえを当てはめるまでにタイムラグがおこる
lua だと 0 でも 1 でも "" でも真だからどうってことない。
VMCPU="cotex-a8" QEMUOPTS="${VMCPU:+-cpu $VMCPU}" この文の VMCPU:+ ってのは何のためにあるんでしょうか?
>>229 >>229 $VMCPU に値が設定されている時のみ -cpu $VMCPU に展開する。
$VMCPU が設定されていない時に -cpu のオプションだけが QEMUOPTS に代入されるのを防ぐ。
>>230 だから、VMCPUには常に値を代入してるんですが、、
232 :
229 :2012/07/10(火) 22:34:35.51
>230 :- :+ := こんな使い方があったんですね。ありがとうございました
##### 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" また、この点に気を付ければ良い等、機械的に安全を得るやり方は有りますか? もしくは、皆さんが使用時に、気を付ける点などあればご教示下さい。
> 機械的に安全を得るやり方は有りますか? 無い。信頼できるソース以外からの文字列をevalしてはいけない。
そもそもevalなんて滅多に使わないしなー。 evalを頻繁に使うようなトリッキーなコードは読みにくくなりがちだしね。
configure発明したやつに言ってやってくれ
発明w
configureは人間が読み書きするものじゃなくてautoconfに作らせるものだから
公開鍵を使わず、パスワード認証で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されませ。 どこがマズイでしょうか?
カンマが一つ抜けてるんじゃねーの
241 :
239 :2012/07/13(金) 22:57:53.20
>240 カンマ抜けてました でも、カンマいれると全てが1行表示になりました。
cat /var/log/auth.log | grep "Failed password" ここが環境依存だから答えられん。 awkに対してどんな入力を期待してるの?
関係ないけど、grep|awk っていうパイプラインよく見る気がする。 ついついやりたくなるのは分かるがawkがかわいそうに思えてくる。
awkはちょっと強力なcutという用途にしか使われてないことは多そうだな。 かと言って全部awkでしちゃうとgrepとかsedの立場がなくなる。
最初のcatが無駄だろっていう人は最近来なくなったのねw
cat使ったほうが分かりやすい
catを使わなかったら、ファイルを対象にするコマンドと、パイプで入ってくるものを 対象にするコマンドが混在することになるからな 出力はcat、処理はパイプ、と分けた方が、保守性は高まるんじゃないかな
cat議論は一スレで二回ぐらい発生するのが恒例行事。
議論され尽くしてるものの議論は、やはり面白いですな
>>243 ,244
わかるわww
ただawkを使いこなせるようになるには時間がかかるし、若い奴にこんな時代遅れなものを今から全部学べとは言えないからな。
必要最小限な使い方だけ教えると、grepやsedやuniqなんかと組み合わせた使い方をしてくるんだよね。
251 :
239 :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 のアドレスでまとめたいだけなんです。 連続したアドレスをまとめて、カウントできれば
テンプレやいろいろな場所でcshがヤバめというのは自覚してるんですが教えてください。 あのcsh使わされてるんですけど標準入力のアスタリスクを文字として扱えないんですけどどうしたらいいんですか。 標準入力からsetした変数でいろいろ分岐したいんですけど*を入れた場合だけ構文エラーとかワイルドカード展開になってしまいます。 ちなみにUNIX環境は全くわかりません。 マジでお願いします。
>251 なら前半は awk '/failure/{print $1,$2,$3,$(NF-5),$(NF-3),$(NF-1)}' /var/log/messages で済みそう。時間的な連続性を気にしなければ数え上げもawk内でやりたいが。
254 :
251 :2012/07/14(土) 09:00:52.31
>253 failureの行をつかうたんですね 思うように集計されないのは、uniqの使い方に問題があったみたいです。 sortが前提みたいですね。 ただ、時間的に連続したfailureのアドレスをまとめたい、できればカウントつきで
数え上げはawkじゃなくてuniq -cあたりに任せたいところ。
アドレスだけでいいならuniq -c -f 4じゃないの?
>>252 こういう事か?
set hoge = "$<"
echo "$hoge"
今月はじめ、職場に新しいPC(Core i7の結構ハイエンド構成)が入りました。 多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを 使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは #!/bin/tcshという文字列でした。 「うへぇ〜、よりによってtcshかよ」 ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、 今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、 今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、 スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。 おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が 強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。 昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。 これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか $<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって 実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し (だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。 そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が 再現され、それに巻き込まれるのでしょう。もう今からうんざりです。 だからお願いです。教育現場ではbashでもzshでもkshでもashでも Bourne shでもなんでもいいですがBシェル系のシェルにしてください。 教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
どうでもいいけど日本のシェル界なんてものの存在を初めて知った。
Solaris編もあったね
シェル王が住んでる。
なんでこんなコピペ気にいったんだこいつ。
>>262 サルにマスかき覚えさせると血が出るまでやめないのと同じだよ
覚えたてで嬉しいんだろう
多分、覚えたてのコピペを貼るように
>>252 が釣った。
今時csh使ってるところなんかあるわけねーだろ。
コピペだったのか。マジレスしそうになったよw
コピペはさておき、カーソルキーでヒストリ機能を使おうと思うと tcshが一番手っ取り早い時期があった bashでの、カーソルキーによるヒストリ機能の正式サポートと実装は、 netnewsでは結構祭レベルで好評だったのに対し、fj界隈では カーソルキーなんて使わないじゃんSVR4とかwwwみたいに ガラパゴスってた事が、tcshユーザが大量生産したことと 因果関係は有ると思うね
ガラガラ話にしても仕方なかろう BSD界隈では csh 系にそれなりの人気があり FreeBSD なんかデフォルトのshellは未だにcshだ(実体はtcsh)
WITHOUT_TCSHで問題なく動くけどな。
FreeBSDはなんで今でもcshがデフォルトなの?何か理由あるの?
BSD だから,に尽きるんじゃないかな
そもそもcsh自体がBSD発祥なんだっけ
宗教上の理由でbashが使えないから
bashはGNUライセンスだからなんじゃないの?
パブリック
>>273 Bill Joy先生の作品ですよ。
ジョブコントロール関係のカーネル拡張も。
他にはviとか、page単位の仮想記憶とか。
近代的なUNIXカーネルの創始者の一人。
cshスクリプトの是非については、
csh programming considered harmful.を読めばいい。
Linux、bashを使用しています シェルスクリプトを書いたのですが、 そのスクリプト(***.sh)が入っているディレクトリと入っていないディレクトリで 挙動が変わってしまいます これはもともとそういう仕様?なのでしょうか それとも書いたスクリプトに間違いがあってこうなっているのでしょうか すみませんがアドバイス宜しくお願いします
相対パスつこうてるんやろ
カレントディレクトリという概念を理解してない。 カレントディレクトリはスクリプトの属性ではなくプロセスの属性。
>>279 パスはその都度引数で指定する仕様で
絶対パスで指定しているのでそんなことはない、と思うのですが…
>>280 カレントディレクトリで、なおかつそのスクリプトが入ってるときにしか
動作しない、ということでしょうか…?
すみません、浅学でしてLinuxに関しては学び始めたばかりなのです
別にLinuxだけの話じゃ無さそうだな
付け足しですが、こちら「for FILE in _______________」となっていて inの後ろを穴埋めしろ、という課題なのです 拡張子はtexやdviに限る必要はありません ただし何かしらの文字列を含まないファイルを 一括で削除するスクリプトを作りましょう、ということなのですが…
ls "$DIR"の間違いだろ。 grepのところもegrep -v ".tex$|.dvi$"くらいの意図か?
>>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だたハズカシー
>>285 >「for FILE in _______________」となっていて
>inの後ろを穴埋めしろ、という課題なのです
変な課題w
課題関係なしなら
↓で、grep使わずにできる。(lsも使わずに内部コマンドだけで)
cd "$DIR"
for FILE in *
do
case $FILE in
*.tex|*.dvi);;
*) rm -i "$FILE";;
esac
done
無理矢理「for FILE in _______________」の中に別のfor文入れちゃえ。 正常に動くよ。 for FILE in `for f in *; do case $f in *.tex|*.dvi)echo "$f";;esac;done` do 以下略
>>288 なるほど…ありがとうございます
検索条件に.○○はダメだったんですね
>>290 正直別なところもいじらせてほしいですorz
スクリプト例もありがとうございます、参考にさせて頂きます
>>291 その手がありましたね…!>for文入れる
有り難うございます、これで行けると思います
長々とどうもすみませんでした
アドバイスしてくれた皆様ありがとうございました
あのさぁ…ま いっか
ls に絶対パス出力するオプションあるんじゃねーのと思ったらそんなことはなかった find 使えばいくね? find "$DIR" -maxdepth 1 -type f ていうかHOME以下のファイル消すスクリプトとかこえーな
>>291 面白w
find -E "$DIR" -type f -regex '.*\.(conf|wrapper)$' -delete
でいいのに
制約があるので
>>291 よりおふざけ感が低減される
for FILE in `find -E . -type f -regex '.*\.(conf|wrapper)$'`
do
以下略
>>295 find -E "$DIR" -type f -regex '.*\.(tex|div)$' -delete
for FILE in `find -E "${DIR}" -type f -regex '.*\.(tex|div)$'`
>>292 grep -v -e .tex -e .dvi
egrep -v ".tex|.dvi"
12行目あたりに echo $FILE いれるとか、内容をチェックしてみる癖はつけたほうがいいぞ。
検索語がまずいのか調べても分からないので、教えてください。 デスクトップ環境(X Window上)のターミナルエミュレータか、 sshログインしたときなどのコンソール上かで、シェルスクリプトの挙動を変えたいのですが、 どのような工夫をすればよいか、何で条件分岐すればよいのか思いつきません。 お願いします。
ターミナルエミュレータからsshログインしたときは?
>>299 > デスクトップ環境(X Window上)のターミナルエミュレータか、
DISPLAY環境変数が設定されていれば。
> sshログインしたときなどの
SSH_CLIENT環境変数が設定されていれば。
> コンソール上かで、
ttyコマンド使えばこれも判別できる。
すみませんが詳しい方のみ回答をお願いします
>>301 ありがとう。DISPLAYはsshログインしたときでもたまに設定するので使えません、
ttyコマンドの出力を使う方法は、仮想コンソールだと区別が付きそうですが、
sshログインした場合は区別が付きませんでした。
SSH_CLIENTを見てみました。
SSH_CLIENT, SSH_TTY, SSH_CONNECTIONはsshログインしたときのみに設定されるようなので、
これを使って条件分岐することにします。
ご教示感謝します。
>>300 さんもありがとうございました。
余談だが、 コンソールってのは本体に物理的に接続されてるキーボード/ディスプレーのことな。 パイプオルガンの鍵盤の付いた演奏台由来の名前。 パイプオルガンの本体はパイプだから。
先生!ターミナルとコンソールってどう違うんですか?!
コンソールはホスト本体の画面とキーボード。 ターミナルはあくまでも別の機械からのリモートログイン。 xtermなどのことをターミナルと呼んでしまうこともあるが、 正しくはターミナルエミュレータなので、純粋なターミナルとは異なる。
>>306 本体に接続されたディスプレイとキーボードを使うのに「ターミナル(遠隔操作端末)エミュレータ」だから直感的に混乱するよね。
/dev/pts (/dev/pty), /dev/tty, /dev/console とかのデバイスによって、コンソール、端末(ターミナル、物理端末、制御端末、広義のコンソール等)、 疑似端末(仮想端末、仮想ターミナル、シュードターミナル等)が分かれる。(はずです。多分。) カーネルをロードしてinit起動してるやつがコンソール LinuxとかでAlt+2とかで切り替えられる奴がターミナル 他が疑似端末 でOK。(だと思う。多分。) コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず、あとデーモン類とか 端末持たないプロセス(ps -efとかで見たとき端末のカラムが?になってるプロセス)が標準出力の代わりに/dev/consoleにメッセージ出してきたりする。 まぁ組み込み系の人以外、端末、ターミナル、コンソールをあまり区別せずに使う場合のが多いし、 大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
>>308 > コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず
スレ違いな上に出鱈目。最低だ。
うん、ムチャクチャにもほどがある。 >大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。 自分がちゃんと覚えていないなら、それをわきまえて黙ってろ。
端末のことを英語でターミナルって言うのも知らないんだろな。 端末とターミナルを別物のように説明してるしw
>>308 がフルボッコにされてるから読んでみたけど
たしかにこれはひどいな
>>309 古典/bin/shなrootログインでしかコンソールを触ったことがなかった爺と思われ。
SunOS辺りか?
cp file1 /mnt/file2 & みたいにやっておいて、 mv file2 file3 した場合、最初のコピーにmvが追いついた時ってどうなるの?
>>314 この場合のmvは同一ファイルシステムだから、
実際にはrename(2)が呼ばれるだけで、
cpでコピー途中かどうかに関係なくファイル名だけがリネームされる。
また、リネーム後もcpはオープン済みのファイル記述子でコピーを続けるので
コピーも無事file3に対して行なわれる。
よって無問題。
>>315 あ、ごめんなさい、
mv /mnt/file2 file3
でした。この場合も問題なしですか?
>>316 異なるファイルシステムの場合は
mvが追い付いてしまったらそこでEOFとみなされるので
file3は後半が切れた短いファイルになる。
mvによるコピー後、mvはfile2をunlink(2)する。
cpはファイル記述子でコピー中なので、unlink(2)に気づかずにfile2にコピーするが、
file2はそのまま消滅する。
よって問題あり。
最近はこういう自演が流行ってんの?
自演じゃないよ。
unlink相当の事をした時にどうなるかは、使ってるファイルシステムに依るんじゃないかなぁ
UNIX由来のファイルシステムで判例ある?
>>321 いや。
OSがUNIXなら、たとえFATファイルシステムであっても
unlinkの挙動は同じになってるよ。
(unlink後もfile descriptorで書き込み等可能、プロセス終了で実体削除)
ふーん、どうやってるんだろう。UNIXのファイルシステムと違ってunlink して(ディレクトリエントリから削除)実体を解放しない(FATには残ってい る)状態は、ファイルシステムとして壊れた状態なんだけど。
どうやってるんだろうとか言ってないで自分で試せよ。
>>324 全員closeするまでunlinkされないよ
>>327 ディレクトリからunlinkはされるけど
closeするまで実体は隠れたところに残ってる、が正しい
それunlinkじゃなくてrenameじゃね?
ねぇ、この照れ隠しっていつまで続くの?
>>329 いや、renameじゃなくてunlink。ディレクトリ上にはどこにも存在しない。
>>326 NFSだとサーバ実装にもよるんだけど、
オープンされてるファイルをunlinkすると.nfsXXXというパス名にして、
ls -aなら見えるタイプの実装があるね。
本家のSunOSがそうだった。
今時の商用NASは見えないのが多い。
>>324 ファイルシステムとして壊れた状態かどうかはOS側の解釈に過ぎない。
unlinkして実体を解放しないまま何らかの原因で強制ummountされたら、
fsck_msdosfs(FreeBSD)またはfsck.msdos(Linux)で修復できる。
通常のUNIXのファイルシステムのfsckの場合ととくに変わらない。
>>332 最近のLinuxのNFSサーバも同じ挙動をする
NFSv3かv4の仕様なんだと思ってた
いや.nfsXXXは仕様じゃない。(NFS3以降はRFCになっているので仕様が読める) NFSは仕様上、ファイルサーバがクラッシュした後、再起動すれば、 クライアントがオープンしていたファイルについて問題なく処理を続行できる必要がある。 そのため、回収されてしまわないようピン止めしているだけ。 商用NASでは.nfsXXXではなく不揮発メモリ上の内部DBに格納して保存している。
以上、知ったかの
>>324 君の照れ隠し&自爆をお送りしました。
十分お楽しみいただけましたか?
それでは次の方どうぞ
↓
↑リフレクト!
340 :
名無しさん@お腹いっぱい。 :2012/07/20(金) 23:28:32.13
cat file1 file2 ってやると file1 のあとに file2 がつながり以下の様になりますが a b c 1 2 3 下のようになるコマンドってありますか a1 b2 c3
つ join
>>340 補足すると、デリミタを空文字にするようにオプション付けてね。
paste -d '' file1 file2
346 :
名無しさん@お腹いっぱい。 :2012/07/21(土) 16:48:21.35
cpuの使用量を確認するのにtop/psを利用しているのですが、 ppid指定で子プロセスの累積値を出すオプション等ありますか? 軽いプロセスをループで呼び続けてるものがcpu%でソートした場合 浮かんで来ないというのを解決するのが目的です psを利用してppid指定で自前っていうのをやってみようかと思いましたが それだと、目的の物がpsに出てくる間隔で呼び続ける必要になりそうなので 「軽いプロセスを呼び続ける」ものを監視したいっていう目的に反してるなと・・
>>346 Linuxなら、psに S オプションを付けると子プロセスのCPU時間が親に加算されるけど。
xinitを打つと左上に白のシェルが出てプロンプトは実行できるようですが、 マウスが反応しません。あ、マウス自体は動いてるんですがクリックしても 何もなりません。タスクバーとかはどうやって出すんですか?
xinitじゃなくてstartxでどうよ? というかシェルスクリプトか?
dwm入ってる?
>>348 gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
すみませんが詳しい方のみ解答をお願いします。
スレちがいの戯言は放置するスルーカを習得しよう。
もしかして:ヤリイカ
いや、モンゴウイカじゃね?
>>353 xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
>>357 352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
>>358 おう、そうか。スルーしよう。ありがとう。
360 :
名無しさん@お腹いっぱい。 :2012/07/27(金) 20:48:33.81
標準出力はそのままに、標準エラー出力だけgrepかけたいとか 思うんだけど、どうしたらいいでしょか
>>360 ((コマンド 2>&1 1>&3) | grep hoge) 3>&1
興味本位で聞いただけかよ。無礼な奴だ。
アスペさんちっす
>>361 サブシェルが1個無駄です。
(コマンド 2>&1 1>&3 | grep hoge) 3>&1
---
サブシェルなしにもできます。
exec 3>&1
コマンド 2>&1 1>&3 | grep hoge
すみませんが詳しい方のみ解答をお願いします。
>>366 興味本位で聞いただけかよ。無礼な奴だ。
学校の技術の時間、コンピュータについての授業があった。 「コンピュータにはいろんなシェルがある。みんなの知ってるシェルを1つずつ 挙げていこう。誰かわかる人?」と先生が言った。 エクスプローラは真っ先に答えられた。 誰かがGNOMEと答えたが、先生はNautilusと修正して黒板に書いた。 command.comという声も挙がった。 そのあと隣の奴がDOS窓と答えた。 すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。 キミの答えはここに既に含まれているという、ちょっと屈辱的な対応だ。 満を持してボクは手を挙げて答えた。「bash」 すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
FreeBSDがLinuxに含まれるってやつのコピペだよ
360じゃないんですが if ! ERROR=$(command 2>&1);then exit 1 fi で、commandが正常終了しても、successedなどのメッセージが返されて 全て、if中に入ってしまいます。 ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
手作りと言ってお店のおにぎりを差し入れしてやったわ! フハハ!
>>373 こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
ばかもん、commandの正体が何かを推察するエスパー検定じゃ。やり直し!
377 :
373 :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 終了してるみたいで 本当にここか確かめては無いんですが、
再現テスト $ if ! ERROR=$(echo test; true); then echo "$ERROR"; fi $ if ! ERROR=$(echo test; false); then echo "$ERROR"; fi test $
$()はash依存だから禁止。 はいロンパー
再現テスト $ ERROR=`echo test; true` || echo "$ERROR" $ ERROR=`echo test; false` || echo "$ERROR" test $
381 :
名無しさん@お腹いっぱい。 :2012/07/28(土) 17:59:00.49
$()が使えないシェルなんて無視していい。
ロンパー、ロンパー、ロンパー
大手SIerでは$( )は使わないのが常識です。
じゃあ、bashでもzshでもkshでも使える (( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。 使えないのはashだけだし。
使えるならどんどん使っちゃえばいいと思うよ。 せっかく作者が用意してくれた機能なんだし。
>( ) や <( ) は使っていいですか? posixでは使えませんが。
387 :
名無しさん@お腹いっぱい。 :2012/07/28(土) 22:36:30.01
>>384 そいつらはPOSIXで定義されてるの?
(( )) は定義されてる
・bash/zsh/kshの共通項に合わせる か、 ・純shに合わせる かの2択。(posix(笑)は現実的じゃないから判断基準にならない) ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。 あと、ashで仕様の違う「let」コマンドを廃止しろ。
>>390 ・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
>>386 >( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
393 :
377 :2012/07/29(日) 09:15:42.62
やはり、エラーの判定になってますが、genext2fsは成功しているな E: genext2fs: output filesystem image: Success この場合、結果を標準エラーのみにするには、どうすれば良いですか?
>>393 もしかして genext2fsって正しいexit statusを返さないんじゃないの?
標準エラーのみにするには、
if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..
2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
ashを否定したせいでposixまで否定する羽目になっちまって大変だな。ロンパー爺さん。
俺はash関係なくPOSIXには否定的だけど、何の話?
>>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の共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
>>398 bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。
一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
ポータビリティが必要ならシェルスクリプトは使わないで下さい。
POSIXには現物がない。ハイ、ロンパー
>>399 > bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
POSIXには現物シェルがない。だから机上の空論って言われるんだよ。
マニュアル3冊のAND取る作業は楽しいかい?
当然のごとく複数のシェルのマニュアル参照しながらやってるけど、 煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人? 他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので 複数のOSのマニュアルをすぐに見られるようにしてある。 プロなら当然だよな。
末端のプロ(笑い)が家内制手工業でANDとってる姿があわれ。 POSIXがAND取ってくれてるんだからそれを使えばいいのに。
>>406 POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
また通信系SEプロさんですか
posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
>>407 動くよ。動かないというなら実例を挙げる事。
bash/ksh/zshのバージョンはどうするんだろう? どれも最新のバージョンを使うこと前提?
夏、だなぁ 通信業界さんも夏休みですか?
なんでやねん。欲嫁。
>>409 見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。
どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
POSIXには現物がない。ハイ、ロンパー 覆すにはPOSIX通りに実装したシェルを作って持って来い。 (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
ふーむ、3つのシェルのANDとった規格(笑)と合同なシェルは存在するのか? (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
>>418 直接存在しなくても現物シェルのANDで表せるんだからOK。
POSIXの場合は現物シェルのANDでも表せない。
その現物シェル達はお前が言い出した条件満たしてないじゃん。 > (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン) それともAND規格でのみ動作するとかいうスイッチでもあるのか?
むかーし見た流れだな 自称プロ(夏休み中)はスルーでよくねえか
>>420 POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。
bash/zsh/kshは現物シェルのANDで表せる。
実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。
POSIXではそれができない。
posixか、bash/zsh/kshのand?かで議論されてますが、 /bin/sh主義の私はどうすればいいでしょうか?? /bin/sh主義的にもposixは糞であることに同意ですが。
424 :
名無しさん@お腹いっぱい。 :2012/07/29(日) 13:33:07.06
自分から言い出した条件をあっさり撤回して意味不明の言い訳繰り返す 家内制手工業のプロさん。 > (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
>>423 v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
POSIXには現物がない。ハイ、ロンパー
AND規格には現物がない。はい、ロンパー
>>427 bashもzshもkshも全部AND規格(笑)の上位互換
>>428 それ以前にPOSIXには現物がないんだから
>>428 では論破になってない。
A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
>>439 > それ以前にPOSIXには現物がないんだから
>>428 では論破になってない。
それ以前にAND規格には現物がないんだから
>>426 では論破になってない。
> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが
>>426 > A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。
現物がないという条件なら両方同じと言っているだけだ。
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
夏はまだ、始まったばかり。
>>423 VMwareの上でSolaris2.5を動かして確認してる。
AND規格の現物シェルは存在しない。はい、ロンパー
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
スーパーセットなシェルじゃダメだという主張は引っ込めるのか? > (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
bash/zsh/kshのANDは、現物シェルのANDのスーパーセットじゃなくてイコール。 ハイ、ロンパー
>>439 ↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?
$ bash script
$ zsh script
$ ksh script
ルイージ理論的には違う。はい論破www
飽きない?
どうでもいいが、$ zsh -y script にするべきだな。 SH_WORD_SPLITを有効にしないと互換性ないよ。
うつみみどり
ハイハイロンパールームロンパールーム
家内制手工業の自称プロはANDとる作業に戻ったらしい。
久しぶりに来たら変なの湧いてるな。
ash, bash あたりは POSIXシェルの現物じゃん。
zshは
>>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)
基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)
とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
bashで書いておいてbashがない環境ならbashをインストールする。 って手段すら取れないような環境にいるやつってどれだけいるんだろ。
まあそれで良ければbashでもいいと思うよ。 でも、ちゃんと言語仕様を勉強してれば、POSIX範囲内で書くのも苦じゃ ないので、bash入れる手間はたいしたことないけど、それも省くために POSIX範囲内で書くってのもアリでしょ。 もっと多いのはオープンソースでソフトウェアを配布する場合で、 *BSDとかDebianとかはbashが入ってる保証はないから(入れるのは簡単だけどね)、 POSIX範囲内におさまるように(時にはv7 シェル程度でも動くように)書くのが普通。
さすがにシェルファンクションないv7はない。
まあ自分で普通に書く場合は、それが最低譲れない線だわ。 ただautoconf使う場合は、autoconfマクロでシェル関数を代替できるので、 シェル関数使わずに書くけど。
autoconfマクロじゃなくてm4マクロと言うべきか? まあ意味分かるよね。
posixでは、echoには -n -e とかのオプションがない。 常に、-e オプションが付いたような状態で動作しなければならない。 例えば echo 'hoge\c' で改行なしになるとか、 echo -n は -n をそのまま(改行付きで)出力とか。 FreeBSDのashはその仕様に従っていないので、 posixだけ見て書くとechoの部分が正常に動かない。 だからposixには実用性がない。
man echo に、echoはポータビィリティに問題があり、代わりにprintfが使えると書いてる。
ばんな
>>454 それは知ってるよ。
ashはposixを満たしてると言う主張に対する反論ね。
>>454 FreeBSDのashにはprintfが組み込まれてない(外部)ので、
printfの使用はパフォーマンス的にダメージ。
実際、FreeBSDのスクリプトはechoが多用されてる。
> 常に、-e オプションが付いたような状態で動作しなければならない。 ダウト。-nは実装依存と書かれているわけだが。
>>458 いいや、バックスラッシュ付き文字の解釈は必須。
-n はオプションではないとも明記されてる。
実装定義と書かれているわけだが。 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.
>>458 > -nは実装依存と書かれているわけだが。
実装依存なら使っちゃダメじゃんwww
FreeBSDのrcスクリプトは echo -n バンバン使ってるぞ。
この件だけでも「POSIXだけ守ってれば良い」の反証として十分だよね。
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はオプションじゃなく文字列として扱え、 以下の(\)シーケンスを認識しろ、 と書かれてるね。
それはここでbash依存の質問をしてくるようなもんw
>>461 FreeBSDが使っている事と「POSIXだけ守ってれば良い」は全く独立なわけだが。
>>462 それはSUSv2。POSIXじゃない。
お前ら、ちゃんとdashのことも考えろよな
>>464 いや、ここでは「POSIXだけ守ってれば良い」が否定されればそれでいいので
もう結論が出たよ。
>それはSUSv2。POSIXじゃない。
いや、POSIXだよ。1997年のだけど。
少なくともこの時点でのPOSIXがこんなことを言ってたんだから、
役に立たないというのも判ろうもの。
>>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 な仕様を利用するのは駄目だが。
>>467 >OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>んだよ。undefined な仕様を利用するのは駄目だが。
後出し条件追加ですか?w
>>それは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 って書いてある。
>>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい >>んだよ。undefined な仕様を利用するのは駄目だが。 > 後出し条件追加ですか?w オイオイ、規格書の読み方も知らんのか… もし implementation-defined な仕様の利用が許されないのなら、 そもそも、なんでわざわざそんな仕様を決めるんだよ。 状況が許せば使っていいからに決まってるだろ。 規格書読む上では、implementation-defined と unspecified と undefined の 違いくらい常識だから、勉強しておくように。
>>470 論点がずれてるし、そんなこと言ってないよ。
「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
>>471 嘘書いておいて、謝罪もなしか、厚顔無恥とはお前のためにあるような
言葉だな。
> 論点がずれてるし、そんなこと言ってないよ。
> 「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
論点がずれているのは、おまえさんの方。
もともと「POSIXだけ守ってれば良い」っていうのは、
「ポータブルなスクリプトを書く」という目的を達成するための手段の話だ。
FreeBSD の OS 附属のスクリプトなんて、ポータブルである必要がそもそも
全くない。シェルは ash、OS は FreeBSD だけ考えれば十分だ。
だから、POSIX を守る必要なんてそもそもない。
そういうものを挙げて「POSIXだけ守ってれば良い」っていう意見への反論だと
思うってことは、お前がそもそも、何の話をしているのか理解してないって
ことだな。
>>472 >だから、POSIX を守る必要なんてそもそもない。
↑
POSIXを守る必要なんてそもそもないんですね、駄目押しありがとう。
家内制手工業に従事する自称プロは「POSIXだけ守ってれば良い」とかいう
命題勝手に作り出してそれを強制終了する以外にチンケなプライド守る方法が
無くなってしまったんだよ。
元々の噴飯ものの主張が
>>390 > ・bash/zsh/kshの共通項に合わせる
> か、
> ・純shに合わせる
> かの2択。
それで、共通項は手作業でAND取るんだって。プロwww
これでechoにかかわる非互換はどう解消されるんだろう。
なんだ、最初から「FreeBSD でだけ動けば良いスクリプト」の話をしてたのかよ。 そういう限定した話を、OS限定しないスレで明示せずに主張してたのか。 悲しい奴だな。 一応指摘しておくが、たとえ「FreeBSD でだけ動けば良いスクリプト」を書く 場合でも(POSIX を守る『必要』はないが)、「POSIX を読んで理解しておく」 方がいいことは明白だ。 POSIX を参照せず、個々のシェルのマニュアルだけ読んでいるってのは、 C++言語の仕様も知らずに、Visual C++ のマニュアルだけ読んでるってのと 同じで、全く褒められた話じゃないからな。 もちろん、ash/bash/zsh すべてで動くスクリプトを書くつもりがあるのであれば、 たとえ FreeBSD 限定であっても POSIX を読んでおいた方がいい。その方が 知識取得の効率がいいからな。 ash/bash/zsh すべてのマニュアルを読んでおくのも勿論良い姿勢で、これまで それで済んでいたのは分かるが、効率の点からは POSIX を読まないというのは 損であるとしか言いようがない。まあ自分の時間を無駄にしたいのであれば、 それでも構わんが、一般論としてスレでそれを主張するのはやめとけ。
>>474 >これでechoにかかわる非互換はどう解消されるんだろう。
AND取る時点で自動的に解消されてるよ。
>>476 はあ?
bash/ksh/zsh/ashで動くスクリプト要求されたらどうするんですかあ?
ANDが空集合だから出来ません。と断るんですか? www
プロは仕事を選ぶ www
なんでこうトロくさいやり方に固執するかねえ。まあ、これまで うまく いってたやり方を続けたいってのは人間の性質としてありがちではあるが。 ちょっと考えれば全部読んでANDするなんて効率悪いことぐらい分かりそうなのに。 エンジニアだったら、時間を効率的に使うことが美徳であることくらい知ってる だろうに、恥ずかしくならないのかな。
>>477 実際にAND取ってみればわかるが、空集合にはならない。
その集合だけでOKの用途の場合はechoを使う。
そうじゃない場合はecho以外の手段を使う。
ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
何の解決にもならない。批判してるのはそういう点だよ。
> ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで > 何の解決にもならない。批判してるのはそういう点だよ。 いや、POSIXに従うのであれば printf を使えば解決する。FreeBSD でも動くよ。 まあ FreeBSD 5.X〜8.X では、ちょっと遅いが、それは FreeBSD が一時期、 判断間違えてただけの話(しかも、もう直ってる)。 FreeBSD 5.X〜8.X 固有のマイナーな問題点を、OS を限定しないスレで主張すんな。
> その集合だけでOKの用途の場合はechoを使う。 > そうじゃない場合はecho以外の手段を使う。 ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。 www
> ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。www ご苦労さんとしか言いようがないよなあ。 POSIX にズバリそのまま書いてあることを、3つのマニュアルを見比べて、 自分の頭の中でANDするという手間ヒマかけて再発見とか。 まあ、それだけ暇な仕事なんだろう。ある意味うらやましいな。 真似は絶対したくないがw
>>477 ってPOSIX読んでないだろ。
指摘されるまで AND取ったら空集合だと思い込んでたみたいだし。
>>483 はあ? AND取るのにPOSIXは関係ありませんが。
4つのシェルのANDとるなんてバカな作業はもちろんやったことないですけど。www
4つのシェルの仕様のANDをとるのがバカだということは分かるのに、 3つのシェルの仕様のANDをとるのはバカじゃないって思ってんの? フツー1つの仕様(POSIX)読んで終りだろう、常識的に考えて。
>>485 やだなあ。レス番よく追ってよ。僕(
>>477 )は、3つのシェルの仕様のANDを
取ってる自称プロを弄ってた方だよ。
あ、そういうことか。勘違いした。
まあ
>>477 の主張はちょっと不明確な気がする。
4つのシェルの仕様のANDとって、空集合になるなんてことはあまりない
(だいたいは代替手段がある)ので、何が言いたいのか分からないな。
4つのシェルの仕様をちゃんと読めば、目的が果たせることには変わりない。
問題なのは、それがとんでもない時間の無駄使いだってことだろう。
POSIXでは、echoの引数に -n が(最初に)使われてる場合、 または バックスラッシュが使われている場合が implementation-defined と書かれている。 実はこれダウトなんだよ。 bashやzshのechoとか、-E (大文字)も特別扱いするから、(-eもだけど) echo -E は、POSIXで言うところのimplementation-definedに該当しないはずなのに ポータビリティーがない。 -E -e の件はPOSIX読んだだけでは書かれていないから、 正確なことを知るには自分でAND取るしかない。
うん、今のたいていのシェルはPOSIX準拠だからね。ANDをとればPOSIXになる。 でも、自称プロは自分でANDを取る。 w 延べ数千人のレビューを経たPOSIXより、自分でANDを取った規約の方が上。
>>489 延べ数千人のレビューを得ても echo -E / echo -e を見落としたんですか?
> -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」は最後でいい。テストでコケるまで参照しなくても いいくらいに優先順位が低い。
むしろFreeBSDやashが排除されるのが合理的。
FreeBSDだけやったところで、NetBSD, OpenBSD, DragonflyBSD, それに Debian GNU/Linux があるぜ。 まあ FreeBSD だけに限っても無理だろうけど。
ポータブルなスクリプトを作るってスペースを減らすしかないんじゃないの?
んっ…はぁっ、あっ
そもそも改行無しのechoなんて使わなきゃいいのに
posixシェルを否定する唯一の材料みたいだからね。 ANDとる作業で工数水増ししてるのかもね。w
すみませn ""rm という記述を見たんですが、""ってなんか意味があるんでしょうか?
rmがaliasになってるときにaliasを展開しないためじゃないかな
シェルスクリプト中で alias使うってすごいな。
シェルスクリプト中でジョブコントロールには勝てないだろw
ジョブコントロールはふつーに使うでしょ。 なんか重い処理を並列で走らせるときに cmd1 & cmd2 & cmd3 & wait みたいな感じで。
>>503 それジョブコントロールちゃう。ただのバックグラウンド。
SIGTSTPで止めてバックに回して、
あとで fgしたりするやつ。
バックグラウンドで動かすのもジョブコントロールの一部でしょ。
>>506 ちがう。
決定的な違いはプロセスグループIDの処理。
ジョブコントロールの場合は各コマンドのプロセスグループIDを別々にして、
親のシェルからは独立する。ttyの端末プロセスグループIDを
フォアグラウンドプロセスと同一にし、管理を行なう。
一方、ジョブコントロールなしの場合は、fork/execのあと、
単にwaitしないというだけの処理で、プロセスグループIDは親シェルと同じ。
だから、Ctrl-Cで同一プロセスグループIDのプロセスが死なないように
&を付けたコマンドはSIGINTを無視するようにしている。
(ジョブコントロール有りの場合はSIGINTはそのまま無視しない)
ジョブコントロールは、今のシェルなら set +m で無効にできる。
set +m でジョブコントロール無効にした状態でも
& や waitは実行できる。
純正/bin/shにはジョブコントロールがなかったが、
& や waitは当然実行できる。
MNT=$(mount | grep "rootfs/proc") if [ -z "$MNT" ]; then mount -t proc proc ../rootfs/proc/ fi この構文は短縮できないんでしょうか
>>509 mount | grep -q 'rootfs/proc' && mount -t proc proc ../rootfs/proc
511 :
510 :2012/08/01(水) 22:23:46.64
&&ではなく、 || に。
512 :
509 :2012/08/01(水) 22:32:13.39
いちいち判定しなくても二重にマウントされることはないんだから、 mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1 || : でいいじゃね?
いちいち||判定しなくても最後のステータスが有効なんだから、 mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1; : でいいじゃね?
書き込んだらセミコロン(;)消えた、、まあ、set -eなんてしてないという前提で。
jikken () { command hoge $@ } という関数を定義してたんですが jikken -m "" -n "" unko というコマンドを実行すると hoge -m -n unko というコマンドの実行になってしまうんですよね。 引数をきっちり hoge に渡すには どうしたらいいんですかね
command hoge "$@"
bash だと変数の部分文字列を ${a:m:n} で取得できるけど、 同じことを bash の拡張機能を使わず、かつ内部コマンドだけでやる方法ってないかな? いまは echo $a | cut -c$x-$y でやってるけど、 スクリプト中で何百回と呼ばれていて、これのせいでかなり速度が遅くなっちゃってる。
>>519 頭の3文字と後ろの2文字をカットしたい場合、
a=ABCDEFG
b=${a#???}
echo "${b%??}"
みたいにするしかないかな。この例では DE が残る。
ありがとう。それは考えたんだけど、位置を数値指定したいんだよね。 ? を指定回数数並べた文字列を作るのにまためんどくさい手間がかかるのはちょっと。 とはいえ、やっぱり方法はそれしかないよなぁ。
>>521 printf %.5s '??????????????'
で5個の ????? が得られるよ。
欲しいのはこっちだろ printf "%.*s" 5 '?????????????????????????????'
おお、ありがとです。なんとかなりそうだ。
実行速度が3倍になった。ありがとう。
名前付きパイプの使い方を修得した (`・ω・´) 一時ファイルの代わりにこれを使えばHDDガリガリしなくて済むんだよね?
まあその通りだが、いまのシェルだと diff -u <(ls /old) <(ls /new) とかできるから、わざわざ名前つけたりは、ほとんどしなくなったなあ。
>>528 のことを「名前付きパイプ」って呼んでる可能性もあるわけで・・
(mkfifoのことじゃなくて)
そうだとすると言葉の誤用なので (実装は pipe(2)でできるし)、 それはないと思いたいところだけどなあ。どうだろね。
>>530 実装依存だな。(言葉の誤用ではない)
FreeBSDだと本当にnamed pipeで実装されてるよ。
bash$ file <(:)
/tmp/sh-np-4033202023: fifo (named pipe)
コマンドがパス名を必要としている引数位置で使うのに、 どうやってnamed pipe以外で実装するんだよ。
>>532 Linuxだと、普通のpipeで実装して、それを/dev/fd/n(/proc/self/fd/n)経由で参照する 。
だからnamed pipeにする必要はない。
Named pipeの後始末は誰がする?
私自らが処罰を与える
>>531 いや、実装依存だから、名前の誤用なんだよ。
「<(コマンド)」の実装に常に named pipe が必要ならばともかく、
pipe(2) で実装されたり named pipe で実装されたりするものを、
named pipe って呼んじゃ駄目でしょ。
>>534 「<(コマンド)」の場合なら、これを解釈するシェルが始末する。
自力で named pipe 作ってるシェルスクリプトなら、ふつうは
そのスクリプトの中で trap とか使ってやるんじゃない?
(named pipe の目的にもよるので状況によりけりだけど)
>>536 もともと「named pipeを自動で」という設計思想で設計されたものだから、
結果の実装がどうあれ、named pipeと呼んで良い。
上の例だとdiff終了時点でshellが削除だろうね。
全子孫が終了するまで削除しちゃだめだよね。 こんなのとか daemon hoge <(hage)
>>538 え、そんなの初めて聞いたぞ。
「"named pipe" "shell script"」でググって出てくる上位5サイトに
「<(コマンド)」や「>(コマンド)」の話が、チラっとも出てこない
ことからして、君の組織だけで生まれたローカルな用法なんじゃねえ?
プロセス置換 (process substitution) がサポートされるのは、 名前付きパイプ (FIFO) または ファイル・ディスクリプターの /dev/fd 形式での指定 をサポートしているシステムです。
UNIX domain socketでも何とかなるでしょ。
>>544 UNIX domain socketでは、そのファイル名を渡されたコマンド側が
open()でオープンできないから無理。
>>543 「コマンド置換」と、
「名前つきパイプ または ファイル・ディスクリプターの /dev/fd 形式での指定」が、
きちんと分離して書かれてるね。
しかも、名前つきパイプが使えることと、コマンド置換が使えることは等価ではない
(ファイル・ディスクリプターの /dev/fd 形式での指定ができればコマンド置換が
使える)ことも明確に書かれている。
ますます
>>538 が、何を読んで、コマンド置換のことを名前つきパイプだと
思い込んだのか知りたくなるな。まさか
>>543 の文章じゃないよな。
549 :
548 :2012/08/09(木) 14:26:25.67
s/コマンド置換/プロセス置換/ だった。
初期のshellは”コマンド置換”的な文法だったと「UNIX原典」にあった。
>>548 「コマンド置換」??www
いつの間にコマンド置換に話になったんだよw
プロセス置換を理解していない無知自慢かよwww
<( … )の形でパイプが使えると知らなかったときは /dev/shmに一時ファイル作ってガリガリ言わんようにしてたな 他に何も代わりの方法を思いつかなかったからだが パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか? 最近マルチコアが当たり前だし、キャッシュも利くだろうから、 一時ファイル作る方が速く処理が終わるかもしれん
>>552 > パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
でかい出力処理 | less
とかやったことないの?
> 最近マルチコアが当たり前
と
> 一時ファイル作る方が速く
が、全然つながんねえ
> > 最近マルチコアが当たり前
> と
> > 一時ファイル作る方が速く
> が、全然つながんねえ
だね。
名前つき/なしに関わらず、パイプやソケットならマルチコアで
並列に動く可能性がある(マルチコアを生かせる)けど、
ファイル経由してたら、シングルコアと性能変わらん。
>>551 で、結局、「プロセス置換のことを、named pipe と呼ぶ」っていうのは
どこかの組織のローカルルールの話だったってことで OK?
世の中に広まってる話なら、ソースよろ
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回ぐらいあるような感じなんですが、
これってなんでなんですか。
readの次に sleep 0.5 とか入れてみればほぼ100%再現するよ
>>557 うん、そうなんですよね。どういうことなんでしょうか。
ていうか、プログラムのコピペミスってますね、さーせん。
あぁ、sleep中に打ち込んでるからってことでしょうか。なるほろ×2。 本当にありがとうございました。
>>555 グーグルは存在の検索はできるが、非存在の検索は出来ない。
いや、でもやっぱりそれっておかしくねえ? readの変数への代入がwhileループ始まるより遅いってこと?
あぁ、おかしくないか、打ちこんでる間のタイムアウトの方が早くて次のループに入ってるだけの話か。そういうことっすよね? 本当にありがとうございました。
改行して、whileで一度中に入って、時刻表示して、次のreadで取り込まれて、while抜ける
>>562 変数への代入じゃなくて、
read実行開始時に端末のバッファをフラッシュする関係で
直前のEnterを取りこぼすということ。
read -t 0.01 とか sleep 0.5 とか、Linux限定全開ですな
昔gccがgasにpipeで渡すか、それとも一時ファイルかという議論があった時は、 性能評価のレポートによりpipeで渡す方が効率が良いということになった。 もちろんSSDが主流になるといろいろと変わってくると思われるが。
read -t は駄目だけど、sleep 0.5 は *BSD でも動くよ。 まあどっちも POSIX 外で、移植性はないけどな。
zsh限定って最初から断わってんだから、read -t も有り
sleepってビルトイン関数じゃないからzsh関係ないような。
だからー sleep 0.5 は *BSD で可なので、Linux限定ではない read -t は zsh で可なので、Linux限定ではない
573 :
556 :2012/08/09(木) 17:18:27.14
-tの時間を少なくしていくと、 While文の条件判定の所で一番時間が掛かるようになっていって、 そこの間でEnterを打ち込むから、echoが二度効いてしまうように見えるってことかな? 最初はecho中にEnterが効いてるからと思ったけど、それならWhileループに二度目突入しないものね。
readがタイムアウトした瞬間から、 echoの最初の文字を出力する瞬間までの、どこでもありうるね echoが二度効いてるんじゃなくて、Enterで次の行に行っちゃったから、 そこにechoしてるだけ。
世界最強ってところには誰も突っこまないのか。
そこつっこんでも面白くならない。
突っ込まれたくないなら世界で2番目くらいに強いって言っとけばいい 所で、時計なのに一定時間待つって処理でいいの?タイマ設定してシグナル送ってもらった方が正確じゃね
578 :
556 :2012/08/09(木) 18:59:37.13
command-line clock v2 - Pastebin.com
http://pastebin.com/nRfEbSZF ちょっと改変して、コマンドのreturnの値を条件式として使うように、
こんな風にしてみました。
でも、こうしても-tの値を減少させていくと、二重にechoってるようになるのが
どうしても解せません。なんでだよ!さすがにおかしいだろ!
やっぱり順次処理されてないのでは?
>>577 そんな格好いいのが出来るなら、敗北は認めなければなりませんね。
そこに美しさがあれば世界金メダルは譲ります。
readでタイムアウトしてからechoまで0秒じゃないんだから、 そこでEnter打ったらなるんだよ echoの前に sleep 入れてみたら確認できるだろ
580 :
556 :2012/08/09(木) 19:06:32.81
>>579 あ、前のechoが残ってるのか、
どうやらオバカさん世界一の金メダルは私のもののようですね。ふっふっふっ。
本当にどうもありがとうございました。
てゆーか、この程度なら、別に 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
sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、 1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?
>>581 せっかくそこまでするなら $( ) は ` ` にすべき。
> sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、
> 1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?
対話的シェルにリアルタイム保証なんてないから、read -t の時刻指定を
いくら細かくしたところで、マシン負荷が高くなれば、2秒どころかもっと
進む可能性はあるよ。そういう、対話的シェルで実現困難な仕様は、そもそも
盛り込むべきじゃないだろう。
ちょっとの負荷で2秒とびが嫌だっていうなら、拡張sleepに依存して
sleep 1 を sleep 0.9 ぐらいにするって手は、まあないわけではない。
read -t や sleep で指定する秒数をあまり小さくすると、無駄なマシン負荷が
増えるので、あまり小さくするのは推奨せんが。
>>583 Solaris の古いシェルとかで動かすことも考慮するなら、その通りだな。
まあ、そこは常識で分かると判断した。
それをいっちゃあ、リアルタイムOSじゃないのに、xclockとかありえんって話になる
date +%N で現在時刻のナノ秒を取得して、 それを sleep 0.123 とかの小数点以下に(計算の上)反映すれば 無駄にプロセスを使わずにうまく同期できるのでは?
逆逆。 リアルタイムOSじゃないので、xclockだって、更新間隔が1秒より大きくなる こともある。それが仕様。 xclock にだって不可能なことを、シェルスクリプトに求めるなんて、そもそも そういう要求自体がおかしいってこと。
>>586 高負荷時のことを考慮に入れるのなら、そんなんじゃ全くもって無理。
鯆管って、ほんとリアルタイム処理を分かってないなーって言っちゃうよ。
ちゃんと考えてみなよ。
どうしても分かんなければ説明するので、その場合は降参と宣言することw
よし降参だ説明くれ
>>588 高負荷時のことはどうでも良くて、
位相的にきっちり合わせたいということでしょ。
非同期で突然 sleep 1 を whileループで回せば、
最初から誤差が最大 0.99999... 秒になる。
これを、毎回 date +%N で 1秒未満の残り時間を把握しつつ
sleep 0.9821 とかすれば「位相」が同期する。
591 :
556 :2012/08/09(木) 19:50:02.71
>>581 つーか、これでいいっすね。&使ってバックグラウンドに回しても表示効くのね。
しかもそいつをreadでインプット待ちにしておいて、インプット来たら殺すとかすげー。
でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
バックグラウンドジョブにしてるから?わかる人本当にお願いします。
>>582 そういう意図はありまくりんぐでしたけど、
>>581 さんのやり方でsleepの時間をさらに小さくするだけでいいように思います。負荷との兼ね合いですが。
>>589 答えは、
高負荷時には、date +%N の実行だけで数秒ないしそれ以上の
時間がかかることがあるから
だ。
分かりやすい例でいうと、メモリが溢れていて、date コマンド
どころか、シェルまで swap に追い出されていて、スラッシング
しまくりの状況を考えてみるといい。
たとえメモリが足りててても、CPUその他のリソースが足りてなければ
数秒程度の遅延は普通に起こる。
まあ、鯆管的には、そんなに高負荷になる前にリソースなりマシンなりを
増やせってことになるので気にしてないだろうが、高負荷を気にしないなら
sleep 0.9 でも十分だ。
>>590 なるほど。
そういう意図であれば、確かに拡張sleepに依存するのもいいな。
>>591 > でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
read と kill の間に、時間のかかるdateみたいな処理がないから、
その間にechoが動いてしまう可能性が確率的に非常に少ない。
そこにダミーのsleepでも入れれば二重表示にできるよ。
>>593 の言う通りだ。
read x
sleep 1
kill $pid
に変更すれば、二重表示が簡単に確認できる。
595 :
556 :2012/08/09(木) 20:12:11.80
>>593 >>594 おぉ、本当だ。お前らかっこいいなぁ。ワクワクさん並に輝いてるわ。
どうも本当にありがとうございました。
596 :
527 :2012/08/09(木) 21:43:53.53
後始末について聞いてみたかったんだけど やめといたほうがいいのかな… (; ・ω・)
終了したからいいよね。named pipeだった時の
>>541 の後始末のタイミングは?
よく知らんけど、たぶん、named pipe を使ったプロセス置換の実装の場合、
>>541 は、うまく動かない可能性もあるんじゃないかな。
まだ使用する前なのに消されてしまうことがあると予想。
ただ、コマンド hoge が既に named pipe をオープンし終えていれば、
ディレクトリツリーから named pipe が消されても、named pipe の実体は
残っている。その場合は動く。
というわけで、これは 消される前にオープンできるか否かという
race condition があるケースであり、うまいこと動くこともあるとは思う。
named pipe ではなく、pipe と /dev/fd/ を使った実装なら、
そういう race condition なしで動くだろうけど。
>>598 <(...) や >(...) が named pipeで実装されてるFreeBSDのbashでちょっと
試してみたが、daemonみたいに子が先にexitして孫が残るケースでも無問題。
どうやら、named pipeに対する読み手と書き手が揃ってパイプがつながった段階で
unlink(2)される模様。プロセス実行中に先にunlinkされてる。
検証どうも。 以外な結果だなあ。 孫が、引数をオープンする前に、たとえば10秒くらい待つような場合、 named pipe を管理するシェルはずっと待機しているってこと?
おまえらのために実験してやったぞ シェルの実装依存だ 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); } }
>>600 読み手と書き手が揃わない場合は、named pipe は放置されるww
例えば、
bash$ ls <(:)
bash$ exit
なんてやると、lsコマンドも :コマンドもnamed pipeにアクセスしないから、
/tmp/np-sh-XXXXX みたいなファイルが残ったまま bashが終了できてしまう。
bash終了時にはunlinkしないみたい。
cat <(ls) でも残るんだが
> 読み手と書き手が揃わない場合は、named pipe は放置されるww これはひどいw FreeBSD でも /dev/fd/ が実際にはあるわけだから、named pipe じゃ なくて、そっち使うように直した方がいいんじゃ。
>>603 残らないよ。(bash/FreeBSDで)
> cat <(ls)
> でも残るんだが
FreeBSD-7.3 + bash-4.0.24 の組合せで確認した。
確かに /var/tmp/sh-np-数字 という名称で残る。
>>605 バージョンは?
>>604 ls /dev/fd 3< file
↑これとか実行してみるとわかるが、
FreeBSDの /dev/fd は、0 1 2 しかファイル記述子に対応してない。(3以降ダメ)
>>606 FreeBSD-8.1 bash-4.1.7
>>607 マジか、知らなかった… が、確かにそのようだ。確認した。
NetBSD あたりから動く実装持ってくればいいのに。
NetBSD の方では、zsh も bash も /dev/fd/ 使ってる。
bash-4.2.37/FreeBSD-9.0だけど残る
よくよく確認したら、3以上のディスクリプタについても、 FreeBSD-4.3 なら動いたよ。 /dev/fd/* の実体はキャラクタ型のデバイス・ファイルなので、 デバイス自体はたぶん FreeBSD-7 でも動くんじゃないかな。 つまり、devfs 導入時にデグレったんだ、これ。
FreeBSD-7.3 上で bash-4.2 の配布物そのままを野良ビルドしてみたが、 やっぱり named pipe が /var/tmp/ に残るね。 bash のバージョンの違いが原因ではなさそう。
残らないという環境の
>>608 は、何が原因なんだろう
そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?
> そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか? そう、自分もそれが疑問だった。 kqueue(2) にはそういう機能なさそうだから、無理じゃないか。 まあ kdump(1) と同じことするって手がないわけじゃないが、 bash のやるようなことじゃない。
>>613 オレもそれ考えてたんだけど、
named pipeに対して select(2)してパイプがつながったかどうか検出してるとか。
cat <(ls) して、しばらくほっといたら消えた!
読み手が繋がったことは、それじゃ分からないよ。 書き手についても、書き込みが起こるか、あるいは書き込みオープン後クローズ されれば分かるけど、書き込みオープンされただけじゃ分からない。
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が読まれたかどうかを確認していることになる。 どうやってかは知らない。
そもそも残ってることって問題か?/tmp 以下なら再起動で消えそうだけど 別の話だけど、名前付きパイプだと全く関係の無い別のプロセスからも 読み書きできるから大丈夫なのって思う
パーミッションが自分にしか出てないからいいんじゃない?
dbus-*地獄とか勘弁w
/var/tmpだから再起動じゃ消えない。 頻繁に呼ばれるCGIとかでこれが起きたらやっぱりやだよ。
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する。
bash実装の場合、ソース読むと、 コマンド列の最後のコマンド終了した時に消してるみたい。
そだね。 cat <(ls) だと、子シェルが死ぬタイミングがちょっと遅れるみたいで、 直後にはfifoがunlinkされない。 cat <(ls); sleep 1 だと、確実に残らない。
結論としてnamed pipe版プロセス置換はカス。でいい?
最近のFreeBSDではmount -t fdescfs fdescfs /dev/fd してからbashを作るとpipe+/dev/fdで作成される。
>>629 コンパイル時決め打ちだからちょっとまずいね。
send-prしといて
質問させてください。 現在、'nc -l 12345'コマンドを発行し、それに対しsocket通信を行い、期待した通信が行われているか確認しています。 しかし、上記コマンドでは1回closeしてしまうと、上記コマンドも終了してしまいます。 連続的にsocket通信を行い、期待した結果が入っているかチェックを行いたかったので、以下のようなスクリプトを書きました while : do `nc -l 12345` done しかし、上記を実行して、socket通信を行うと、なぜか、送信したデータを表示するのではなく、実行しようとして、エラーメッセージが出ます socket通信を受けるたびに、nc -l... コマンドを発行し通信内容を表示するにはどうすればいいのでしょうか? よろしくお願いいたします。
>>632 わざわざシェルスクリプトにしなくても、
nc -k -l 12345
を発行(笑)すればcloseしても終了しないよ。
発行って言葉使っちゃいかんの?
コマンドは普通は「実行」する。
起動だな
execute
639 :
名無しさん@お腹いっぱい。 :2012/08/10(金) 13:39:44.13
起動は終了を伴わないdaemonプロセスのような場合。 > nc -k -l 12345 に使うのは正しいが、 > を起動 とは使わない。 > のように起動
コマンドラインで打つならinvokeってのもあるんだぜ。 issueは機械語命令レベルならアリだけどな。
そういえば命令は発行するもんだな。
汎用機やDBの世界はjobをissueする。
>>624 ,
>>625 乙
> ・ fifoのwrite openは、readするプロセスがいなければブロックされる。
そうか、これで read 側のオープンを検知できるのね。勉強になった。
この named pipe を使わう場合の実装、面倒臭そうだなー。
検知というかブロックね。
>>645 open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。
>>645 なにいってんの?
read側のオープンをブロックするって何?
fdescfsって何故デフォで有効になってないの? 何か問題あるの? procfsがデフォで有効になってないこととも関係ある?
>>646 O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。
bashは書込みopenでO_NONBLOCKつけてないよ。 相手が読出しopenしてブロック解除されたことで「検出」してる。
cmd1 <(cmd2) だと 1. named pipe作成 2. 読み出しオープン→cmd1実行 3. 書き込みオープン→cmd2実行 こんな順のはず。SIGPIPE/EPIPE食らわないように。
>>648 procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。
どうぞどうぞ
> procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。 またそういう嘘をつかないように。 /proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。 *BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。
発祥について言ってるんじゃなくて、 FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。 Linuxとは違って各コマンドが /procに依存してない。 だから今のFreeBSDは /procを外す方向でしょ。 fdescfsの方は知らんけど。
FreeBSDって何で/procデフォルトでマウントしないんだろうか。 FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。 Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。
>>652 のような街頭演説はFreeBSDのスレでどうぞ。
NetBSDの場合、/procよりptrace(2)の方が効率いいから/proc積極的に使う 意味ないじゃんみたいなことを偉い人が言ったせいだって話を、どっかで 誰かが書いてたような気がする。 NetBSDは昔っから/procはマウントしてない。 で、fdescfs使うかどうかはあまり問題じゃなくて、/dev/fd/*がちゃんと 使えればそれでいいんだと思うよ。devfs登場前のFreeBSDとか、NetBSDとかは fdescfsなしでも/dev/fd/*が、まあまあちゃんと使えたわけで、だったら fdescfsなしでもいいじゃんみたいな発想だと思う。 devfs導入時に、/dev/fd/*が中途半端な状態になっちゃった(3未満の ディスクリプタに対してしか動かなくなった)のが真の問題でしょう。 サポートしないつもりなら/dev/fd/*を削った方がいいし、サポートする つもりなら、もうちょっとなんとかした方が。
だからsend-prを!
/procとptrace(2)じゃほとんど機能かぶらないけど…
ストリーム読んでパースするより構造体で取得できるsysctlの方がrobust
>>660 ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。
ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。
>>661 NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。
ptrace(2)する代わりに/procでioctlする糞インターフェースは死んだも同然じゃん。 /procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。
>>663 それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。
procfsとfdescfsの話題は混ぜるな危険。
/proc/cpuinfoとか無理すぎ。 process関係ないw processorじゃ!とかなしよん
668 :
663 :2012/08/10(金) 20:52:29.93
>>665 それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。
>>667 さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。
sysctlのように型がかっちり決まってるのもいいけど、 /proc, /sysみたいにテキストになってるもの素敵やん。
>>670 スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
性能重視じゃないスクリプトなら 中継用のコマンドをユーザーランドに置いておけばよくて、 カーネルがサポートしなくてもいいよね
sysctlコマンドなんて、まさにそういう中継用コマンドだな。 /dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
PS1っていう環境変数は bashだけのものですか? 他のシェルでも使える?
PS1とPS2はすべてのシェル共通。PS3 PS4はbashとかのみ。 ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
標準入力からzipする場合のファイル名って変えられないでしょうか? echo abcde | zip test.zip - ってやると圧縮ファイルに標準入力データを追加できるのですが 追加されたファイル名が「-」になってしまいます。 ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
ln -s /dev/stdin hoge.txt echo abcde | zip test.zip hoge.txt とか。symlinkは許せ。
zip扱うライブラリがperlやpythonにある。そういうの使うと簡単。
>>677 普通にtemporaryファイルつくって消したら?
なんの役にも立たない
>>680 をわざわざ書く意味がわからん
例えばVAR=`df- h` というような場合に echo $VAR とすると全て一行で表示されてしまいますが、 元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
echo "$VAR" って最近似たような質問見たような。
>>683 すいません、""の存在をすっかり忘れていました。
ありがとうございました。
演算結果を変数に入れるにはどうしたらよいか echo $((91-72)) はちゃんと出るけど A=$((91-72)) は出来ない。 まさかいちいちA=`echo $((91-72))`ってやんの?
>>685 $ A=$((91-72))
$ echo $A
19
できてるけど
echo $((91-72)) は出来て、 A=$((91-72)) は出来ない、という環境は何か? というエスパー検定だろw ちょっと上級の問題だな。
「スクリプトを終了したら $Aがセットされていません」系か?
sum=0; cat file | while read i; do sum=$(($sum+$i)); done; echo $sum 系とエスパー
echo $(( `wc -l a.txt` / 2 )) ってなんでエラーになるの?
>>690 wcの出力にファイル名(a.txt)が出ちゃうから。
echo $(( `wc -l < a.txt` / 2 ))
で桶
>>671 ベタテキストよりオブジェクトそのままの方が扱いやすい。
亀レスで新しい内容なしw
2点教えて下さい。 linuxのシェルでの問題です。 @aaa="a b";echo ${aaa} a b と半角スペースがなぜ詰まるのでしょうか? ASJISテキストファイル編集時の文字化け やりたい事、csv2ファイル入力し、双方マッチングし 条件により、行データを出力するしないを制御するだけのものです。 そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト で出力したものに関しては文字化けは見受けられなかった。 文字化けが発生したのは read LINEで一行読込 echo ${LINE} >> out.cvs で追加出力 とした場合のみ 前者後者あまり違いが内容に思われるのですが対策って有るでしょうか? ちなみにlinux側の文字コードはutf8設定です。 当編集シェル実行時のみ文字コードを環境変数なりで変えることは 可能でしょうか?またその方法は有効でしょうか? よろしくお願いします。
1 echo "${aaa}" 2 readはバックスラッシュを解釈する。したがってSJISでは利用できない。
>>695 機種依存文字使うな
aaa="a b";echo "$aaa"
echo "$LINE"
同じような質問が、
>>683 で出たばかり
>>695 どうせbashだろうから、
IFS= read -r LINE
echo "$LINE"
でいいな。
早速の多数の方、回答ありがとうございます。 1.機種依存注意します。 2.類似質問分からず失礼しました。 職場ではnetに繋げないため、別の場所からの質問でした。 直ぐの確認できませんが、後ほど確かめます。 ありがとうございました
>>697 スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。
UNICODEの丸数字とSJISの丸数字はコードが違う。
UNICODE ?x2460; SJIS @
>>700 Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。
機種依存なんだからそんな問題が発生する機種を使ってる奴が悪いw
にちゃんにきておいて機種依存文字がどうのって... ばかじゃね?
SJISの丸数字使いはこの板ではバカにされてもしょうがない。
未だにこんなこという爺さんが生き残ってたんだ。すげー。
丸文字は見た目がバカっぽい。
そんなひっぱるほどの話でもない。
機種依存馬鹿
掲示板ならいいけどソースコードの中で丸数字見たらヤな気分になる人は多いのでは
>>711 確かに。ヘタな英語のほうがまだマシだな。
695です。 心配でしたので、自分のPCにcygwinをいれて試してみました。 1,2点確認取れました。 全く同じ環境ではないですが、問題なさそうですね。 安心しました。助かりました。 ありがとうございました。
>>700 2chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。
UTF-8な板もあるんじゃないの?
今の2chで機種依存文字っつーと丸数字よりケータイ絵文字の印象が強いな
引数のファイル名とかディレクトリ名を 正規化してフルパスにしたいんだけど 一番かっこういい方法はどんな手順?
linuxならreadlink -fかrealpath FreBSDならrealpath
>>722 NetBSDではどうしたらいいんでしょうか
GNU binutilsか何かにrealpathは入ってるから、入れろ
Perlのrealpath関数でも使っておけ
acroreadの起動スクリプト(シェルスクリプト)とか参考になるんじゃないかな
>>721 完璧な方法
1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
728 :
721 :2012/08/20(月) 02:27:37.26
>>727 それだと対象ファイルがパーミッションでopenできない時に使えない。
openせずに直接 statした方が良い。
>>726 acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。
731 :
名無しさん@お腹いっぱい。 :2012/08/21(火) 15:37:54.91
パイプで最初の一行目だけを取得するにはどう書けばよいでしょうか? ls -t | <最初の一行目を抽出するコマンド> のような使いかたがしたいのですが。
732 :
名無しさん@お腹いっぱい。 :2012/08/21(火) 15:42:20.18
すみません、宿題で使うので説明も書いてほしいです。
head -n1 じゃダメなのん?
宿題なら他人と同じ答じゃ評価低いよな。 head -n 1 や head -1 は多数が回答するから面白くない。 sed -n 1p あたりで回答しとけ。評価上がるぞ。
>>731 俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。
じゃあ俺はbrainf*ckあたりで一行目を表示するスクリプト書くわー
オレこれ↓ ls -t | (read f; echo "$f")
738 :
731 :2012/08/21(火) 16:00:29.24
教えていただけてありがとうございました。
sed -n 1pとhead -n 1じゃ前者はカス。 何故カスかという効率の差に関して記述すれば評価上がるぞ。
headとかsedのプロセス起動のコストを考えると シェル側でパイプ開いてreadするのが最強
シェルへのパッチをレポートに貼るのか
printf 'r !ls -t\n1p\nw' | ed - パイプは使ったが > ls -t | <最初の一行目を抽出するコマンド> の形になってないからだめか
744 :
743 :2012/08/22(水) 01:29:14.30
ls -t | printf "i\n`cat /dev/stdin`\n.\n1p\nw" | ed - こうしたら一応できた
FreeBSDではedがworldに含まれてるから当然インストールされてるんだけど Linux系ではed入ってないことも多いんだよなあ。
そうだっけ?Linuxでも割と入ってるイメージがある 中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw
Linuxならedなしbusyboxなディストリビューションもあるわけで。
edが入っていないなんてもはやunixじゃないな…ああ元々unixじゃなかった。
fedoraに普通に入ってる ed-1.5-3.fc17.x86_64
そういうことは聞いてない。
751 :
名無しさん@お腹いっぱい。 :2012/08/26(日) 11:54:24.95
初歩的な質問ですみません グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、 ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか
>>751 echo `echo ¥`date¥``
$()が使える環境ならそっちを使う方がいいかもしれん
なるほど ありがとうございます
初歩的な質問ですみません。 レッドハットとHP-UX混在環境です。 サーバーA、サーバーB、サーバーCとあり 全て異なるネットワークに属しているサーバで ftpやhulftでのファイルやり取りを行います。 サーバー間でファイルの送受信を行うスクリプトを組むのですが、 ファイルごとに組むと100本近くになってしまうため、外部定義ファイルにパスなどを記述し そこからパスなどを読んで処理するような作りをかんがえてます。 例えばhulftならhulft idを引数にしてそのhulft idの行にファイルのパスやファイル名、 sendなのかrecvなのかを記載しそれらをスクリプト内で代入出来ればいいんじゃないか と思ったのですが具体的な構文がいまいち浮かびません。 またサーバーA上にシェルA、サーバーB上にシェルBといて シェルBはシェルAからキックされる場合、引数や変数は継承されますでしょうか。
>>755 ファイル名にスペース等が含まれていないなら、
for file in `cat 外部定義ファイル`; do ...
で行ける。
異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。
どのシェルが普通なのか俺には分からない 少なくとも、バッシュやZSHかな大別できるのは… Kshは癖があるな。 シェルを実行するためには、chmodのコマンド手続きがいるだろ? そんなこと初心者には周知されていない。 コマンド入力にしても ./付けるとかひと工夫しないとだめだ。 この件も初心者には周知されていない。 初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。 しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも わからない筈だ。
詩の宿題かなんか?
export PATH="$PATH,."
,じゃなく:だろ、と .を含めちゃいかんだろ、と。
>>762 ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと
あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような
slっていうウイルスがいるかもよ
バッシュと呼ぶのやめようぜ。 かなりカッコ悪い。
良く口頭でビーシェルみたいな言い方する人いるけど あれってbashのことなんだろうか。
そういうネタはいいです
触るな危険
grepして見つかった行の前5行を出力するってできないでしょうか?
マッチした行を含めていいなら -B 6 でいいと思う
-B 5 だろw
774 :
名無しさん@お腹いっぱい。 :2012/09/01(土) 14:01:09.12
ここでの話しはレベルが高いのか低いのかようわからんな
ash=エーシェル bash=バッシュ csh=シーシェル d-shell=ディーシェル sh=ビーシェル tcsh=ティーシーシェル zsh=ゼットシェル バッシュだけアホみたい。
776 :
名無しさん@お腹いっぱい。 :2012/09/02(日) 09:58:21.31
zshはcshにそろえて読まなきゃ駄目よ
>>775 「z」は、
イギリス発音なら「ゼッ『ド』」
アメリカ発音なら「ズィー」
どこにも「ゼット」なんて発音はない。
中学英語からやり直しだなw
Zを日本人がゼットって読むのはイギリス英語が基だったのか。勉強になった
>>777 俺も z はズィーと習ったけどさ、
zsh をズィーシェルと読むヤツには会った事無い。
で、dashは?
>>781 ググるとそっちばっかりヒットするよなw
ゼットシェルで問題ないよ。 [zed-?el]が[?]に接続して、無声化して[zet-?el]
そもそもとしてゼッドもゼットもどちらも正しいけどな
zshは「ズシュ」
いつもざしゅって読んじゃう。
ザシャァッ(車田調
雑種
ゼットエスエイチとか ゼットシェル 日本人なんだからZの読み方にこだわる必要なし
だな。今後はゼータシェルって言うことにするよ
世紀末風に言うとジードシェル
792 :
名無しさん@お腹いっぱい。 :2012/09/09(日) 13:14:38.93
もっと捻るかマトモなネタないのかよ
仕事で古いパソコンを使っています。OSはUNIX-OSです。 このマシンにbashを入れたいのですが、UNIX-OS用のbashバイナリが 入手できるところをご存知の方いらっしゃいましたら、入手先を教えて下さい。 ソースからコンパイルするのは、私があまりUNIX-OSに詳しくないので、あまり気が 進まないのですが、もしもコンパイルするしかないのでしたら、ソース入手先を 教えて頂けないでしょうか。 また、コンパイルしか手段が無いとしたら、UNIX-OSでは、bashのバージョンいくつまで 対応可能でしょうか。
ネタにしてはつまらなすぎる。マジな質問ならば今のキミの知識では無理としか答えようがない。
2台セットの激安PCを買ったんですが、テレビが付いてなくて、、 ケーブル買ってやっと居間のテレビにつないだんですけど、 電源を入れるとオペラシステム、ナンバーTが見つかった、 みたいなシェル画面が出て先に進みません。2台ともそうです。 この後どういうシェルコマンドを打てばいいのでしょうか?
ありがとうございました。今環境がないので今度客先で試してみます。
798 :
名無しさん@お腹いっぱい。 :2012/09/09(日) 18:42:25.39
いいクオリティしてますね
799 :
名無しさん@お腹いっぱい。 :2012/09/11(火) 12:23:14.32
マスコミは特亜系エセ左翼・カルト宗教団体が行っている組織的な嫌がらせ、集団ストーキング、電磁波悪用、「ガスライティング」を報道しろ
全くシェルスクリプトを触ったことない素人なのですが、cdを変更して あるファイルをmakeするのが面倒なので自動化させたいです。 させたい処理はcd変更→makeの2点だけです。 ですが、うまくいきません。(シェルが一瞬立ち上がってそのまま終了します) シェルにどういう引数を与えて起動させればいいでしょうか。
make -C directory
>>801 どういうことでしょうか?
bash make -C directoryでしょうか?
えーと、makeは-fオプションで行いたいので、bash make -f directoryですか?
>>801 あ、いや、つまり-Cでcd変更を兼ねるわけですね。理解しました
それで、その前にシェルを起動させなければいけないのですが、シェル起動→make -C directoryまでを
一連の動作として行うにはどうすればいいでしょう亜k?
んっと、自分の考えた「手段」に固執して シェル起動とかいう独自用語使ってるとアドバイス来ないよ。 「何をしたら何が起きてほしい」と「目的」が重要。
リンクか何かをクリックしたらbashが起動してmakefileしたいです。
しかしシェルスクリプトを直接起動するのはNGで、必ずbashに引数を与えて起動させなければならないとします
そして最も求めている手段がshにオプション引数としてシェルスクリプトを与えて起動し、makefileする方法です
はい、次の方どうぞ
先生、ぼくも同じ物を探しています
「cd変更」って何だ。
マウントしなおすんだと思ってたw
しきりに「シェルを起動」って言ってるのは、 端末エミュレータ起動のことだろうとエスパー。 あるいはcygwin環境なのかも試練。 が、そういう低レベルの質問はお断りなので、 次の方どうぞ ↓
>>805-807 デスクトップと端末エミュレータとshとbashとシェルスクリプトとオプション引数とmakeとmakefileとcdとカレントディレクトリと手段と目的がごっちゃになってる。
整理して出直せ。
端末エミュレーターxtermはUNIX系のほとんどのOSに対応してるって聞いたんですが、 xtermでFreeBSDのコマンドが実行できません。FreeBSDは対応してないんでしょうか? 関係あるかどうかわかりませんが、ホストOSはLinuxです。
お薬出しておきますね 次の方どうぞ
>>814 FreeBSDもLinuxもUNIXじゃありません。
>>816 この板にfreeBSDスレ立ってますがイタチと言われません
→freeBSDはUNIX
UNIX系OS用ソフトの大半はLinuxで動きますしディレクトリ構造が同じです
→LinuxはUNIXライク
>>817 freeBSDなんていうあなたが発明したシステムが
UNIXかどうかは、ほかの人にはわかりません。
出されたお薬はちゃんと飲んでください
ハイ、わかりますた。 でも飲んだか飲んでないか、すぐ忘れちゃうんです。
飲んだかどうか記録するシェルスクリプト作るといいです
そのスクリプトを起動する事を忘れちゃうんです っつーかある意味、マジな話、一日一度、cronやatを使えず、どうしても手動で 動かさなければならない手順を、結構いつも忘れてしまう…
$ while true; do sleep 86400; ./hoge; done
まぁ、1日1回動かしゃいいって訳じゃなくて、例えば商用マシンからログ類を集計して、 USBメモリにコピって、テストマシンにアップロードして、集計して、そんで最終的に 得られたデータを所定のExcelのシートに記入して、その結果出てきた情報を ログに書き込んでスクリプトを実行する、みたいな作業だ 昔は派遣の人にお願いしてたんだが、コストカットで人が減っちまった 自動化できるんならしたいわマジ
trueの代わりに : で、とか むしろ、sleep 86400 を条件にすりゃいんじゃねとかの、誘い水かね?
>>825 それだとkillall sleepされたときに一緒に終了されちゃうじゃん。
なんでsleep名指しで殺すんだよ
>>825 while sleep 86400; do ./hoge; done
だと、最初の実行まで24時間待たされる。
敢えてsleepを条件に入れたいなら、
while ./hoge; sleep 86400; do :; done
だな。
でもこれだと結局 :コマンドが要るから、素直に
while :; do sleep 86400; ./hoge; done
かな。
処理に10秒かかるスクリプトだと、毎日毎日10秒ずつ起動時刻が遅くなっていくんだな
f(){ ./hoge; sleep 86400; f;}; f
そして再帰が深くなりすぎて落ちる、と。
末尾最適化するようにbash改造すれば大丈夫
>>824 っていうか、なんで出来ないの?
Excelのシートに記入するところは苦戦しそうだけど。
windows使っていいなら簡単でしょ。板違いなだけで。 寧ろUSBメモリ移動が鬼門。
835 :
名無しさん@お腹いっぱい。 :2012/09/15(土) 13:19:37.17
grepでタブを検索したいんですがどうしたらいいでしょうか egrep "\t" *.txt だと、tを検索してしまいます。
あと、STX(アスキーコード0x02)も検索したいのですが こっちもやり方がよくわかりません。 ついでに教えてください。
8進printfしてコマンド置換かな
838 :
名無しさん@お腹いっぱい。 :2012/09/15(土) 13:38:45.62
>>835 対話環境での話ならCTRL-Vあたりがクォート機能に割り当てられている
シェルなら
$ grep '[CTRL-V][TAB]' *.txt
スクリプトの中ならエディタでTABコード書けるだろ。
スクリプトは expand -8 とかで清書する場合もあるし、意味を持ったTABをじかに書くべきじゃないな (じゃあMakefileは? というのは無しで)
>>835 grepでというのには反則だけど
perl -ne 'print if /\t/'
perl使うのはこのスレでは禁止 grep -P なら許す
grep -e "$(printf '\t')"
巨大なディレクトリツリーの差分(ファイルの有無だけでいい)を取りたいんですが、 rsync以外で効率のいいやり方を教えて下さい。 diff -rqやfind | sort | diffでは遅すぎるのでもっといいやり方は無いでしょうか。
>>844 diff <(ls -aR /dir1) <(ls -aR /dir2)
>>845 ありがとうございます。確かに速いですね。
ただ、lsの出力がファイル名だけなので、diffからファイルのパスが分からないのが困ります。
他にdir1にあってdir2に無いファイルを相対/絶対パスで取得できる方法はありませんか?
情報後出しで済みません。
ごめんなさい、今確認したところfind | sort | diffでもそれなりに速いことが分かりました。 勝手に遅いと思い込んでいました。とりあえずこの方法でやってみます。 回答して下さった方どうもすみませんでした。
ちなみに自分が試したのは diff -u <(cd old/ && find . | sort) <(cd new/ && find . | sort) | grep '^\+./' rsync -naiO --ignore-existing new/ old/ | awk '{print $2}' diff -rq old/ new/ で、上から順に速いことが分かりました。御参考まで。
ディレクトリの比較は dircmp が使えるなら、dircmp を使うといいかもしれない どちらかのみ含まれるファイルを取り出すのに diff -u して grep ^+ してるけど commを使うといいかもしれない
>>838-843 みなさん、ありがとうございました!
うちにきて弟をファックしてもいいですよ。
>>849 ありがとうございます。
comm -13 <(cd old/ && find . | sort) <(cd new/ && find . | sort)
と書き換えてスッキリしました。
dircmpのほうは古いUNIXにあったコマンドみたいですね。
自分はLinuxなので使えませんでしたが、参考になりました。
dircmpってSolarisに付いてるけど、 結局diffでファイルの中身比較するから遅いよ。 (ファイルの中身は比較しないで欲しいという目的なら)
854 :
名無しさん@お腹いっぱい。 :2012/09/18(火) 14:23:13.01
ちょっと質問です。 例えば echo "test" という 1 行だけのシェルスクリプトを作成して、foo.sh という名前で 保存します。このファイルのパーミッションを 744 にしてコマンドラインで ./foo.sh と叩くと 正常に実行できてしまいました。 シェバング行が無いのに、何故実行できてしまうのでしょう? おそらく基本的なところで 私の理解が不足しているのだと思いますので「ここを読め!」等のポインタで結構ですので、 どなたかご教示いただけないでしょうか。 ちなみに FreeBSD、AIX、CentOS で試してみましたが、いずれも同じ結果でした。
ないときは /bin/sh でも呼ぶようになってんじゃないの。 ちゃんと調べてないけど。
カーネルソースを読め。
>>854 昔のUNIXではシェバング行なんてなかった。
テキストファイルであっても chmod +xされていればexec()される。
まずはバイナリと仮定してカーネルのexec()を呼び出す。
するとフォーマットが合わないのでエラーで返ってくる。
このあと、コマンドラインのシェルの判断で、
「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
これでシェルスクリプトとして実行される。
シェバング行がある場合は最初からその行に書かれたシェルのスクリプトとして
カーネル側のexec()で直接実行される。
ユーザーはソフトのインストール禁止ですが、 最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、 X権限をすることによってソフトが実行できてしまうことが判明しました。 これはOSのセキュリティーボールではないのでしょうか? ユーザーのフォルダーではたとえX権限がされていても 実行できないようなおすすめのシェルって何ですか? 必要ならカーネルにバッチを当てる方法も、やもうえません。
>>858 とりあえず /home以下をnoexecでmountしちゃえば?
つまらんネタにかまうな。
>>857 > するとフォーマットが合わないのでエラーで返ってくる。
これは先頭の2byteを見ていたのね。
そこから#!を使うことになった。comment(#) + execute(!)
昔の実行形式の先頭2byteがどういう値だったかは、
/usr/share/file/magic/pdpを見るといい。
古典的なUNIXでは/etc/magicにある。
典型的なテキストファイルでは使わないシーケンスになってる。
863 :
854 :2012/09/18(火) 16:18:19.96
おまいら早いですねw (褒めてます)
>>857 > このあと、コマンドラインのシェルの判断で、
> 「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
ありがとうございます。この部分以外は自分の理解とおおむね一致していました。
自分の理解度を再確認できて良かったです。
ただ、「シェルの判断で〜」の部分ってシェルのマニュアルにはちゃんと書かれて
いるのか、それとも「昔からそういうもんだ。ソース読め」のどちらなんでしょう?
手元では tcsh / ksh / bash で同じ挙動だったので「昔からそういうもんだ」
なのかな、という予感です。
マニュアルに書いてあるかどうかと昔からそういうもんかどうかって 択一じゃないと思う。
shellがmagic numberを見て、shell scriptを自分で実行するようになったのは、 bash移行のことじゃないか? それまではexecve(2)におまかせだったはず。
一応手持ちのGentooマシンで調べてみたけど GNU bash 4.2.37ではまだexecveしてENOEXECが返されるのを確認してから そのスクリプトを読み直して処理してるみたい。
どーでもいいけど昔のHP-UXで一行目がシェバングじゃないコメント行だと ログインシェルで解釈されたような気がする。
#!/bin/cat Hello,world! って書いてもcatが起動しないんだけど、なんで?
ごめん、起動してたわ
cat -n で起動したらいろんな誤解が一瞬で解けた
日記か。
知識の共有だ
A=`./hoge | cat` みたいなとき、./hogeのエラーを検知してリトライしたいんだけど どうしたらいいかな
ためしてないけど A=`while ! ./hoge; do :; done | cat` ってかんじかなぁ
>>874 そっかその中でループしちゃえばいいのか
シェルの正しい文法って誰も知らないみたいなウィキペディアにはハッカー?さんのコメントがありますが 望ましいシェルスクリプトの実行方法は実行権付与後に当ファイルを呼び出す方式か、 shコマンドで引数にファイルパスを指定する方法か、 .コマンドで同様にパス指定する方法か、どれになりますでしょうかね 実行時の状況次第で選ぶものだとは思いますが。。
文法がどう呼び出し方法の話とつながっているのかわからんが、 明らかに3つとも意図するところは違うだろ。
というと?
というと=tweet
具体的に。
(1) ./hoge.sh (2) sh hoge.sh (3) . hoge.sh をどう使い分けるか。
シェルスクリプトって実行権限与える、shに引数渡す、sourceで読み込むと、 三種類実行方法がありますが、それぞれどんな特徴ですか? それはさておき、文法を完全に把握してる人がいないんですね。wikipediaに書いてありました。
文法はさておきすぎとして、 (1)と(2)はそれほど明確に使い分けてないかもね パーミッションが立ってることが保証できて、 普通のコマンドと区別する理由がなければ(1)
コマンドラインから頻繁に実行するなら (1) にしたい。 ただ #! とかモードとかちゃんと設定しなければならない。 その辺がめんどうなら (2) で。 (3) は (1)(2) とは動きが違う。
>>885 (3)が違うというのはなにが違うというのか
>>886 子プロセスで実行するか現在のプロセスで実行するか。
釣りくさいけど、変数に代入したりcdしたりして比べてみろ
たとえば hoge.sh 内で cd / してみ。
ダウンロードして一回だけ実行って時は、(2)をさせる記述が多いね。
やっぱり文法の話が気になる。
文法の話、参照先読んから書きたいんだけど、臨時串がNGワードではねやがる。 bash開発時にsh互換にするのに文法で苦労したんだって。 その時の語録みたいよ。
893 :
892 :2012/09/24(月) 12:59:18.55
shのドキュメントがイマイチだったり、yaccが不完全だったんだって。 みんな使っている機能なのに。 だから「本当は誰もshの文法がどうなっているのか知らないんだよ。 ソースコードなんて読んだってほとんど役立たねえよ」ってことらしい。
不完全って何だよ、もとからyaccなんか使ってねえよ 伝聞じゃなくてソース出せ
「yaccが不完全」とは書いてないな。
899 :
名無しさん@お腹いっぱい。 :2012/09/24(月) 16:26:39.69
えwwwいwwwごwww We are Japanese!
rcの宣伝するのにshをdisってるだけで、bashだの互換性だの関係ないじゃん。
who|wcがだめなのって、昔のshはパイプが^だったっていうだけのこと?
>>903 んっと、実質いけるかじゃなくて、ドキュメント上の話ね
あぁ
>>903 は、1979のドキュメントか。who|sortがちゃんと例に上がってるね。
who|wcが認められていないっていう出典は何だ?
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のソースを見て驚愕しようぜ。
/⊇∧ /⊇∧〈( ゚д゚) `〈( ゚д゚)ヽ ⊂ニ) ヽ_と/ ̄ ̄ ̄/ |  ̄\/___/ ̄ ̄
ウニ臭ってさ、コマンドライン画面にエロアニメ少女のAA出して オナニーするんだろ? 本当にキモいよな。
AA ってなんですか。
マジレスってなんですか?
わかる方いたら教えてください。 以下の@のようにコマンドを変数に代入して、実行したいのですが、どうすればよいですか。 多分、バックスラッシュが正しく認識されていない。。 @コマンドを変数に代入した場合は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
for f in $(eval "$cmd");do echo $f done
>>915 cmdに ' ' で代入すること " " だとバックスラッシュが解釈される。
sed -e /1a porto=WPA/ wpa_supplicant.conf で2行目にproto=WPAを挿入したしてますが、 タブ+proto=WPAを挿入するには、どうしたら出来ますか?
>>918 sed -e '1a\\tporto=WPA' wpa_supplicant.conf
920 :
918 :2012/10/08(月) 22:10:14.93
>919 あ、そうか ありがとうございます。
921 :
名無しさん@お腹いっぱい。 :2012/10/09(火) 09:23:06.07
ある特定の命令を無視しろと命令したい場合どうすればいいの?
命令ってなんのこと?
あ、コマンドのこと。
こういう事か? 突っ込みどころはいろいろあるがキミのレベルならこれで良い。 #!/bin/sh ls () : ls
grepコマンドで、"---Hoge"という文字列を検索できません どうしたらよいでしょうか
まさか grep -- ---Hoge というオチじゃないだろな
-- が使えないgrep用の解 grep '[-]--Hoge'
grep -e --Hoge
すいません、教えてください。 at コマンドで、日付を指定することはできませんか? 4日後の午前8時に実行したいのです。 at コマンドじゃなくてもかまいません。 FreeBSD 4.7 です。 よろしくお願いします。
なぜmanを読まない? 時刻と日数は違うけとそのものずばりが例にかかれてる。
>>932 ありがとうございました。
8am + 4 days
で、いいんですね?
ネタ切れ
すいません 教えてください。 あるMakefileの中に 変数:=XXXXX 変数+=XXXXX の記述があるんですが、これってどう言う意味でしょうか
938 :
936 :2012/10/30(火) 16:07:27.79
>937 だって、あちらは誰もいないみたいなんで
それはスレ違いの書き込みしていい理由にはならない。
makeのこときかれても.....
だってワロタ
chroot後に、プロンプトを変更しようとしています。 chroot /hoge export PS1="\u@\h \w-> プロンプト変更.shを作って chroot /hoge /hoge/プロンプト変更.sh としても、そのようなファイルやディレクトリはないと怒られます。 何故でしょうか?
釣りか? /hoge/プロンプト変更.sh は /hoge に chroot した後は /プロンプト変更.sh だろ。
しかもプロンプト変更してすぐ終了するという意味不明な攻撃。
945 :
942 :2012/11/04(日) 16:21:56.21
失礼しました。 プロンプト変更.shの中にエラーがありました >942 どちらも試しておりましたが、スクリプトのエラーで分からなくなっていました。 おっしゃる通りですね >944 こちらも試しては見ていたんですが chroot ./hoge /bin/bash; /プロンプト変更.sh でしょうか ただ、これもサブシェル内での変更になるのでしょうか、思うようにはなりませんでした。 chroot ./hoge /bin/bash; export PS1="->" でもダメなので、bashrcを書き換えないとダメでしょうか?
chroot云々は良く分からんが . プロンプト変更.sh source プロンプト変更.sh じゃねーのか
ツェル
シェルの内部コマンドと外部コマンドの区別をつけないと。
949 :
名無しさん@お腹いっぱい。 :2012/11/05(月) 01:35:08.60
外部コマンドcdという一見不可思議なものもあったりするけどね。
>>945 面倒だから正解教えてあげるけど、キミ、全然理解していない。
次に来るときはシェルの入門書を1000回読み返してからくるように。
chroot ./hoge /bin/bash --rcfile /プロンプト変更.sh
>>949 そのディレクトリにcdが可能かどうかチェックはしたいけど
カレントディレクトリを変更したいわけじゃない、という場合に使う。
>>951 それは (cd hoge) で十分。わざわざ/usr/bin/cd hogeとかする必要なし。
/usr/bin/cd を使っちゃいけない理由もない。
じゃあ外部コマンド版の以下のコマンドの意味のある用途は? alias bg fg jobs unalias wait もちろん、「文法チェック目的」以外で。
>>953 /usr/bin/cd を使っちゃいけない理由:
/usr/bin/cdがインストールされていない環境で動かないのでポータビリティを損ねる。
>>955 インストールされている環境でしか使わないスクリプトなら問題ない。
>>954 POSIX Shell & Utilitiesに適合するため。
>>957 POSIX Shell & Utilitiesに適合することは意味のある用途じゃないので不正解。
はい、やり直し
↓
意味ってお前が決めるものなのか?
/usr/bin/cd って、どのパッケージに入ってるの? うちの環境だと無いっぽいわ
>>957 /usr/bin/cd だったら、「cd可能かどうかチェックする」という具体用途が一応示せる。
(苦し紛れだろうけど)
そういう具体例を聞いてるんだよ。
たとえば /usr/bin/fg って何に使うの?
プロセス変わるからジョブコンできるはずないし。
実は /usr/bin/cd なんて存在しないんじゃないか? どこにあるんだいったい・・・
用途ないってw
>>957 の通り。規格読んでみ。
builtinもexec出来ないといけないから。
なんでそんな規格になってるんだろね。
>>964 builtinもexec出来ないといけないからという理由なら、
trapとかsetとかのbuiltinもexec出来ないといけないことになる。
(実際にはtrapとかsetとかは外部コマンド版はない)
なぜ cdとかaliasとかは意味のない外部コマンド版があって、
trapとかsetとかには外部コマンド版がないのか、という疑問は解決しない。
967 :
名無しさん@お腹いっぱい。 :2012/11/05(月) 20:50:10.49
とりあえず文句が言いたいならOpenGroupへ。 ここで意味がないとか言っても何も解決しない。
文句はないけど疑問ではある。
シェルやシェルスクリプトをよく知らない人が 「builtinコマンドもexec経由で起動できるように外部コマンドを配置」 って決めちゃって、そんなの意味ないって下から指摘あったけど 決めた人が偉い人で引込みがつかず、決まってしまっただけのこと。 だから、実用性優先のLinuxとかではそんな変な仕様には準拠せず、 /usr/bin/cdとかアホなコマンドはインストールしないようになってる。
>>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 見直したら、見当たらない…
-quitの事か?
973 :
971 :2012/11/13(火) 11:40:06.17
ありがとう! -quit だ。 しかし、なぜ man find に出てこないんだろう…
うちの man には書いてあるけど。
GNU限定の話ってだけのこと
* Copyright (c) 1991, 1993, 1994 *The Regents of the University of California. All rights reserved. と書いてあるfindにもあるけど。
ポジックス(笑)には載ってないから使っちゃ駄目 ハイ論破
ポンッと押すだけでパッとつく ハイポンパ
980 :
971 :2012/11/13(火) 13:17:00.75
Mac OS 10.8.2(Mountain Lion) の /usr/bin/find 。 -quit は、効くけど、/usr/bin/man find には出てこないという…
Macは知らんわ。
何なら知ってる?
カレーパン
manも完全じゃないしな 日本語manに至っては、数年前から誤記が放置だ
manはobsoleteで今後更新されないから、 今後はアンサーブックを使えって聞いたよ。 もちろん閲覧はHotJavaを使うこと。
FreeBSDの find(1)のman に -quit ないね MacOSXもその状況をひきずっていそう
.\" $FreeBSD: head/usr.bin/find/find.1 240299 2012-09-10 07:56:59Z des $ にはあるよ。いつからあるかは知らない。
コードの方は2008/2、マニュアルは2012/9だな。 コメントが Document -quit, four and a half years after it was implemented. だと。
>989 まーじーでーーー
だから、そういうおかしなmanページの差し替え版を売り、サポートもするという商売が 成り立つのだよね
-quit なんてのは逃げだろ。 男らしくない。 BSD にはいらん。 軟弱な Linux でも使ってろ。
こうして*BSDユーザのオサーン率が高まり、犬女ばかり増殖する…。
ってか次スレ建てろよ
>>980
{Free,Net,Open}BSDは人がいないからドキュメント更新遅れてる。 実物より古いバージョンのままなんて日常茶飯事。
995 :
名無しさん@お腹いっぱい。 :2012/11/15(木) 18:59:46.37
なぜ動かないのでしょう? #!/bin/sh /usr/bin/cc $argv[1].c -o $argv[1] -lm
997 :
名無しさん@お腹いっぱい。 :2012/11/15(木) 19:30:19.71
ガッコでは動いたんやshの場所もccの場所も確認したんや... (´・ω・`)
zshでも/bin/shで起動されるとsh互換になるはずなんだがな
$argv[1] って・・・ /bin/shじゃねぇのか? C,PHP,Perlとかならおkだろうけど shなら$1ちゃうんかい?
1000 :
名無しさん@お腹いっぱい。 :2012/11/15(木) 19:45:03.49
スマソ 動いてはいるんだけども cc:エラー:[1].c:そのようなファイルやディレクトリはありません って怒られる...(´・ω・`)あるのに
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。