1 :
名無しさん@お腹いっぱい。 :
2012/11/15(木) 18:57:33.11 シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
Q. シェルは UNIX の勉強に使えますか? A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、 UNIX の勉強には向いていません。
今月はじめ、職場に新しいPC(Core i7の結構ハイエンド構成)が入りました。 多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを 使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは #!/bin/tcshという文字列でした。 「うへぇ〜、よりによってtcshかよ」 ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、 今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、 今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、 スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。 おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が 強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。 昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。 これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか $<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって 実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し (だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。 そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が 再現され、それに巻き込まれるのでしょう。もう今からうんざりです。 だからお願いです。教育現場ではbashでもzshでもkshでもashでも Bourne shでもなんでもいいですがBシェル系のシェルにしてください。 教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
>>2 シェルとシェルスクリプトの区別がついてないアホレスをコピペすんなよ
確かにww シェルがないとコマンド実行すらできないし 何がユーザーの入力を受け付けるんだ
6 :
名無しさん@お腹いっぱい。 :2012/11/15(木) 20:10:10.87
前スレ最後の頓珍漢は私です アドバイス通り$args[1]→$1にしたらすんなりいきました。 ありがとうございました。スレなめるように見て勉強させて頂きます。
俺のもなめて。
Gnome Shellのスクリプトの話題もここでいいのか?
以下のような文章があったとします。 〜aaa〜bbbaaa〜bbbaaa〜bbb〜 (〜は文字数の定まっていない文字列を表しています。) ここから、それぞれ最初のaaa〜bbbだけを抽出、真ん中のaaa〜bbbだけを抽出、最後のaaa〜bbbだけをgrepなどで抽出したい時、どう正規表現で表せばよいのでしょうか?
grepは抽出するというより、マッチした行は全部表示しちゃうけど? sedなら sed 's/\(aaa.*bbb\)\(aaa.*bbb\)\(aaa.*bbb\)/\2/' みたいな?
>>9 >>1 >正規表現の話題はスレ違い(正規表現スレへ)
>>11 いや、それは
>>1 > ・シェルで使えるワイルドカード等は正規表現ではありません。
って話だからまた違う。
正規表現スレはまともに機能してないし、ここでいいだろ。
だな。
正規表現スレがまともに機能してないというなら まともに機能させるためにも正規表現スレに行くべき。 sedスレもあるし、sedスレでもいいよ。
了解です
正規表現スレに行ってきます
>>10 grep -oとしてマッチした部分のみ出力しようと考えてます
>>9 ってかこれ俺も分かんないんだけど
どうやんのさ
>>17 $ echo "〜aaa〜bbbaaa〜bbbaaa〜bbb〜" | grep -o "aaa〜bb"
ってやったら3個表示されちゃうな。。。
あとは、sed -n 1p 等でいいじゃない
あるシェルスクリプトに渡された空白を含む可変長引数を、別のコマンドに転送したいのですが書き方がわかりません 具体的にはシェルスクリプトhoge.shを./hoge.sh "a b" "c d"…と実行すると,内部で別のコマンドcmdを引数"a b" "c d"…で実行するような場合です. 引数の数が固定であればhoge.shの中にcmd "$1" "$2"…と記述すれば良いのですが,可変長に対応しようと$*をそのまま用いると 展開されてcmd a b c dというコマンドになり,引数が4つになります. どなたかわかる方がいましたら,ご教授ください.
23 :
22 :2012/11/22(木) 18:22:31.99
ありがとうございます.これで彼女ができそうです><
ffmpeg(avconv)では連番のpngファイルから動画ファイルを作り出すことができます. このような機能を利用して,画像生成スクリプトの吐き出す静止画群から動画を作っています. これを,中間ファイルのpngを作ることなく実現したいのですが何かいい方法はないでしょうか. 静止画をまとめて標準出力に書き出すことはできそうなので,標準入力からの複数の静止画を avconvが認識できれば簡単に実現できそうな気がするのですが.
すみませんが詳しい方のみ回答をお願いします
賢者タイムの方のみお願いします
おかずもあげずに
質問です。 まず、以下のファイルがあります。 -------- $ cat hoge.dat aaa bbb ccc -------- 次に、下記のスクリプトを用意します。 -------- $ cat hoge.sh #!/bin/sh cat hoge.dat | while read -r line do alldata=$alldata$line done echo $alldata -------- 処理結果は以下のようになりました。 -------- $ ./hoge.sh $ -------- 自分のイメージとしては、処理結果は、aaabbbcccと表示されるはずなのですが、 なぜ表示されないのでしょうか?表示するためにはどうすればいいでしょうか?
>>30 パイプ使うとサブシェルが作成されるから。この場合ループの中身はサブシェルで実行される。
bashでこれを避けるにはcatとパイプの代わりに<でファイルを渡せばいい。
#!/bin/sh
while read -r line
do
alldata=$alldata$line
done < hoge.dat
echo $alldata
ただのファイルなら < でいいけど、どうしてもパイプが必要ならこうかな #!/bin/sh alldata=`cat hoge.dat | (while read -r line do alldata=$alldata$line done; echo $alldata)` echo $alldata あんまりエレガントじゃないか
<() 使うのはナシですか
sh(bash)ではなく、kshに変えるのが一番手っ取り早いな。
#!/bin/sh while read -r line do alldata=$alldata$line done <<EOF `cat hoge.dat` EOF
ほほー
やっぱカッケーな
>>32 これじゃだめ?
#!/bin/sh
cat hoge.dat | (while read -r line
do
alldata=$alldata$line
done
echo $alldata)
質問がほんとうにやりたいことなら、こんなのもあるかも。
#!/bin/sh
cat hoge.dat | while read -r line
do
echo -n $line
done
echo
39 :
>>30 :2012/11/29(木) 01:07:49.13
みなさん、ご丁寧にありがとうございました。 なぜ、期待どおりにならないか理解しました。 ちなみに、こういうやりかたもありますね。 ----------- for line in `cat hoge.dat` do alldata=$alldata$line done echo $alldata -----------
求めてるのと違うだろうけど、これでもできた sed -n 'H;${g;s/\n//gp}' hoge.dat
bash の brace expansion {...} について教えてください. 環境は bash 4.2.39 MacOSX 10.7.5 です. 1$ a=foo 2$ echo $a{_a,_b,_c} 3$ echo $a{,_a,_b,_c} foo 4$ echo ${a}{,_a,_b,_c} foo foo_a foo_b foo_c この変数aの区切りを明示しない時(2$,3$)の挙動がよく分かりません. どう解釈すればいいのでしょうか?
>>41 このように展開される
$a{_a,_b,_c}→$a_a $a_b $a_c
$a{,_a,_b,_c}→$a $a_a $a_b $a_c
${a}{,_a,_b,_c}→${a} ${a}_a ${a}_b ${a}_c
>>42 ああ、よく分かりました。ありがとうございます。
>>41 手元で動作を確認する限り
2$ は {} の展開を先にしてる
つまり $a_a $a_b $a_c としてから変数の処理
=> 何も出力されない
3$ も同様
$a $a_a $a_b $a_c としてから変数の処理
=> $a だけ定義されてるから foo が出力
どこかマニュアルに展開の優先順位があるかもしれないがそれは確認してない
45 :
44 :2012/12/06(木) 22:34:57.60
リロードしてなかった(´・ω・`) すまない...
screen使いです。 bash_historyって何行ぐらいにしている? 直近のhistory | grep hoge | lessってするなら3桁の900行で十分だよね。 もうちょっと前のも検索したいなら4桁の9900行。 # 自分は余裕もってこれ。 9366$ メモリ食いそうだから、スクリプトを組んで今までの全部の履歴十数万行を検索するのも 超ひさしぶりのコマンド用途としてはありそう。その超ひさしぶりに使うコマンド用途なら # とコメントをつけておくとちょっと使いやすいかも。
好きにしろ。
ヒストリーは何行にしてても 端末複数開いてたら消えちゃうし いつ打ったかの時間情報ないし あんまり意味がないよね
>>48 > ヒストリーは何行にしてても
> 端末複数開いてたら消えちゃうし
自分の力量の視野の狭さだとちゃんとexitって閉じると残るよ。
> いつ打ったかの時間情報ないし
> あんまり意味がないよね
時間情報は環境変数の設定で秒数まで残るかな。秒数の小数点はスクリプトで工夫すれば
残せそうかな。そこまでの必要性がないからやっていないけど。
シェルスクリプトでヒストリ残して何がうれしいの?
シェルスクリプト内でhistory使う方法教えて。 #!/bin/sh コマンド1 コマンド2 history と書いて実行してもhistoryが何も表示されない><
>>51 set -o history でどうかな。
>>46 zsh使いなら死ぬまで履歴を残すもんだってばっちゃが言ってたから
50万行にしてる。
もちろん複数の端末起動してもちゃんとshare_historyされる設定。
54 :
名無しさん@お腹いっぱい。 :2012/12/07(金) 23:24:10.48
プログラミング初心者です。 以下のコードがシェルの文法的におかしい点を教えて下さい。 ex1はargvでファイル名を読み込む外部のC++プログラムです。 不足してる情報もあると思いますが、分かる範囲で教えていただけたら助かります。 #!/bin/sh DIRx=$1 DIRy=$2 filesA=`ls $DIRx/*.data` filesB=`ls $DIRy/*.data` for x in $filesA; for y in $filesB; do ./ex1 $f $fi done
なんでそんな間違い方するのか意味不明 釣りっぽい
56 :
名無しさん@お腹いっぱい。 :2012/12/07(金) 23:39:25.77
すみません、釣りじゃないです。 ちょっと調べて、これでできたかもしれないです。 もし間違っていたら教えて頂けないでしょうか。 如何せんコンパイルはできるものの実行結果が合っているか確認する術が無いもので… for x in $filesA; do for y in $filesB; do ./ex1 $x $y done done
質問者ではないのですが この for/do/done の構文 言語仕様策定の上で、do の存在はどうしても必要だったの? 改行かセミコロンでループブロックの区切りは付きますよね もし無かったらアレができないよみたいな do の活用法なんてあるのでしょうか? 単に do/done なら覚え易いよね!程度だったら残念かも
>>56 *.data で得るファイル名に空白がないのなら問題ない
空白があれば
IFS=$'\n'
が必要
文法はいい。というか文法以外のex1の意図がわからないけど
59 :
名無しさん@お腹いっぱい。 :2012/12/08(土) 01:40:05.03
>>58 ありがとうございます、空白はありません。
お陰様でなんとかできました、ありがとうございました。
ex1はただの実行ファイルで、名前に特に意味はありません。
>>54 ,
>>56 釣りとは思わないけど、やりたいことはなんとなくわかるけどケアレスミスが多すぎて
判読不可能。
>>57 どの力が働いて、今の構文なのかはわからない。おまじないってことでいいんじゃないのw
Unix創世期はほとんどがディスプレイなし、テレタイプ端末、スペック貧弱と想像できるから
テキストエディタvi, emacsは使えずに開発環境はラインエディタ。
創世期シェルを作った開発形態・志向も違うだろうし、for-do-doneを言うならcase-esac,
if-fiもどうなのってツッコミたくなるしなあ。その当時回文みたいなのが流行っていたの?
教育言語のPascalも律儀に{}だからね。
現在のemacsでksh, bashのfor文テンプレート使うとdo-doneってつくね。過剰に装飾している
だけかもしれないけど。
61 :
名無しさん@お腹いっぱい。 :2012/12/08(土) 09:21:06.89
>>60 ラクダ本(オライリーのPerlの本)の初版用語集によると、ある語の逆綴りを
採用するのはALGOL主義、だそうだが、elif(fileの逆綴りでもある)がない
理由として半ばジョークめいた書き方だったので話半分に。
# Pascalはbegin/endじゃ…
>>60 born shellの作者がAlgolが好きだったから。
骨?
>>62-63 英語の成績悪かったらしい奴が2人いるみたいだが、突っ込んだら負け。
?マークの意味が分からない奴がいるな・・・
任意の一文字マッチって意味でしょ。それぐらい知ってるよ。
シェルスレなんだから変数が未設定かどうかの確認って答えるべきだな
誰もシェルグロブなんて言ってないけどな
>>67 どういう意味? ?で変数の何が分かるの?
${foo:+hello} fooが nullかunset なら "", それ以外は "hello" ${foo+hello} fooが unsetなら "", それ以外は "hello" 前者は man bash にて仕様が ${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. のように確認できたのですが、後者が見あたりません どの辺を見れば載っているでしょうか? 或いは man レベルでは載っていない仕様でしょうか?
>>73 あ、それちょうど今週のレポートで学生に課したネタなんで、
知ってる人も答をここには書かないでね。(偶然は恐ろしい)
うち学生じゃないんですが・・・ ならせめてレポート提出日が過ぎたら教えてください
さっきのは null か unset の判別はどうやったらいいのか調べていたら見つけた小技です
>>77 ありがとうございます。それですね。
辿ってみたら man bash でも該当する箇所がありました。
そりゃman bashの和訳だもの。
わらかすなよ
>>81 もともとbashのmanは英語で書かれていたんだよ
わかる方がいたら教えてください。 引数で入力した値で、設定ファイル(~/test.conf)の置換文字列(%replace%)を置換することを考えています。 replace_str=%replace% input=$1 sed -e "s/${replace_str}/${input}/" ~/test.conf 上記のようなことを考えていますが、入力値に /(スラッシュ)があると、sedコマンドがエラーになってしまい、うまく置換ができません。 入力値に /(スラッシュ)がある場合でも正しく置換する方法はありますか? また、/(スラッシュ)以外でもNGになってしまう文字はありますか? その文字も正しく置換することは可能でしょうか。
>>83 入力値に絶対入らない文字はある?
あれば / のかわりにそれを使う。
sed -e "s,${replace_str},${input}," ~/test.conf
みたいに。
そんな文字を仮定できないなら、 $1中の / を \/ に置換してからinputに入れるしかないかな。 この置換がまたやっかいかもだが。
replace_str=${replace_str//\//\\/} たぶんこれでいけるでしょう
>>83 \や&も特殊な意味を持つと思うよ
俺なら、sedを使わざるをえないなら$inputに使える文字に制限を付けるかな
sed 's/%replace%/_replace_/g' | m4 -D_replace_="$input"
>>87 相手がWebの先の人間だったりするとそういう制限は難しいんじゃ
シェルスクリプトでHex値を書き換える事は出来ますか? バイナリファイルAのHex値 00100000のようなものを01100000のように書き換えたいです。 駄目元で、 cat A | sed - e 's/00100000/01100000/' > A のようにやってみましたがダメでした。
>>90 きみのsedは16進数値をかけるsedなのかい?
bcかawkでも使っとけ
シェルスクリプト バイナリファイル でぐぐると最初になかなか面白そうなのが出てきた 個人的にはperl使うのが楽だと思うけど
96 :
名無しさん@お腹いっぱい。 :2013/01/05(土) 23:39:03.74
FreeBSDの/bin/shのソースって単体配布されてないのん?
98 :
名無しさん@お腹いっぱい。 :2013/01/06(日) 00:25:20.45
shのソースV7のでおなかいっぱい
>>96 基本的に全部まとめて配布なのが
BSDの良い所の一つだよ。
でも単体取得する方法もある。
その方法とは!?
>>92 xxdで変換したの編集してからxxdで復元
>>102 僕のケータイでも読めた。
でもインストールがわからない。
みんなどーやってインストールしてるの?
僕のケータイリナックスってやつらしいけど
客がシェル使えるよーになってないから
これインストールしたら客もシェル使えるんだ。
でもインストールがわからない。
>>104 configureしてmake install
でもライブラリに分割されるとか魔改造されてて、あっさりとコンパイルできないのが常。 baseシステムに組み込まれてるのは取り出せないと思った方がいい。
MINIX(86)のシェルを移植するのだ!
フリーなの無いでしょ。
109 :
名無しさん@お腹いっぱい。 :2013/01/12(土) 21:11:02.86
2> /dev/null を 2>&- って書くとまずいことあるの? おしえて先生!
>>106 ほとんど手が入っていないであろう net2 のソース持ってくるってのは?
>>109 writeの失敗を検出するようなコードが書いてあると困る
どこにですか?
#include <unistd.h> int main(){ if(write(2,"hello",5) == -1){ return 1; } return 0; } こんな感じかな。
>>109 &- ってどういう構文なの? htmlとか?
>>111 エラーを返さない方が困ります
仕様変更した2chと、 それに対応してない専ブラ使うやつと、 &が何かも知らずにつっこむやつ
と、ドヤ顔で解説する奴と ニヤニヤしながら傍観してるオレ。
あー &ー なのか 失礼
118 :
名無しさん@お腹いっぱい。 :2013/01/19(土) 18:28:47.20
初心者だから使えるコマンドがlsとかなのは共通事項。 たまにネットがおかしいと聞くと言われて打った ifconfigは command not found になったりするんだよね。
ifconfigは/usr/sbinにあったりするからな。
解決策を聞いてるんじゃないよ。(というか知ってるし) そうそうと共感してくれればいいのに。 面倒臭い人ね。
そういう大事なコマンドは/sbinだろ。
どこにシェルスクリプト要素があるんだ?
>>120 誰でも知ってるような事を書いて
共感しろとは、勘違いも甚だしい
さすがに生まれたての赤ん坊は知らねぇだろ
赤ん坊が無知を装うのは大昔からの通例だろ
会話できない以上知ってるかどうか確認する手段がないからな。
127 :
名無しさん@お腹いっぱい。 :2013/01/20(日) 10:43:48.19
くだらない質問ですが、 次のシェルスクリプトで★マークに入る方法があれば教えてください。 ARG0="$0" while [ -h "$ARG0" ]; do ls=`ls -ld "$ARG0"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then ★ ARG0="$link" else ARG0="`dirname $ARG0`/$link" fi done 処理時代はシンボリックリンクの実体を辿る処理だという事は調べて、 なんとか分かったんですが、★の処理にはいる条件がどうしても分かりません。 別に入らなくてもいいのですが、気になってしまって・・・
絶対パスへのリンク、じゃないの?
>>127 解答を聞いてるんじゃないよ。
そうそう、こういう構文だと条件がわかりにくいよねぇー、
って共感してくれればいいんだけど。
ってかreadlinkを自分で分かりにくく書いてみたってことでいいの?
131 :
127 :2013/01/20(日) 11:12:54.89
>>128 ありがとうございます。
絶対パスで調べて、リンクを作りなおしたら通りました。
132 :
127 :2013/01/20(日) 11:25:51.23
>>130 Linuxを使い始めたばかりで、
とりあえず適当なソフトをWebを見ながらインストールしていました。
その中でTomcatというソフトをインストールするのに、
シェルスクリプトの設置が必要と書かれており、そのサンプルが記載されていました。
しかし、サンプルの意味が全く分からなくて、そのまま使っていいのかも分からず
一から調べている最中でした。
リテラシ高いな 感心感心
もし、Aのディレクト内が空だったら、○○しなさい の一番簡単なスクリプトは?
find A -empty | fgrep -x A >/dev/null && ○○
解答を聞いてるんじゃないよ。 そうそう、ディレクトリが空かどうかの判断って簡単にできないよねぇー って共感してくれればいいんだけど。
簡単にできるけど、回答知りたくないらしいから黙っておこう。
コピペやん
それだと内部のディレクトリ数しかわかんねえよ
142 :
名無しさん@お腹いっぱい。 :2013/01/23(水) 21:01:24.46
141が何を主張しているのかエスパーお願い
エスパーしよう。
>>141 は、ディレクトリのハードリンク数が2かどうかで空ディレクトリを判断しても、
それは「サブディレクトリ数+2」の値でしかないから、
内部のディレクトリ数が0で通常ファイルだけ存在する場合まで
空ディレクトリと誤判定してしまう、と主張しているようだ。
要するに、空ディレクトリ≠葉(leaf)ディレクトリ
.と..が必ず存在するから、空ディレクトは存在しない。 ゆえに判定式は定数式。
エスパーってほどじゃないだろ
権限がなかったり
教官!できない…
150 :
名無しさん@お腹いっぱい。 :2013/01/24(木) 08:38:20.39
ようするに
>>141 は . と .. がリンク数に含まれることを知らないってことかな
空ディレクトリが存在しないのであれば rmdirはどのディレクトリも削除できないのでは?
こまけぇことは気にしないで消せばいいんだよ
>>152 空ディレクトリは.と..以外のファイル/ディレクトリが無いディレクトリのこと
/a.appを起動 プロセスを終了 を5秒ごとに繰り返すコマンド書いてくださいな
なんでそんな傲慢なの?
そうそう、アプリを起動してプロセスを終了を、 5秒ごとに繰り返したりしたいこと多いよね、共感します。
>>155 プロセスを終了 って、どのプロセスでもいい?
>>155 while sleep 5;do pkill a.app;/a.app &;done
ほんとはpid拾うべきか。$?だっけ。
$! な
.appって拡張子はMac OS Xのbundleか? だとするとopen -a /a.appだろうけど、まあapplescriptで書いた方がいいよ。 ジェントルに終了させられるし。
applescriptって#がコメントにならないから #!/usr/bin/osascriptって書けないんだよね…。
ファイルの一行目だけ特殊扱いしてくれればいいんだけどな。 そういうLisp系のインタープリタある。(そもそもLisp系は行頭の#がちと特殊だが)
>>162 2行目以降を使うスクリプトを書いてそれをシェバングにしたら?
>>164 残念。
シェバングに指定できるのはバイナリだけ。(スクリプトじゃ駄目)
>>165 じゃあperlかなんかで1行に凝縮させればおk
あれ?バイナリじゃなくても動くぞ? うちの壊れたか?
shellが実行する場合もある。
いずれにせよexecve(2)の中でやることだし、 最近は自分で処理するシェルもいるし。
170 :
名無しさん@お腹いっぱい。 :2013/01/25(金) 21:06:05.27
osascript は Leopard 以降なら sh-bang を理解するお。
うろ覚えだけどbashの挙動は とりあえずexec*してみる -> 駄目だったら/bin/bashで実行してみる の2段構えだったような。
FreeBSDだと #!インタプリタ にバイナリしか指定できないが、 Linuxだとインタプリタがスクリプトでも動くようだ。
BSDはダメだな ずいぶんと中途半端な意識だな
>>172 だから、それはLinuxの機能じゃなくてbashの機能でしょ。
_人人人人人人人_ > bashの機能 <  ̄Y^Y^Y^Y^Y^Y ̄
>>174 bashの機能じゃなくてカーネル(システムコール)のexecve(2)の機能なんだけど。
BSD系って結構厳密みたいだね。 #!/usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin sh のどこか適当なshを使ってという方法もできないような。
それって厳密か?
何を厳密といってるのか知らないけど、#!行ではオプションは一つしか指定できない。 ↓これはダメ #!/usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin sh
>>180 だから、それはFreeBSDの仕様じゃなくてashの仕様でしょ。
_人人人人人人人_ > ashの仕様 <  ̄Y^Y^Y^Y^Y^Y ̄
>>183 仕様変えた。Linuxでも古いカーネルだと#!/スクリプトは不可。
#!スクリプトがループしてた場合は単にexecve(2)がエラーになるだけ。
一応ループ判定はしてるみたい。
>>183 スクリプトのネスティングが4回程度でエラーになるようになってるから、
ループしてたらそれでエラーになる。無限ループでハマることはない。
なるほど、
>>177 25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
26 (bprm->recursion_depth > BINPRM_MAX_RECURSION))
BINPRM_MAX_RECURSIONまでは再帰するのか。
>>183 の例では/bin/aho, /bin/bakaの実行を何回も試みてBINPRM_MAX_RECURSIONに
達してやっとエラーか。 ダサッ
シンボリックリンクのループ検出と一緒だろ。OSによらず。 2つだけでループしててもMAXに達するまでずっとたどってようやくエラー。
そういえばそうだな。でも自己参照くらいはその場でチェックしてもいいだろ。 $ cat /bin/aho #!/bin/aho
その場でチェック()
Patches Welcome
そもそも自己参照していない正常なスクリプトの方が圧倒的に多いんだから、 自己参照をチェックするとそのオーバーヘッドが、全ての正常なスクリプトにも 負担させられることになって、実行速度がかえって遅くなるかと。
ファイルからの読み込み行ってるんだから、スクリプトファイル名の比較の 負荷なんてゴミでしょ。
>>192 のプログラマのセンスのなさはわかった。
まずコードを書け、話はそれからだ
>>196 何を言ってるんだ?コードの話をしているお前ら全員だよ
>>187 > シンボリックリンクのループ検出と一緒だろ。OSによらず。
シンボリックリンクのループ検出なんてある?
どういった場合に検出する?
>>198 $ ln -s hoge /tmp/hoge
$ cat /tmp/hoge
cat: /tmp/hoge: Too many levels of symbolic links
200 :
名無しさん@お腹いっぱい。 :2013/02/12(火) 18:33:08.66
>>200 1は3経由で最終的に2にコピーされて、その状態でsome-command が実行されてる、
で合ってるよ。
その「2にコピーされたもの」はパイプの入力だから、
結果的にsome-commandの標準エラー出力がパイプにつながる。
some-commandの標準出力は
>>201 のとおり /dev/nullに捨てられてる。
リダイレクトは左から順番に解釈していけば良いよ。 (1) 3は1(標準出力)に向けられる。 (2) 1は/dev/nullに向けられる。 (3) 2は3(標準出力)に向けられる。 (4) 3は閉じられる。 結果として 1は/dev/nullに2は標準出力に向いてる。
再度質問です
shの機能で
>>200 みたいに だーってリダイレクトが出来るじゃないですか
その文法から「1」が最終的にどこ行ったのか わーって追跡したいんです
出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるような回答を強く期待します
僕はこういう小バカにしたような書き方しか出来ませんが、凄く切実に知りたいです
さぁどうぞ↓
205 :
200 :2013/02/12(火) 21:09:43.68
うごごごご
>>204 > aその文法から「1」が最終的にどこ行ったのか わーって追跡したいんです
ktrace とか truss とか strace ってのはダメ?
シェル変数にコマンドを文字列として設定しておいて、それを実行したい。 CMD="printf '%x %x\n'" #これはダメ $CMD 13 32 を実行して printf '%x %x\n' 13 32 と同じ出力を得たい。 $CMD 13 32の行は変更不可。 CMD="printf '%x %x\n'"ではダメでした。 CMDにどのような文字列を与えると実現できるでしょうか? bashの拡張機能を使ってもよいですが、なるべく使わない方向で。
お題が不正確でした > $CMD 13 32の行は変更不可。 $CMD 13 32 を含むシェルスクリプトがある。環境変数としてCMDを与えて printf '%x %x\n' 13 32 と同じ出力を得たい。 CMDに #!/bin/sh printf '%x %x\n' "$@" というスクリプトのパスを与える方法は思いつきましたが、スクリプトファイルを作成しないで実現したい。
>>208 CMD='printf %x\040%x\n'
バックスラッシュが化けるので全角にしたので半角に直してね
evalって知ってる?便利だよ
>>210 > $CMD 13 32の行は変更不可。
evalも使用不可
>>211 CMDの中にeval入れれば行けるだろ
CMD="eval print ..以下略
ももクロはズリネタ探しをしている人には理解出来ないよ
awkのprintで 1, print $2 2, print \$2 3. print\ \$2 1、2は2列目て事だと思うけど3てどうなるの?
217 :
215 :2013/02/17(日) 01:31:05.17
あれ・・盛大に誤爆ってたwごめん
>>214 呼び出すところが変わってないから良いんじゃないの?
2chの画像スレ開いて、Ctrl+aでコピーしたのをdl.txtにコピーしておいて そのカレントフォルダでこれ実行すると、びっくりするほどユートピア grep -E "(^http|^ttp)" dl.txt |sed -e "s/http/ttp/g; s/ttp/http/g"| wget -A jpg,png,gif -N -i -
昔そういう事やってたけど グロ画像が紛れ込んじゃうからやめたよ 安心してシコシコできない
221 :
219 :2013/02/20(水) 21:54:17.39
>>220 それなんだよ...URLのブラックリストとか出来ないかな?まぁ出来ても遅くなりそうだけど
ブラックリスト作っておいてgrep -vで除外するくらいかな? いちいちグロ画像調べてNG登録するのが嫌でね…
grepしてからsedですか、そうですか
>>221 専ブラ使えよ。
グロってレスがついてたら、モザイクかけてくれたり。
>>219 スレとってくんのもwgetでいいだろ。なぜに手動。
>>224 >グロってレスがついてたら、モザイク
それ便利そうだな! どこの専ブラ?
うちはかちゅ〜しゃ使ってるけど
>>220 いやいや、落としたら、シコシコする前に、まず賢者モードで分類とか整理しろよ。
230 :
名無しさん@お腹いっぱい。 :2013/02/22(金) 12:12:03.87
シェルスクリプト内でtarアーカイブ化するとき、アーカイブ名に変数を指定したいのですが、 エラーが出てtarが生成されません。なにが間違っているか教えてください。 strArch="~/Desktop/a.tar" /usr/bin/tar cf ${strArch} 1.jpg 2.jpg 3.jpg と書くと /usr/bin/tar: ~/Desktop/a.tar: open 不能: No such file or directory /usr/bin/tar: Error is not recoverable: exiting now というエラーが出ます。 一方、 /usr/bin/tar cf ~/Desktop/a.tar 1.jpg 2.jpg 3.jpg と書くと正常にa.tarが生成されます。
231 :
230 :2013/02/22(金) 12:13:52.84
環境はcygwinで、シェルはbashです。
>>230 変数の中のチルダは展開されない。
$HOME/Desktop/a.tar
を使え。
>>232 できました!
ありがとうございました。
iPhoneのSBSettingsのトグルを押すとIMAProwlが起動するようにしたいのですが嵌りました。 /private/var/mobile/Library/SBSettings/Commandsにcom.hoge.imaprowl-launch-when-toggle-is-off というスクリプトから、/private/var/root/scripts/に置いたprowlchk.shを実行してimaprowl.rbを起動 させたいのですが失敗してます。 ターミナルから直接prowlchk.shを実行すれば起動します。 com.hoge.imaprowl-launch-when-toggle-is-offの中身は #!/bin/sh touch /var/mobile/Library/Preferences/com.hoge.imaprowl.flagfile echo "com.hoge.imaprowl-launch-when-toggle-is-off" >>/var/mobile/script.txt source /private/var/root/scripts/prowlchk.sh です。
/private/var/root/scripts/に置いたprowlchk.shの中身は #!/bin/sh ps ax | grep '[i]maprowl' if [ $? -eq 1 ]; then cd /private/var/root/IMAProwl ./imaprowl.rb fi です。 private/var/mobile/Library/SBSettings/Commands/com.hoge.imaprowl-launch-when-toggle-is-off をターミナルから実行すると、 883 s000 R+ 0:00.02 /bin/sh ./com.hoge.imaprowl-launch-when-toggle-is-off となって、ログにボタンが押された事は出力されてますが、 /private/var/root/scripts/に置いたprowlchk.shは実行されずに、imaprowl.rbが起動しません。 検索してみてcdじゃなくドットコマンドやらsource使えだの試してみましたが、限界です。 アドバイス下さい。
grep '[i]maprowl' のところで、 com.hoge.imaprowl-launch-when-toggle-is-off 自身が引っかかっててif文の内部が実行されてないんじゃないの?
>>236 さん、全く気が付かなかったです、今からちょっと治して試してみます、ありがとうございます。
ファイル名変えて動きました。
>>236 さん有難う御座いました。助かりました。
239 :
234 :2013/03/06(水) 20:58:57.40
連投してすみません。
>>236 さんのアドバイスで
/private/var/mobile/Library/SBSettings/Commandsにcom.hoge.imaprowl-launch-when-toggle-is-off
から
/private/var/root/scripts/prowlchk.shを実行させることが出来るようになったのですが、
IMAProwlがDaemon化に失敗しているのかすぐに落ちてしまいます。
ターミナルから直接/private/var/root/scripts/prowlchk.shを実行すると、
hoge:~ root# /private/var/root/scripts/prowlchk.sh
LoadConf: /private/var/root/IMAProwl/config.yml
hoge:~ root# Daemonized. PID=4412
All logs will be written into /var/root/logs/imaprowl.log.
となって、ps axで見てみると
4412 ?? S 0:02.23 /usr/bin/ruby ./imaprowl.rb
でstatがSでちゃんとimaprowlが動作するのですが、
com.hoge.imaprowl-launch-when-toggle-is-offからprowlchk.shを実行した直後に、
ps axで見ると
4549 ?? R 0:02.75 /usr/bin/ruby ./imaprowl.rb
でstarがRになっています。
もう一回ps axで見ると./imaprowl.rbが落ちています。
なんでSにならずにRになってしまうのか、全く見当が付きません。
prowlchk.shに不足や問題があるんでしょうか。
cat のコマンドライン引数で指定できる参照ファイルの数はいくつなのか、どうしたらわかりますか
>>240 ファイルの数での制限じゃなくて、引数(ファイル名)の文字列の合計のバイト数で制限される。
man sysconf で出てくる sysconf(_SC_ARG_MAX) の値が最大値。
普通2MB程度ある。
>普通2MB程度ある。 「普通」と言い切るには辛いような。 >uname -sr; getconf ARG_MAX FreeBSD 9.0-RELEASE-p3 262144 $ uname -sr; getconf ARG_MAX Linux 2.6.18-194.11.4.el5 131072 $ uname -sr; getconf ARG_MAX Linux 2.6.32-279.9.1.el6.x86_64 2621440
243 :
240 :2013/03/12(火) 01:55:55.14
なるほどめちゃよくわかりました
なるほど普通のOSでは2.5MBほどあるんですね
昔の普通のOSでは数KB程度だったよ
windowsなんてもっともっと少なかったような。
DOSは128バイト
>>247 MS 系の OS はほとんど使ったことがないので聞くんだけど,
Unix 系でも, tty からの入力に対しては別の制限があること
はあるけど, それは, スクリプト内部の処理でも同様だったの?
だとすると, グロブの展開できないんじゃないの?
MS-DOSはCP/Mと互換のメモリ配置で、CP/MではDMAバッファ領域(80H〜FFH) だったところに初期値としてコマンドライン引数が展開された。 グロブの展開はシェルの仕事ではなく、プログラムが自分でやる。 MS-DOSの新しい奴は知らん。
250 :
忍法帖【Lv=4,xxxP】(1+0:8) :2013/03/12(火) 21:04:44.16
ps ax って人と ps -ef って人がいるんだけど、どっちなのよ
ps axはbashの機能
SYS-VとBSDの違いだろ
DOSの話はよその板でやれよ。
ps -efはDOSの機能
255 :
忍法帖【Lv=4,xxxP】(1+0:8) :2013/03/13(水) 07:53:20.45
>>252 書く順番が逆じゃんw
linuxのpsはどっちも理解する。
>>256 もとより順番揃えて書いてないんだけど・・・
それは意識して揃えようよ
構文が合ってるはずなのに、どうしても動いてくれないスクリプトがある。 メインスクリプトから裏で呼び出されるため、コンソール上でエラーを確認できなかった。 一晩みても、原因不明だった。 echo ここまでOK >>log.txt を随所に入れて トレースデバッグすると、途中で止まる。あきらめて寝た。 翌日、再開したら1分で原因判明! 他言語とゴッチャになって、1箇所だけコメントの先頭をセミコロンにしてたwww #に直したら一発起動。はぁあああああああああああ。 あとテストの [ $a =1 ] とイコールの次にスペースを開け忘れて、 常に不動作のif文もあった。 こういう超基本的な凡ミスに対して、作りたてのスクリプトを流し込むと アラートを出すツールってありますか? windows上でもシェル上でも、どちらでもおkです。
>>260 それってどうやってミスなのか意図的なのか判断するんだよ?
キミがミスした所は使い方によっては正しい場合もあるんだよ。
ありません。これ昔からだなぁ ハイ次↓
>>261 横槍を入れてすまんが、
「これってミスじゃねーの?」っていちいち指摘してくるコンパイラがあるのだから、
シェルスクリプトも同様の支援プログラムがあってもよいのでは。
需要があるのかどうか知らないが。
sh -n
>>264 需要はあるね
走行するまでわからん、ってのはダサいからな
>>263 その=はファイル名の=かもしれないからなぁ
[ $a =1 ]
はもしかしたらa='-d'でファイル「=1」がディレクトリかどうか
判断してる場合もあるよ
ところで数値のテストをしたいなら
[ $a -eq 1 ]
とした方が良いんじゃないかな
>>268 warningはほしいよな
Cコンパイラですら = と == は警告対象だ
たとえあったとして、「このセミコロンって#の間違いじゃね?」とか警告だすか? それはそれでウザいんだが。
そうだな自分が良く間違うパターンを検索するスクリプトを書けば良い。 他の人には必要ないよ。
273 :
名無しさん@お腹いっぱい。 :2013/03/13(水) 22:01:47.54
>>250 「カッコウはコンピュータに卵を産む」で、侵入者が使ったpsコマンドの
オプションから、SysVユーザーと看破していた。
それわざわざ書き込むほどのことか?
>>270 -n でチェックしてるときは出してほしいな
>>273 まじか。そんなかっこいい小説だったのか。
277 :
名無しさん@お腹いっぱい。 :2013/03/14(木) 16:17:13.28
お尋ねします。 list.txtに a 111 b 222 c 333 といった各行二つの要素のデータを格納しています。 それぞれの行について、一つ目の要素をファイル名に、二つ目の要素をファイルの中身に しようと思います。 a.txtの中身は111 b.txtの中身は222 c.txtの中身は333 といったたぐいです。 書いたスクリプトは #!/bin/bash for a in `awk '{print $0}' list.txt` do for b in `awk '{print $1}' list.txt` do echo $a >$b.txt done done とした結果全てのファイルの中身が111となってしまいました。 for文を理解出来ていないように思います。 どなたか救いの手をよろしくお願いします。
while read filename data; do echo "$data" > "$filename" done < list.txt
279 :
名無しさん@お腹いっぱい。 :2013/03/14(木) 16:40:39.76
動きました。 readのあとに変数を並べればその順番に読み込むことを 教えていただきありがとうございました。 一行ずつデータを読むreadと 無限ループのwhileの組み合わせを用いると。 多謝
いや無限ループじゃねーよ?
もしもデータが無限なら?
それは
>>279 がnamed pipeを知っている場合に限られる。
思いのすべてをデータにして
シェルとバッチって、癖の回避的に、どっちがクソ?
>>282 いつかはマシンがお亡くなりになって終わるんじゃね?
シェルスクリプトとバッチって、癖の回避的に、どっちがクソ?
何言ってるかさっぱり分からん。 癖の回避?
燃料を投下したのにあっさり流された
対話型しか選べないコマンドってクソだと思うわ
expectやptyがあれば怖いものはないです。
expectやpty通さなきゃならないコマンドってクソだと思うわ
ヒアドキュメントで良いじゃん
>>295 おまえヒアドキュメントでsshのパスワード入力できんのかよ
じゃあ冷やすとリングで
>>296 ssh 自動化させるならパスフレーズ設定しない公開鍵作成しろよ。
公開鍵とパスフレーズ両方使うよ (震え声)
302 :
240 :2013/03/20(水) 14:17:01.94
manが壊れて真っ白なんだけどどうしたらいいですか
何言ってんだ。
>>303 manのDBがぶっ壊れたんじゃねーの?
mandb -c
でもやっときゃ治るんじゃね?
305 :
名無しさん@お腹いっぱい。 :2013/03/20(水) 15:54:26.54
roffソースは見えるのか? nroff -man とか -mandoc とかでは見えるのか?
元々は
>>292 か
で、
>>308 サーバーがクソだという結論(sshの場合は)
対話が必要ってことは人間(
>>308 )にも使い道があるってことだよ。
なるべく減らした方が良いのは言うまでもないけど難しいね。
すれ違いだけどsshにはssh-agentとかagent forwardとかあるから
そういうことにも配慮されてる。agent forwardするとbackgroundで
動かしつつlogoutすると新規に接続できなくなるけど。
パスワードでのrloginはできるけどssh/rshは使っちゃダメな会社はあるらしいね リモートでシェルコマンド実行したいときは仕方なくexpect+rlogin使ってるらしい 何を考えてそういうポリシーになってるのかは謎
>>300 どうやってサーバーサイドで公開鍵のパスフレーズ必須にできるんだよ。
できないと思いこんでる情弱だらけだな
316 :
名無しさん@お腹いっぱい。 :2013/03/20(水) 21:45:17.55
ssh1,ssh2ともにプロトコル上パスフレーズ送らないんだから、制限なんか出来るわけがない。
317 :
名無しさん@お腹いっぱい。 :2013/03/20(水) 21:46:23.08
そもそもパスフレーズは秘密鍵側に設定するものであってだね。
318 :
名無しさん@お腹いっぱい。 :2013/03/20(水) 21:47:36.65
「長いログインパスワード」だと思ってるんじゃねーの。
319 :
名無しさん@お腹いっぱい。 :2013/03/20(水) 21:58:29.79
「鍵認証を禁止してパスワード認証のみ許す」なら 出来るから、それと混同してるんじゃないかな。
expectって古くない?それ専用でスクリプト書かないといけないし、tclが要るし。emptyってどうよ
>>316 もう1つ方法があるだろ、知らないのか?
>>321 バカに教えておいてやる。rfc4252で定義されている認証方式は
7. Public Key Authentication Method: "publickey"
8. Password Authentication Method: "password"
9. Host-Based Authentication: "hostbased"
の三種類。このうち公開鍵を利用した認証方式は7と9
7,9のどちらもパスフレーズは送らない。
あきらかに間違ったことを書いて適当に煽ると正しい情報が出てくる。 2chの情強視点の正しい使い方。
何という高等テクニック
>>324 たださらに間違いを重ねてくる場合も。微妙に間違える場合も。自分で確認しろってことやね
>>314 サーバサイドってか、会社のポリシーで強制してんじゃないの。
328 :
240 :2013/03/21(木) 07:35:03.32
流れ無視してわるいけど 303、304、305、307さんありがとね ちょっと試してみます
うちのサーバは秘密鍵使えない仕様になってる
>>327 「会社の方針」を↓このように説明する奴は会社員失格
> From: [300] 名無しさん@お腹いっぱい。 <sage>
> Date: 2013/03/20(水) 13:11:02.19
>
>
>>298 > できないサーバがあるんだよ
いつまでやってんだ。
>>300 が「できないサーバ」を解説すれば終了するんじゃないかな。
商用で使ってるから sendmail に設定入れちゃダメだけど、 メールで毎日ヘルスチェックレポートをメールで飛ばしたい。 SW側で smtp も pop も閉じてる。 とか、意味の分かんない要望を満たすスクリプトを組んだことがある。 世の中、変態が多いと思ったよ。
ここ何のスレだっけ。
336 :
忍法帖【Lv=8,xxxP】(1+0:8) :2013/03/23(土) 19:42:31.83
[[ ! -d hoge ]] && mkdir hoge [ ! -d hoge ] && mkdir hoge これってどっちも同じ?
[[ ]] は bashの機能! わざわざtestしなくても mkdir hoge 2> /dev/null でいいよ。 test方式だとクリティカルパスになるから不完全だし。
>>336 [[ ! -d hoge ]] の場合、hogeにワイルドカードが含まれていても展開しない。
[ ! -d hoge ] の場合はワイルドカードを展開する、という違いがある。
339 :
忍法帖【Lv=8,xxxP】(1+0:8) :2013/03/24(日) 10:14:14.17
シエルってやはりプログラム言語として万能では無いね
あたりまえー。
未だに万能なプログラミング言語に出会ったことがない。 汎用なら使っているが。
>>337 [[ は bash じゃなくて ksh 由来。
まぁ bash の機能ではあるな。 それ言ったら [ も bash の機能だけど。
kshってポジックス()準拠じゃなかったのかよ
市販のルータやNASに同梱されてるスクリプトを覗くとき cd /home/LANDISK/scripts/ cat *.sh ってやると、バイナリファイルが混じっててビビるんですが、 あれはなんなんですか。
自己解凍のtar玉とかじゃないの ファイル先頭部分のみシェルスクリプトになってて、 ファイル後半にtar玉とかのバイナリが連結されてる。 シェルはバイナリ部分を読む前にexitするし、バイナリ部分をtail -n +XXX とかで 取り出すからこれで動作できる。
ただの文字化けじゃないの。
どうも。文字化けではなく、でもなぜかしょっぱなからバイナリです。 setuser.sh ELF エディタで開くと、こんな感じです。
だったら普通のELFのバイナリじゃん。ファイル名の統一上、*.shになってるだけ。
牛肉偽装より悪質ですね。失望しました。
file setuser.sh
>>352 bash$ file
sh: file: command not found
>>353 おそらくlddコマンドもないだろうから、
LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
してみ。動的リンクならライブラリが表示されるし、
静的なら not a dynamic executable ってなる。
>>354 ありがとうございます。こうなりました。
# LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
libc.so.6 => /lib/libc.so.6 (0x2957c000)
libnss_dns.so.2 => /lib/libnss_dns.so.2 (0x296bb000)
libnss_files.so.2 => /lib/libnss_files.so.2 (0x296cf000)
libresolv.so.2 => /lib/libresolv.so.2 (0x296e9000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x29556000)
このようなバイナリファイルが中で何をしているのか可読化するには、
どこまで可能でしょうか。
いいかげんスレ違い。
LANDISKって玄箱だろ。とっくに解析しつくされてたんじゃねーの。 ソースだって入手可能だった気がするが。
>>320 perlで動く expect.pm 使ってね
日本語マニュアル、古いのはあったんだけど公開サーバ無くなちゃったな
どうすっかな…
diffでファイルをだーって比較すると相違行が表示されるじゃないですか その相違行の違う文字の部分だけぱーっと色を付けて表示して欲しいんです 出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません サルでも分かるようなシェルそのものの回答を強く期待します さぁどうぞ↓
360 :
名無しさん@お腹いっぱい。 :2013/03/29(金) 22:44:19.37
docdiff でぐぐるといいかも。
361 :
名無しさん@お腹いっぱい。 :2013/03/29(金) 23:57:55.81
>>359 GNUのsource-highlightとかでもいいの?
>>359 二行の文字列の相違部分を目視で比較して認識でいないと
吐露していますか?
猿以下の認識能力しかないのに、猿が理解できるレベルの回答を得ても
無駄でしょうに。
>>362 自分の文章(文字列)のtypoを発見できない人に言われても…
やっぱりハイライト表示あった方がいいわな
>>362 できる/できない論と、効率化、処理コスト削減を同列に語ったら駄目だよ。
すいません。 教えてください。 sh=${SH:-/bin/bash} と言う処理の :- ってどういう意味でしょうか?
>>367 似たのがいろいろあるからman shした方が良い。
:-は「Use Default Values.」$SHだけど$SHがunset or nullなら/bin/bashになる。
なるほど、bashの機能でしたか、、
何を質問しても全部否定的に回答されるスレ
んなこたーない。
そうですね そしてこれは否定的でない回答です
すみません、if ! command ってどういう意味ですか? 「もし!」って強調してるんですか?
ステータスの否定です。
ネタ書き込む前にほんとに面白いかどうかいったん考えような。
378 :
名無しさん@お腹いっぱい。 :2013/04/08(月) 06:23:01.14
>>377 そう思うのはおまえのスキルの問題、もっと勉強しましょう
zshを極めた俺は腹抱えた笑ったぞ
HAHAHAHAHAHA
かわいそうに…
ネタを書いた奴がつまらんのはいいとして つまらんものにつまらんってマジレスしちゃうバカは救いようがない
つまらんものはつまらんってマジレスしちゃうバカは救いようがない ってマジレスしちゃうバカは救いようがない
>>380 つまらんものはつまらんと言っとかないといかんでしょ。
おもしろいと勘違いしたまま書き続けられたらたまらん。
マジレス否定派ってマジだと勝てない人達だよな
>>382 本当につまらんならつまらんとか書いちゃいかんでしょ。
「つまらん」の反応が欲しくて書き続けるから。
>>384 1回は言っとかないと。
それでやめないようならもうしょうがない。
つまらんだらけの掲示板なんて誰も読まない つまらないなら自分が面白いことを書けばいいんでね? つまらん だけ書いても誰も同意しねえよ
やっぱり全部否定的に回答されるスレ
別に同意求めてるわけじゃないもの。
bashで hoge=`command1 | command2` としたときにcommand1,command2の返り値を得たいのですがどうすれば良いのでしょう。 ${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。 うーむ。
command2の返り値というよりサブシェルのパイプライン全体が親シェルの普通のコマンドになって、 その返り値が親シェルのPIPESTATUS[@]に入るから、親から見たコマンドはひとつしかないので値はひとつ。
そんなのすでに知ってます
set `command1 | command2; echo ${PIPESTATUS[@]}` hoge=$1 echo $2 # command1の返り値 echo $3 # command2の返り値 …じゃ駄目か
そんなのもちろんだめです
>>389 素直にこれじゃいけないの。
hoge=$(command1)
fuga=$(echo $hoge|command2)
そうやって書いてくと、スクリプトさしいスマートさが消えますよね。 他のbashスクリプトを見てますけど、例外処理って一部しかしていない。 そんなものですか?
何故標準出力とPIPESTATUS全てが必要になるかだな。
command1が失敗したら終了させるには pipefail で十分だし
一個でも処理が失敗したら終了させるには set -e でいい
>>396 の想像する完璧な例外処理とスクリプトのスマートさってのは良く分からんが
少なくともtry...catchみたいなのが言語に用意されていない以上すっきりした解決策はないんじゃなかろうか
まあ普通のプログラミング言語でも必要になるのは最後の例外だけで
PIPESTATUS全てが必要になることなんて滅多にないんだが
> ${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。 PIPESTATUSにはhoge=の結果、すなわち変数hogeへの代入の終了ステータスが入る。 hoge=`command1 | command2; echo ${PIPESTATUS[@]} >file` でfileから読める。
一時ファイルとかmkfifo使っていいならいくらでも方法はあるな
後出しならいくらでも方法はあるな。
401 :
名無しさん@お腹いっぱい。 :2013/04/09(火) 09:29:22.70
set -o pipefail 知りませんでした。
質問する人はトリップつけといた方がいいね。
pipefailの動きがよくわからない とちゅうでエラーになったら中断してそのエラーになったプロセスの エラーコードを返すの?
rightmost command to exit with a non-zero status
そんなのもちろん知ってます
最後から2番目のコマンドのエラーを持ってくるの?
rightmost の英語の意味通り
for file in hoge*; do ... done 的なことをするときに hoge* にマッチするファイルがない と、file に hoge* そのものが渡されてしまいますよね? これに対して 1) マッチしないときは何もしない or 2) マッチしなかったことを知りたい という挙動に したいのですが、何かいい方法はありますかね? 今のところ 1) のためにループ内で -f $file を調べているのですが、 ちょっとどうにかならないかなあと思いまして。
というかまあアスタリスクの挙動のことですよね。 何もマッチしないときだけパターンそのものを返されても誰得? 個人的には何も返さないでほしいような。 もしかしてパターンそのものが返ってきてるかどうかをチェックすることにより マッチングの状況を調べることが想定されてるとか?
>>408 shopt -s nullglob
>>409 すみませんが詳しい方のみ回答をお願いします
411 :
名無しさん@お腹いっぱい。 :2013/04/09(火) 21:51:21.35
いや、408と409同一人物だろ
>>410 おおそんなものが。ありがとうございます。
ちなみにPOSIXなshの範囲で同様なものはないですよね? bashでないshを
使うときもあるので...
ああすいません 408 = 409 です。ひとりボケひとりつっこみすみません。
何もマッチしないときにパターンそのものを返す理由 xterm -fn -*-fixed-medium-r-normal--14-* みたいな感じでアスタリスクそのものをコマンドに渡すことがある。 たまたま-*-fixed-...みたいなファイルがカレントにある確率は無視できるので、 そのままパターンそのものを返すという仕様の方がコマンドラインではありがたい。 xterm -fn '-*-fixed-medium-r-normal--14-*' みたいにきちんとクォートするのが厳密ではあるが。
>>414 なるほど。
ちなみにそれはどこかからの引用でしょうか? どこかにこの展開ルールの
意味が説明されているのかなあと。
>みたいにきちんとクォートするのが厳密ではあるが。
ですかね。久しぶりにxfontselを覗いてみたら、私の環境では&や空白を含む
名前があったりするのでクォートしないとうっかりやらかしそうです。
416 :
忍法帖【Lv=9,xxxP】(1+0:8) :2013/04/14(日) 22:23:25.30
findであるファイルより古い一覧って出来る? ! -newer やったらあるファイルも含まれるよね?
417 :
名無しさん@お腹いっぱい。 :2013/04/15(月) 01:55:26.21
418 :
忍法帖【Lv=9,xxxP】(2+0:8) :2013/04/15(月) 02:10:38.74
ごめんggっても見つからんかった。 ! -newer やったらその時間も含まれちゃうよね?
! -name そのふぁいる
>>419 それでも そのふぁいる 以外のその時間も含まれちゃう
悪いけど !-newer からあるファイルと同時刻のものを 取り除かないというシチュエーションが思いつかない。 同時かどうかなんてファイルシステムの時間精度によって異なる訳だし。
きっついな〜
差分backupだと前回生成したファイルを参考にして含みたくない時はある。他のとこに置いとけと言われれば、そのとおりだけど。 +newerってなかったっけ。
424 :
忍法帖【Lv=10,xxxPT】(1+0:8) :2013/04/15(月) 22:23:55.60
>>421 日単位や月単位のディレクトリに更新日でファイルを振り分けたいのよ
例えば、
mkdir 2013-01
touch 201301010000 start
touch 201302010000 end
find . -newer start ! -newer end | xargs -I{} mv {} 2013-01
みたいな。
んでも、201302010000のファイルも移動しちゃうじゃんね。逆に201301010000のファイルは移動しないし……
なんかいい方法ある?
find2perlつかえ
初めてスクリプト触ったんだが、これelifとかオプションが-rみたいにかなり省略してるんだけど何か理由があるの? renameとか分かるように書きたいんだが、何か方法は有りますか?
変わったやつだな。 それぞれの言語に流儀ってもんがあるんだ。 どう考えてもそのまま覚えたほうが身のためだろ。
>>426 理由なんてないよ
昔の人がそうやって短縮してそのまま放置して
今なおそうとしても 昔のコードが動かなくなるから
もうにっちもさっちもいかなくなってるだけ
>>427 長くてもパッと見てどういう処理なのか分かりたいんだ
オプション覚えろって言われたらそれまでだが
はいそれまでです
bashはスクリプトであると同時に毎日書くものだからな $ tar zxvf hage.tar.gz ってタイプすれば済むところを $ tapeArchiver --gzip --extract --verbose --file hoge.tar.gz とは書きたくないだろ。 まあ最近は長いオプションと短いオプション両方用意してるのも多いけど。 あとelifとかelse if とかelsifの違いは本当に好みの問題だな。 elifに文句行ってたらpythonなんて使えんぞ
pythonなんて誰も使ってないから大丈夫
elif大好き!
このALGOL主義者め!
>>429 慣れろ。よく使われるオプションなんて、似たり寄ったりだ。長い物には巻かれとけ。
-v は verbose
-h は help
-f は force
-f は file
-r は…シラネ。
r は --recursive だろ?
-v は --version だな
--dry-runとか--sumilationとか--testとか、大事なやつなので統一してほしいな。-nが多い気がするけど。
趣味レーション?
442 :
名無しさん@お腹いっぱい。 :2013/04/17(水) 06:44:29.58
コンバットレーショーン て歌あったよな てんむすだっけ
>>440-441 カタカナ表記でそれ間違える奴よくいるが、英語スペルで間違えてる奴初めて三田。
>>443 あースマフォのゴダン入力で悩んだ末に間違えたよ。qwertyキーボードなら指が勝手に動くだろうから大丈夫。
>>426 はこの際オプションのm17nやれ。
-r, --recursive
-再, --再帰
な。
コマンドオプションはビックリするほど統一感ないけど -r はそのなかでも飛びぬけてバラバラだよな
まだ - を使うだけ統一されてる。 ddコマンドなんとかしろ。if= of= bs= とか、UNIXのコマンドじゃないみたいな世界観。
tarのオプションもいやだな まああれはシンタクスシュガーだけど
getoptsでついでにusageの書き方も定義してほしかったな
>>448 最近はハイフンつきオプション使えるtarも多いっしょ。
>>450 そうなのか
あれハイフン使えるのって最近の話だったのか
逆に思ってた
UNIX文化は業が深いな
tarのoptionはarから来ていて、 arとかddは他のOSの類似コマンドの模倣だったはず。 (t)ar, dd, findが鬼門かな? cpioもdebianのdpkgが使ってるんだっけな?
cpio使ってるのはrpmだったと思う debはar系だな
いーかげんな知識で語るやつばっかだな。
どこがいい加減なのか正解込みで指摘してみろ
それはおれだ
>>452 psのオプションのカオスっぷりに比べればまだ分かり易い方だと思う
まあ色々だね headとかの+スイッチとか、commの-123とか、
head/tail の +スイッチは、ポジックス()によって潰されました
>>459 headの + ってどんなのなのなの?
head +3 ファイルの末尾3行を除いて表示
head -n -3 で桶
464 :
名無しさん@お腹いっぱい。 :2013/04/17(水) 21:57:46.87
ddは許してやれ。ccに名前取られてスネてる。
+ じゃなくて - の話だが、 tail -5 とかが突然使えなくなって tail -n 5 に書き換えろという話だったが 既存スクリプトへの影響が大き過ぎて 結局 tail -5 とかの形式だけは使えるようにされたんだよな。
cc if=hoge.c of=hoge optimize=2 strip=true library=libXt,libX11,libm
老害のせいで、むちゃくちゃな言語
>>458 psがカオスなのはlinuxだけじゃね?
BSDとSysVはまったく違うけど、それぞれの中では一貫してる。
linuxはそのまったく違うものを両方使えるようにした上で
さらにgnu long optionsも採用するとかいうバカなことをやって混乱の極みに。
470 :
名無しさん@お腹いっぱい。 :2013/04/18(木) 22:08:44.74
某書に、使うpsのオプションで侵入者の素性が分かるというエピソードがあったな
/bin/sh、もう使いたく無くなって来た‥ ユーティリティのコマンドオプションに統一性が無いって、どうしてこうなってしまったんだろう
/bin/shが使いたくないなら/bin/tcshでも /usr/local/bin/bashでも/usr/local/bin/zshでも 好きなシェル使えばいいじゃない
>>472 いまどき、/bin/bash じゃないの?
FreeBSDですしおすし
>>471 のいう/bin/shって、/bin/shに限らずシェル一般っていう意味だろ。
ユーティリティのコマンドオプションに統一性が無いとか言ってるし。
それはどのシェルでも変わらない。
UNIX じゃないじゃん
シェル一般?に対して、/bin/sh とは言わないでしょ?
>>477 471はよくわかってないからシェル一般に対して、/bin/shと言ったりする。
>>477 もし本当の/bin/shの意味だったら、
「ユーティリティのコマンドオプションに統一性が無い」
の文章につながらない。
そこまで推し量ってやることも無いでしょ? ほんとのとこは本人しかわかんないんだし。 「ユーティリティのコマンドオプションに統一性が無い」ってのも、 別にその「シェル一般?」とも関係ないし
482 :
471 :2013/04/21(日) 22:40:23.29
ユーティリティのコマンドオプションに統一性が無い、どうしてかな というのが今の疑問です /bin/shならびにUNIXシェル一般に興味無くしたってのは早とちりでしたご免ください いつもお世話になってます
オプションを統一するなんて無茶な話だし、使っていればおぼえれるし、ヘルプも参照しやすいからあまり気にしたことなかったなぁ。 バージョン表示とオンラインヘルプだけは、統一あっても良い気がするな。 たまーに違うのが混ざっているからなやましい
オンラインヘルプが統一されてないってのは、man と info が混在してることを指して言ってるの?
オプションって、なんで棒1本と2本とバラバラなの? --help とか -h とか 省略形と思ったら、そうでもないし、どうなってんの
>>482 君が1人で全部作り直せば互換性がうまれるよ。でもショートのオプション数は限りがあるね。どのように設計するのか見物です。
>>483 man hogeで統一されている。Sh組み込みはshのmanかhelpにしかなかったりするか。
>>485 具体的にどのコマンドのどのオプションが不満で
自分が開発者ならどういう名前に変更するか挙げてみてくれ
>>485 基本的に、GNU形式の長いオプションが -- で、
旧来の短い(一文字)オプションの場合が - でしょ?
ちなみにコマンドラインから直接実行する場合は短いオプションで、
スクリプト等に記述する場合は(分かりやすくするため)長いオプションを使ったりする。
>>488 オプションの意味がアプリごとにバラバラで統一感無い
ってのが統率取れてない印象を与えると思う。
>>489 アプリの中で統一されていれば、他のアプリと異なっていても構わないと思うが。
他のアプリやインターフェイスと統一するなら、どこまで統一するのかその範囲は?
Windows/MacOSX/Unix系を全て統一?
GNUアプリを全て統一?
>>490 そんなでかい話じゃないが、紳士協定レベルというか
オプションの意味のガイドラインくらいあってもよかったよな
-vや-hの意味くらい統一しとけよという
まぁ今から統一するのは無理だから あきらめて覚えるしかないよ。
一番意味がたくさんあるオプションってどのアルファベットかな -iや-rなんかはけっこう上位に食い込むと思う
あきらめておぼえないw
統一されたところで完全じゃなきゃ結局man引くことになるじゃん んで他のプラットフォームは統一されてんのかっていう
一つ、コマンドの引数は、操作対象(主にファイル名)を表すものとす 一つ、コマンドの動作に関するオプショナルな指定は、ハイフン+アルファベット一文字とす 一つ、オプションのアルファベットは、それを表す英単語の先頭の一文字になるよう努めるものとす 複数のオプション指定はハイフンの後に同時に書いても良いことにする(例 ls -la) 追加で指定してもよいオプションではなくて、原則指定すべきサブコマンドはハイフンはなしにする(例 tar x) こういうのも暗黙のルールに加わった。 こういうルールは、決まりがあるわけではなく、コマンド作成者がなんとなくそうしている約束事だった。 コマンドがバージョンアップし、オプションが増え、文字が足りなくなったり、被ったりが目立つようになった。 さらにBSD系、System/V系に分岐し、それぞれでコマンドのオプションが追加された。 コマンドの私家版が独自に配布されたりして、もう大変な状況に… GNUコマンドが降臨し、ハイフン+一文字形式に加えてハイフン+ハイフン+文字列(等号+文字列)形式が普及、今日に至る。 -h や -v が同じじゃないのは、別々の意味で先に使っていたから仕方ない。
ここでどれだけ文句言ったってオプションが統一される訳ないんだから オプション統一して欲しい人はコマンドラインアプリの作者にメール送ったらいいんじゃないの それか自分自身か思うオプションに変更するラッパーでも書くか。
>>486 用語間違えてた?
manでなく、--helpとかで出てくるやつをオンラインヘルプ言うと思ってた。
一応、GNU系ならhelpとversionはコード規約的な指標にはなってた気がする。helloworldレベルだけど。。。
500 :
名無しさん@お腹いっぱい。 :2013/04/22(月) 22:55:36.85
GNU的なものを作るための規範として、その名もGNU helloというプログラムがあるな。
あれは規範ていうか例じゃね。
なんで開発者って、思いつきでオプション作るの? おまえのせいでみんな迷惑してるんだけど
んじゃどうやってオプション決めればいいの?
憲法で規則を作ればいい
憲法が何かわかってないだろ。
条約でないと
>>502 他のコマンドのことを考慮はしたと思うが、後から作られるコマンドのオプションと
バッティングしないことまでは考えられなかったであろう。
私は迷惑してないですけどね。
こんな些細なこと(コマンドオプション)、どうでもいいんじゃないの? 嫌だからといって、じゃぁ何に乗り換えるの? まともにPOSIXにも準拠してない閉鎖的なOSは、コマンド体系やオプションに統一が図られてるのかな? てか、それ以前に使えないでしょ?
ls コマンドのヘルプを見ようと思って-hつけたり バージョンを見ようと思って-vつけたりしたあの日
話はそれるが、 ヘルプなんてのはコマンドに内蔵するべきでないと思ってたな。 プログラム動作に必要ない、人間だけのためのただの文字列で コマンドのバイナリファイルや実行時メモリを消費するんだから。 マニュアル(man lsとか)として分離してれば プログラム動作のみ必要な時はマニュアルをアンインストールして HDDサイズを縮小することもできた。
いまやそんなにちまちま節約する必要もなくなったな。
catmanが贅沢だった時代だな。
DD-WRTで、ロム4MBに、カーネル+root+busyboxとか諸々全部詰め込む関係で、 容量節約のためにヘルプもエラーメッセージもほとんど出ない。 たまに現地でいじる必要性が出たり、即席で診断スクリプト組んで走らせたいときに、 やっぱ不便だった。不便な理由は、使えるオプションが極端に少ないのだが、 どのオプションが使えて、どれが使えないかを調べることすら出来なかったため。
愛三かマルツへ行きます。 技能試験の器具セットはどっちのやつがいいでしょうか。
517 :
516 :2013/04/23(火) 16:52:17.09
すんません。
実体と簡易ヘルプが一つのファイルになってるなんて素敵じゃないか。 リソースフォークはいらないけどな。 そもそもUNIXは独禁法絡みで汎用コンピュータが作れないAT&Tが、 ドキュメント作成システムということで開発継続出来たのが発端。 だからオンラインドキュメントであるmanpageや /usr/docの下のドキュメントが充実していた。
〜config みたいにシェルスクリプトでもヘルプ表示してたり
520 :
名無しさん@お腹いっぱい。 :2013/04/24(水) 04:02:05.02
debぱけーじはxz増えてるよ オンラインヘルプて公式とかミラーで公開してる分じゃねーのか
ローカルHDD上にあるのにオンラインマニュアルとか言うんだよな。 1台のホストマシンに複数のシリアル端末からログインしてたからそれがオンラインだったということか
変数STRには文字列が入っているとして、 $STRと${STR}と"${STR}"って展開され方違いますか? echoで出して見ると同じに思えるんですが、 コマンドのパラメータにSTRを渡したときに 書き方によって正しく動くときとダメなときがあって 使い分けがさっぱりわかりません。 そもそも代入する時点で、どういうときに明示的に ダブルクォートで括るべきなのか、サンプル見てもまちまちで よくわかりません。 誰か、ズバッと教えてくれませんか?
>>522 STR='*'
echo $STR
echo "$STR"
を試してみろ。$STR と ${STR} は同じ。
その例じゃカレントディレクトリにファイルがない場合は 同じになるんじゃなかろうか。 nullglobがshoptされてない限り。
試してみろとか偉そうなこといってるやつがウッカリミスの無能じゃんwww
>>525 その裏返しで、カレントディレクトリにファイルがある場合は違うんだから、
試してみろ、でいい。「カレントディレクトリにファイルがある場合」とか
ヒント言っちゃ駄目。本人に試させたいんだから。
>>526 馬鹿は引っ込んでろ
>>522 です。
試してみました。
実行時に変数は展開されるけど、ダブルクォートはそのまま
コマンドに渡される、ってことでしょうか?
出してくれた例だと、スクリプト実行時に
echo *
と
echo "*"
となっているってこと?
んー、スクリプト言語はよくわからん。。
echo じゃ分かりにくいかもな STR="hoge fuga" touch $STR ls -l STR="hoo bar" touch "$STR" ls -l
やってみた。 スペースやらワイルドカードやらチルダやらが入ってたら 展開のされ方によって動作が変わってくる可能性があるってことか。 明日出社したらスクリプト見直してみるわ。
以上、3時間のコンサル料として30万円、末締めで請求させていただきますね
>>530 >スペースやらワイルドカードやらチルダやらが入ってたら
チルダは展開されない。スペースとワイルドカードの類が解釈される。
533 :
名無しさん@お腹いっぱい。 :2013/04/26(金) 10:49:11.44
ファイルに追記しようとしてるんですが "/var/www/html/logs/ sample >/dev/null 2>&1 &" >>/var/log/sample と書くと「そのようなファイルやディレクトリはありません」と表示されます。 こういう場合はどう書けばファイル自体はありますし権限やオーナーも全て許可している状態です。
535 :
名無しさん@お腹いっぱい。 :2013/04/26(金) 11:11:31.71
/var/www/html/logs/ sample >/dev/null 2>&1 & という文字列を /var/log/sample に追記したいだけなんですが どこかでファイルやディレクトリとして判断されているようです。
>>535 あんた、UNIXの標準入出力とリダイレクション、全然理解してないね
537 :
名無しさん@お腹いっぱい。 :2013/04/26(金) 11:26:12.00
すいません そういったことを理解していないと質問してはいけないということですね シェルスクリプト側で出来れば便利そうだったんですが別の方法を考えてみます。 ありがとうございました。
スレ違いの典型を見た
>>535 echo "/var/www/html/logs/ sample >/dev/null 2>&1 &" >>/var/log/sample
シェルは最初のパートをコマンドとして実行しようとするので その出力したい文字列をコマンドとして探して、無いとエラーを出している。 リダイレクト先のファイルがない、と言っているのではなく、コマンドがない、といっている。 その文字列を出力するコマンドを、まず書かなくてはならない。例えば echo echo "xxxxx yyy > zzz" >> sample
541 :
名無しさん@お腹いっぱい。 :2013/04/26(金) 18:11:51.46
ディレクトリを実行しようとしておいて何か言われたらすぐ逆ギレかよ
とある理由で cat の出力を何もしないで素通しする必要があるんですが 何が最適でしょうか? 今は sed '' を使ってます。 cat hoge.txt | sed ''
>>543 sed に渡すってこと?
なんでもいいなら、
cat hoge.txt | cat
では?
''必要かな? cat hoge.txt | sed だとまずいsedってある?
>>544 あ、cat でいいんですね、思いつかなかった・・・
ありがとうございました。
>>545 ほんとだ、'' は要らないですね。
シェルスクリプトで、セキュリティ上パスに気をつけろという話がありますが、 1. コマンドを絶対パスで呼ぶ(/bin/ls とか) 2. PATHをスクリプトの冒頭で適切な値に再設定する ですよね? でこれらに関して何ですが、とりあえず両方やった方がいいですかね? あと、1. に関してはやはり test コマンドなんかも if /usr/bin/[ ... ] ; then ... fi って やることになりますよね? あと、1. で readonly LS=/bin/ls して ${LS} と呼ぶとしたら安全性は落ちますかね?
少なくともbashの[ は組込み
>>548 いったいどんな環境で使ってるの?
で、そこには悪意のあるユーザーがいて、悪意のあるプログラムに ls とか名前をつけてそこら中に散りばめられてる可能性があるの?
/bin/lsがrmに置き換えられているかもしれないからハッシュ値を確認しないとな
で、md5sum 自身も書き換えられてるとかw
>>548 ですが、
とりあえず/binや/usr/binがあるパーティションは書き込み不能。
データ用の書き込み可能なパーティションが別にあります。
基本的にはログイン不能なシステムです。がネットワークのやり取りとか
はあるので何がどうなるかは...
システムのデーモンから呼ばれるスクリプトを作ろうとしていて、
一応、パスが改ざんされる可能性を考えています。
どんなにスクリプトの書き方に注意しても人為的なミスは防げないんだし その辺真面目にやるならAppArmorとかSELinuxとかその辺使った方がいいような希ガス
>>553 >何がどうなるかは… (わからない)ようなシステムかよwww
パスが改ざんされるって、「誰」のパスが改ざんされるの?
そんなことする奴がいたらそもそもパスの改ざんだけですまんだろ?
>>548 1.と2. 両方やった方がいい。
readonly PATH='' ってやって、PATHなしに強制する (''は書かなくても同じ意味)
これで、lsとか絶対パスでしか実行できなくなる。
testについては
>>549 の指摘通り内部コマンドなので、
if [ ... ]; then って普通に書いていい。
readonly LS=/bin/ls はどっちでもいいかな。
見やすくなるかどうかくらいの意味なので。
>>556 ダウト。
甘いな。
PATH='' だと、逆にカレントディレクトリ上のファイルが実行できる。
PATH=. と同じ状態。かえって危ない。
PATH=/dev/null がお勧め。
あほばっかだな(笑) PATHだけ取り上げて安全とか危ないとかwww 素直にセキュアOSの適用を考えろよ
環境変数が改ざんされてたらエラー吐いて異常終了した方がよくね? 「パスが改ざんされてても正常終了します」とかゴミ仕様すぎる
PATHが改ざんされてる(改ざんが疑われる)ような状況じゃ何やっても無駄だわw 好きなように書けw
インフラをお客さんが握っている場合、自衛のために対策することがある いちゃもんつけられても困るし
質問です。 #! /bin/sh run=: msg="hanamogera" case $1 in --run) run= shift "$@" && exit 0 if test $? -ne 0; then run=: echo "$msg" fi ;; esac
って bash-2.02$ ./hoge.sh --run ls -e ls: illegal option -- e usage: ls [-1ACFLRTWacdfikloqrstu] [file ...] hanamogera という実行結果なんですが、 なんで、 "$@" && exit 0 でシェルスクリプトが終了しないんですか?
そりゃ ls -e が失敗したからだろ。
>>563 C言語と同じで、&& はショートカット動作する。
A && B
は、Aが偽だった場合、Bを実行しない。
exit値が、 0:成功 それ以外:失敗 を理解してないのかな? &&は左辺が成功したら、右辺実行。
>>566 0 が 真
ということに非常に戸惑いを覚える
成功の理由を教えてもらう必要はないに等しいが、 失敗には必要だから-2,-1,1,2,3,4,...を使う。
0 が 真 ということに非常に戸惑いを覚えた俺は、 想定した結果がでたら1、じゃなければ0、想定外なら0以外 とルールを作ってスクリプトを作った。 しかし他人のコマンドを混ぜると、0が真という糞プログラムばっかりで参ってる
混ぜるなよw
それじゃログインするなり周りは全部敵じゃないかw
0が真 ってBASIC時代を思い出すよな
CPUではZフラグが0のとき真(直前の演算結果が非ゼロだった)なんだよな
>>567 0 が真ということに戸惑うって、そりゃ当たり前だろ。一般的に真偽値の 0 は FALSE であって、
それはすなわち偽を示すものだから。
シェルスクリプトにおける 0 は「成功」なのです。あなたの中では「真 == 成功」なのですか?
プロセスの終了コードが、エラーなしで終了したときは 0 になるのが普通だったので シェルでは、コマンドの終了状態で判断する際に正常終了の 0 が、 論理値との対比では真に相当するのが都合がいいかな、 とボーン氏は考えたのだろう。 それ以前のシェルでも終了コードをチェックして云々はあったのかな?知らないんだけどね。
エラーがFALSE(TRUEではない)なんだから、いいんじゃないの?
算術IFなんかも整数使うけど、 真偽値とは別の概念として正、0、負を使い分けてる。 何の問題があるのでしょうか?
別にいいけど自分が混乱するだろw
別にいいけど自分が混乱するだろw 周りもだし。郷に入っては郷に従えだろ。
大事なことだったのでつい。
しょうがないにゃあ
>>575 どっちでもないよ。「真偽」と「成功失敗」は異なる概念でしょ。
無理矢理当て嵌めようとするから、話が gdgd になってきてるんだと思う。
windowsだと、関数の終了コードをbooleanにするのが普通になってしまっているので、その影響かもしれない。
次に設計する偉い人は多値にしてくれ。
>>575 数学的論理命題の話をしているのに、
逆が必ず真になるとの想定は如何なものか?
シェル初心者だけど質問ある? 何でも聞け。 知らないこと以外はたいてい知っている。
一休さん来た(棒読み
>>587 シェルスクリプトでPASSを変える方法を教えてください。
>>589 SET PASS=aaa
で環境変数PASSの変更が可能です
シェルスクリプトでアブラムシの防除方法を教えてください。大変困っています。
ネタ書き込む前にほんとにおもしろいか一度読み直してみような。
シェルスクリプトでキー入力によって動作を変えたいのですが readだとenterを押さないと入力された値を取得出来ません。 1.処理A 2.処理B 3.処理C 0.終了 実行する処理のキーを押してください> 上記のように画面上へ表示し、キーを押された時点で各処理実行したいのですが シェルスクリプトで可能でしょうか?
>>594 read: 1: Illegal option -n
>>593 key=`dd bs=1 count=1 2>/dev/null`
>>596 stty cbreak 忘れてるぞ
事後に元に戻すのも忘れずにな。
inkey$ を使えばいいニダ
シェルじゃなくperlとかpythonとかのほうが楽?
人によるんじゃない?
perl も python も インストールされていない ということもあるw
入力された拡張子を持つファイル一覧を出すスクリプトを作ろうと思ってるけどうまくいかない… ボスケテ #!/bin/sh cd trash extension=$@ ls | grep $extension cd extension経由させてんのはgrepだと正規表現とかが関係してうまくいかないんじゃないかと思ったから 助けてくれ…さっぱりわからないし調べても出てこない
>>602 何がうまく行ってないのか説明してくれないと分からん。
これを例えばtxtもつ奴だけ並べようとして実行すると(ファイル名challe5) ./challe5.sh* txt grep: txt をオープンできません。 と出てそこで終了してしまう どうすればいいんだ
>>604 ./challe5.sh* txt
の * は何のため?
ひょっとして、次のように * の前後に空白が這いよってない。
./challe5.sh * txt
>>605 できた!
./challe5.sh txt で正しく動いた
ありがとう
607 :
名無しさん@お腹いっぱい。 :2013/05/19(日) 09:22:36.36
もしかして、 ls が ls -F に alias されていて、 実行可能ファイル名に末尾に * がついてたのを 勘違いしたんだろうか。
解決まで読んでも何がしたいのか、さっぱりわからんw ls ./trash/*.txt で済んでしまいそうな。 あと多分cd -の方がいい。
スクリプトに引数渡す練習かな。 最後に cd する理由はよくわからん。cd - に変える必要もないっしょ。
610 :
名無しさん@お腹いっぱい。 :2013/05/20(月) 14:29:43.96
元のデレクトリに戻したいだけだろ そもそもcd trashが不要だろというのはおいといて
元のディレクトリに戻ったところで スクリプトの実行終わったら関係ないよね。
612 :
名無しさん@お腹いっぱい。 :2013/05/20(月) 15:00:49.43
わからねえならいいや 俺には関係ねえし
>>612 オレもマジで分からんが。
スクリプト内の最終行で、元のディレクトリに戻らなければならない事例を挙げてくれよ
気分がいいんじゃないか?
615 :
名無しさん@お腹いっぱい。 :2013/05/20(月) 17:03:05.27
何かやってて何か調べてwdに戻りたいつーだけだろ わからねえならいいつってんのも読めないのかよ知障
>>615 君がよくても、我々がよくない。
開き直って逆ギレしないで、
我々の知的好奇心を満たすために協力したまえ
>>613 次に実行するスクリプトのためだろ
そういうコード書くな、で済むならいいけど
現実そういうわけにもいかないし
それなら毎度立つ鳥跡を濁さない方がいい
>>617 最後に元のディレクトリに戻っても戻らなくても
次に実行するスクリプトには関係なくね?
source や . で呼ばれるときに備えて元のディレクトリに戻っておくのはあるかもね。
>>602 がそこまで考えてるかどうか分からんけど。
そんな呼び方するかねぇ。
無引数cdした方がいいかどうかわからんだろ。 sourceされた時のことを考えて、(cd ...; xxx)ならまだわかるが。
623 :
602 :2013/05/20(月) 21:51:17.99
最後のcdは元の場所に戻っておきたいなーと思って入れといた
ls ./trash/*txt は単に思いつかなかったw
>>607 はたぶん大当たり
ガッコの課題でそういうシェルプログラム組めって言われたからつい大仰なのを作ってしまった
物議を醸してすまなかったぜ
ちなみにcdだけでホームディレクトリ(でいいのか?)に戻るようになってる (普通もそうなってるかはわからんので補足)
学校の課題なのは薄々気付いてたけど そんなに大仰でもないような。
俺にとっては大仰なんだよ!
>>623 > 最後のcdは元の場所に戻っておきたい
それなら、
>>608 の指摘通り「cd -」とすべきだな。
cdだと、元の場所ではなくて$HOMEに移動してしまう。
元の場所が$HOMEなら、同じだけど。
>>618 おぉ、sourceや . で呼び出すときの挙動をよく考えたことがなかったので、
ちょっと実験してみよう。
はっきりいって特に戻っておきたい、と思った明確な理由はない ただなんとなくつけただけだ その上で、強いて理由を挙げるのであれば、ホームディレクトリでこのプログラムを起動した後 一回trashに言ったままになっちゃうのが面倒と思ったから 察して試してみたが別にcd無くても勝手に元に戻るみたいね…
もちろんもとの場所も$HOMEです(おそらく)
>>629 > 察して試してみたが別にcd無くても勝手に元に戻るみたいね…
「戻る」っていうか、
そのプロセスのカレントディレクトリは変わってないんだよ。
スクリプトとして呼ばれた子プロセスのカレントディレクトリが変わってるだけで。
>>629 仮に「戻る」としても、
ホームディレクトリ以外にいるときに実行することは考えないのか?
>>632 なるほど
>>633 それは確かに考えるべきだったな
書いたときは全然考えなかったわ(授業でやってる事は今のところ全部ホームディレクトリでやってるから)
まあ、初心者故に考えなかった、ってことだな
ここは、書いたシェルスクリプトの投稿とかありか? 評価してほしいんだが
やっぱいいや
ありだよ。
#!/bin/sh while true do echo 'SEX shitai' done
echo oremo shitai
シェルの手動起動の課題をやってます。 メモ帳でテキストファイルにEcho Helloとだけ書いて サンバでH:ドライブに test.sh という名前を付けて保存、 TeraTermでtest命令を発行してもうまくシェルが動きません。 何かヒントください。
その質問の仕方では答えられません 何かヒントを下さい
>>642 w
>>641 sambaとかTeraTermとかいうからWindows環境だと思うが、
Windows以外の世界は、case sensitiveだということを覚えておこう
実行後にカレントディレクトリが変更されるスクリプト ってどうやって書けばいいの?
>>645 シェルの問題じゃなくて、UNIXというOSの設計の問題。perlでもCでもできない。
sh hoge.sh ではなく、. hoge.sh のように実行するとか、
cd hoge と出力するhoge.plを eval `perl hoge.pl` として実行するとかなら可能だが。
DOSはそうはなってないので、バッチファイル実行後にカレントディレクトリを変えられる。
>>641 643に加えて
(1)そのファイルに実行権(プログラムやシェルスクリプトであることを示すフラグ)が必要
Windowsは拡張子によって、実行ファイルかが判断されるがUnix系はフラグによる。
chmod コマンドを参照
(2)Unix系は拡張子による区別がないので、コマンドとして実行する際に .sh 部分も必要
(3)Windowsのコマンドプロンプトはカレントディレクトリもコマンドの検索パスに含まれるが
Unix系ではカレントディレクトリが含まれていないことが多いため、カレントディレクトリに
あるコマンドは ./test.sh のようにディレクトリから指定する必要がある場合が多い。
>>641 はコピペ改変のネタでしょ。
まともに回答してもムダ。
>>647 > (2)Unix系は拡張子による区別がないので
そんなことはない。
拡張子が大きな意味を持つ文脈もある。
>>649 そうでしたね。
Windowsではコマンドとして実行する際に、ファイル名の .com .exe .bat(他にもあったかな)部分は
入力する必要がないがUnix系では、それもコマンド名の一部として入力する必要がある。
>>651 ん?
そういうシェルがある、ってこと?
最近のOSは setcwd() が存在したりする
関係ない
int setcwd(pid_t pid, char *path);
そういうネタはいらん。
fork2(FORK_SHARECWD);
>>657 どうせなら念願のファイルポインタ独立もよろしく
fork2(SHARECWD|FORK_UNSHAREFD);
>>644 #!/bin/sh
cd ./tmp
/bin/sh ; exit
>>659 それはスクリプト「実行後」じゃなくて「実行中」の別シェルだねw
ハイやり直し
↓
>>660 俺にとっても正解ではないが、
質問者にとってはこれで充分かもしれず。
不十分だろう。
. ドットコマンドについて、誰か
ドットコマンドの話じゃないよ。普通の実行スクリプトで親シェルをcdする方法の話。
もし、親プロセスのカレントディレクトリを変更できる仕組みがあったら 子プロセスを起動するプログラムはガクブルだな。
>>665 だから、fork2(FORK_SHARECWD) で作成されたプロセスのみ可能なので安心して。
自分がスクリプトを書く環境で grep に -x オプションがないことが判明したのですが、 grep -x -F -f patlist に相当する処理をしたい場合はどうしたらいいですかね? とりあえず -F をやめて patlist の各行を ^ と $ で囲む前処理をする? と思ったら、patlist に含まれうる "." 等をメタ文字として解釈されてはまずいのでした。 grep を入れ直す、perl 等別のスクリプト言語を使う (sed/awk は OK。「言語」かどうかは ともかく)、キレる等以外でお願いできますでしょうか。
>>668 > 自分がスクリプトを書く環境
もしかして Solaris とかだったりする?
効率を考えないのであれば $ comm -12 <(sort patlist) <(sort hoge.txt) で行けそうな気がする
Solarisは grep -x あるぞ。というか、SunOS4の時代からある。 -xないってどこのOSだ?
エスパーすると busyboxの grepとか
bosyboxの shは、
>>670 の named pipeは使えないな
674 :
668 :2013/05/25(土) 20:56:40.98 !
>>669 SUSで-xは規定されてるみたいですし...
>>670 comm もないのです
>>672 正解w
前処理として sed で patlist 内のメタ文字をエスケープすることもちょっと思ったのですが。
s/\([エスケープしたメタ文字リスト]\)/\\\1/g みたいな。ところでメタ文字のリストって?
675 :
668 :2013/05/25(土) 22:01:26.16 !
>>674 おっとっと、文字クラスの中ではエスケープは不要か。
実験してみると [ と ] を指定したいときに [[]]と書くと動かないけど[][]と書くと動くような。
ふむー
>>674 -xが使えなくても -wで十分だったりするケースが多いんだけど。
あと、ウチのbusyboxではcommは使えるぞ。<(コマンド)の文法は使えないけど。
677 :
668 :2013/05/26(日) 09:26:18.70 !
>>676 それは元のデータが一行に一個しか単語を含まないとかそういう感じですか?
自分の場合そうではないので...
% echo foo bar | grep -x foo
% echo foo bar | grep -w foo
foo bar
メタ文字をエスケープしたパターンを^$でくくればいい。
>>678 だから、メタ文字をエスケープすることが難しいって話だろ。
sedやawkでやればいい
681 :
668 :2013/05/27(月) 18:41:29.35 !
個々のメタ文字をエスケープしようかな、というのは前の方にに書いたんですが。 ただ正規表現もいろいろあったりするし、その方法はなんか嫌な感じがw busybox の grep が -x をサポートしない時点で正規表現の方にも一抹の不安がw まあ仕方ない、grep が扱いそうな正規表現ということで、 sed 's/[][^.$*\]/\\&/g' でいいですかねえ。 でそこに s/^.*$/^&$/ を付けて処理すれば文全体にマッチするパターンになると。
awk 'BEGIN{while(getline<"patlist")a[$0]=1}{if($0 in a)print}'
結局、環境はbusyboxなの?
685 :
668 :2013/05/28(火) 01:03:20.06 !
>>682 おおー素晴らしい。そっか連想配列がありましたよね...
元の grep -v の話に合わせるなら !($0 in a) とすると。
圧縮されたファイルをハードディスクに展開せずに 読み込ませるシェルスクリプトを書けないでしょうか 今までmkfifoでパイプを利用して mkfifo input xz -dc input.xz > input & fortran.out < input として必要なinput.xzの個数分コマンドラインで実行をしていました inputファイルが増えてきたのでシェルスクリプトを使おうとしたのですが バックグラウンドでパイプへ展開しながら 実行ファイルに読み込ませる方法が分かりません
>>686 結局 fortran.out も stdinから読んでるんだから、
xz -dc input.xz | fortran.out &
でいいんじゃないの? mkfifoする必要なし。
for で回すなら、
for file in .....
do
xz -dc "$file".xz | fortran.out &
done
それで行けるならこんな質問しないだろうな。 たぶん質問のしかたが悪い。
mkfifo使うにしても、質問で input の文字列のところを $hoge 変数にして ループ回すだけだし、それで行けるならこんな質問しないのか?
お前らよくこんな質問にレスを付けようと思うな。 文体は丁寧だが、目的語などを省略して、相手に理解させる配慮が一切ない、 自分しか理解できない文章で質問する奴はスルーでいいだろ。
いいじゃん答えても。 スルーでいいと思う人はスルーしてればいいじゃない。
>>686 普通に「&」でバックグランドジョブにしてもダメなのかな。
694 :
686 :2013/06/20(木) 12:49:13.79
>>690 アレ、お前以外は質問を理解出来てるんじゃね?あっ(察し
>>686 の質問は「バックグラウンドでパイプへ展開しながら
実行ファイルに読み込ませる方法が分かりません」だろ?
シェルスクリプトでもバックグランド「&」は使えるから、
お前が書いている内容をスクリプトにコピペして実行してみろ。
>>697 それだと、inputというファイル名(FIFO)が衝突して正常動作しない。
>>686 が言うバックグラウンドでの実行というのは、
同じスクリプトを複数同時に(バックグラウンド)で起動するという意味を含んでいる
と解釈できる。
まあ、その件は
>>689 が回答済みだけどね。
699 :
名無しさん@お腹いっぱい。 :2013/06/20(木) 17:27:55.78
これhurdの機能でできるんじゃね
つか質問しといて、「考え直します」とか言って引っ込むのはどうよ?って思うな。
同じPCでも、使うシェルによってPCの耐久寿命が変わるそうですね。 BASHは、電解コンデンサがライトアップしやすいって聞きましたけど、 ユーザーの多いシェルなのに何故ですか?
質問です。 シェルが・・・ 考えなおします。
>>701 dry upじゃないの? ケミコンをライトアップしてどうすんだよw スカイツリーかよww
というかbashが動作してるときだけコンデンサが劣化するとか どんなテクノロジーなの?
対話画面に降りると、CPUのidleを発行しなくなる環境が多かったから、 あながち間違いでもない。
コピペ改変に釣られんなよ。
bashは利用者がキーボードに触れるかどうか、気を感じているから。
bashはあなたを監視している 過去のコマンド実行履歴もこっそり覚えてる
おはようからおやすみまで くらしをみつめる bash
>>709 $ echo $HISTFILESIZE
0
何か?
$ cat /etc/profile readonly HISTFILESIZE=1000000
Bourne-Again Shell is watching you.
ご教授頂きたいのですが、 #!/bin/sh awk '/Summit48si/ { print "snmpget -v 2c -c hbl-snmp "$1" SNMPv2-SMI::enterprises.1916.1.1.1.16.0 " ; print "echo "$1"" }' list | sh を実行すると、 SNMPv2-SMI::enterprises.1916.1.1.1.16.0 = STRING: "シリアル番号" IPアドレス という風に出力されます。 これを、 IPアドレス シリアル番号 という風に出力させたいのですが、どのように記述すれば良いのでしょうか? どなたか、お知恵を貸して頂けないでしょうか。
ご教授ってネタなの?
>>715 別にネタじゃ無いだろ
懇切丁寧に教えろって意味だ
素で間違えてる人多いよ。
素で間違えました。女教授ください。
>>714 list はファイルでIPアドレスと型番的な情報(ex. Summit48si)が一行に一つ入ってるのでしょうか?
IPアドレスが後から出ているのが気に入らないなら
print "echo "$1"" を print "snmpget -v ..."の前に持ってくる。
でもってIPアドレスの後で改行が入るのがいやなら echo -n
SNMPv2-SMI::enterprises.1916.1.1.1.16.0 = STRING: が出力されるのがいやなら
これはsnmpgetが出力しているものでしょうか?それならsnmpgetで出力しないようにできるかどうか調べて
出力を抑制できないなら sed とかで削除すればいいんじゃないでしょうか。
教授はできないので教示させていただきました。
>>715 ・学問や技芸、専門知識を教え授けること
・児童・学生に知識・技能を授け、心意作用の発達を助けること
わざわざ書かんでも知ってるでしょ。
>>717 間違いじゃないw
他には「ご教授賜りたい」という用法もある。
>>721 素で間違えてると思い込んでる人多いよ。
この話おわり。
女教師ください。
>>722 「ご教示賜りたい」は聞いたことがあるが、
「ご教授賜りたい」なんて聞いたことがないw
ご教授も間違ってないけど、 見ず知らずの人に使うには図々しい感じがするわ。 とはいえ、時間が経てば、違いなんか無くなるだろうし 突っ込んだら負けだと思ってる。
もうその話おわったよ。
女享受ください。
間違い方としては、役不足ににてるのだけどな。
>>714 awkって、-F'[ :]'とか区切り文字に正規表現つかなかった?
この誤用は昔からあるね。 文末の定型だと勘違いしてる人が多い感じ で「ご教授ください」「あなたのような弟子を取った覚えはありません」が繰り返されるという
見飽きた話だ。
「女教授股触りたい」
>>728 図々しいやつだ、という批判なら尤もだし正しい指摘だよ
教員をしてるわけではないけど専門知識のある知人に ものを尋ねる時、「これ教えてくださいよ、先生!」みたいに比喩で 言うことは普通にある。それと一緒。問題なし。
↓738先生、持ち時間を使い切りましたので1手30秒以内でお願いします。
739 :
名無しさん@お腹いっぱい。 :2013/06/25(火) 21:14:54.32
738には失望した
詳しいHP教えてください ↓ ヒューレットパッカードがどうしたのですか?
プラスチック容器なのに「レンジOK」って書いてあるよ
743 :
714 :2013/06/26(水) 08:50:35.25
>>719 ありがとうございました。
大変助かりました。
並列処理みたいなことをしたいです *マークをつけた次の行です ただこのままだと、配列に結果が代入されません 当然バックグウランドにしないと処理速度が落ちます バックグラウンドにして、かつ結果を得る方法はありますか? func_test () { # 実際はこの関数の処理に時間がかかる、結果をメイン処理に渡したい echo "${1}" } array=() for i in `seq 1 5` do # この関数の処理を並列化したい * array[${i}]=`func_test ${i}` & done wait for i in ${array[@]} do echo ${i} done
ファイルに結果を出力しておいて後で読み込むのが無難じゃないかな 直前に生成した子プロセスのPIDは$!でとれたはず。 配列にPID保管→PIDに対応するファイルから結果取得みたいな
あとfunc_testはシェルスクリプトとして独立させてバックグラウンド実行
すみませんが詳しい方のみ回答をお願いします
750 :
745 :2013/07/12(金) 07:58:40.86
みなさんありがとうございます。
>>746 例ではループを「seq 1 5」としていますが、実際は数千あります。
(数千をいっきにバックグラウンドで走らせる訳ではなく分割する予定です)
数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?
関数の出力は1行なので、数千でも容量はとらないのでメモリ上に一時ファイルを作る方法があれば助かりますが。
>>747 初心者なもので、関数と別のシェルスクリプトとして独立させることの違いが
あまりわからないので、もう少し詳しく教えていただけますか?
>>750 >>747 は知ったかの誤回答。
関数を別のシェルスクリプトにしてもバックグラウンドの出力は
そのまま取り込めないから解決にならない。
Cかpopen系が使える他のスクリプト言語で書いた方がいいんじゃないか?
>>745 func_test() の出力行数が決まってるなら
その行の頭にでもindexの識別子を付けて
全部標準出力に出して、数字でソートすればいいよ
func_test ()
{
echo "${1} : ${1}の出力"
}
for i in `seq 1 5`
do
func_test ${i} &
done | sort -n
>>750 > 数千のファイルを作って消すことはhddの寿命に対して大丈夫なものですか?
HDDの寿命的には問題にならない。
SSDでも最近のはウェアレベリングしてるはずなので、
1行程度のファイルを数千個作ったところで影響なし。
どうしても気になるなら、直列に動かす複数のプロセスで1個のファイルを共有したら?
>>751 名前付きパイプを作って、それに通すのは?
シェルスクリプトの方で出力先も切り替えればいいだけの話。 #! /bin/sh echo "${1} : ${1}の出力" > "${DIR}/file${1}.out" そしてwaitで全てのシェルスクリプトが終了するまで待つ。
処理中に何か不具合が出て、プロセスがいつまでも終わらなかったらどうすんの?
それはどうやっても同じでは?
>>756 >>755 それはシェル関数を使ってできる。
わざわざ「別シェルスクリプト」に分ける意味がない。
759みたいのが会社にいると、可読性が悪くなって迷惑。
一時ファイルとか、名前付きパイプ使えばできるのは当然なので、 一時ファイルも名前付きパイプも使わずにエレガントにやる方法誰か答えてよ。 (もちろんスクリプトは1つだけでw)
func_test () { sleep 1 echo "array[${1}]=${1}" } array=() eval ` for i in \`seq 1 5\` do func_test ${i} & done wait ` for i in ${array[@]} do echo ${i} done
>>761 なんか実行結果をファイルっぽく扱う技があったやろ
アレ使え
>>763 すごい!
代入文自体を文字列として返して
実際の代入はフォアグラウンドのシェル側にevalさせるのね。
eval使うとquoteしないといけない時にややこしくなるねえ。
その手の、全部stdoutに出しちゃえ方式って、行の出力途中で分断される恐れとかないんか?
なんで?1回分のechoはwrite(2)一発で出力されるって決まってるの?
>>769 ちょっと違うな
恐れはあるが、恐れる理由が無い
分断されてもなにも困らないから
>>748 のおかげで "詳しい方" が出てきてくれて良かったよ。
なんかすごい新しいノウハウ。
>>749 がつまらんトボケたこと書き込んでるけどw
これからも "詳しい方"のみ回答をお願いしますね
自身では何もできないのに要求レベルを高くする屑ですね
774 :
745 :2013/07/12(金) 19:02:51.48
皆さんありがとうございます。 私が元々の質問者ですが、違う方が催促もしてくれているようでw 別の言語も考えたのですが別の言語を使う能力がないのと 引き継いだものをできるだけ生かしたいと思いました。 (シェルもそもそも出来ません・・・) たくさんのアドバイスをいただきましたが ぱっと見では分からないので動かしてみてから、また書きます。
能力がないんじゃなく能力を身につけようとしてないんだろ。 試しに勉強してみなよ。シェルで無理するより楽かもよ。
776 :
745 :2013/07/12(金) 19:57:58.28
>>753 >>763 お二人のアドバイス、両方ともやりたい事が出来ました。
どうもありがとうございました。
>>775 以前cとjavaは少し勉強した事があるのですが
ポインタでつまずき、オブジェクト指向でつまずきました。
プログラミングが専門ではないので許して下さい・・・
777 :
745 :2013/07/12(金) 20:06:21.41
>>764 今回は解決しましたが、そのやり方気になります。
もう少し詳しくお願いします。
778 :
745 :2013/07/12(金) 20:18:52.98
>>757 リトライとかタイムアウトでメッセージを出す仕組みってありますか?
1:****
2:****
・・・
のようなかたちの出力にして結果が得られたかを検証して
抜けているのがあれば手動でそれだけやりなおします。
止まった場合は、ctrl+cですw
>>776 PerlとかRubyでいいじゃん。
ポインタ知らんでもそれなりに使えるよ。
ルータのファームいじりだと、PerlもRubyも使えないので、 このスレのやりとりは、横で見てるだけでもけっこう参考になる
シェルスクリプトは使えるルータ?
>>779 perlとrubyもhello worldと少しは勉強しました。。
どうもその先が理解出来ず挫折するようです。
逆になんで理解できるんですか!?
linuxにはいろいろツールがそろっているし、ファイルも楽ちん
manとかネットが充実してるからついついシェルでやっています。
ネックは速度くらいですかね。
javaとかでさくっと書けたらかっこいいだろうなと思いつつ。。
ぶっちゃけシェルスクリプト使いの方が希少
できない言い訳を書いてる暇があったら勉強しろよタコ
自分は大規模なことはやってないからですかね。 他の言語を覚えるのに身が入らないのは。 シェルも皆さんほどには理解出来ていないですけど。 学生のころfortran(当時はこれしか知らなかった)で文字処理しようとしてあきらめ シェル(grep、sed)でやって便利さに気づきました。
もう雑談スレだな。
夜食でも食うかな
>>781 野良電波が出ていないか定期的にチェックして、野良が出現したら
暗号化なしで繋ぎに行き、即VPNセッション張って暗号化させて、
完了したらルータのあんま使わないLEDを点灯させるスクリプトを走らせてる。
わけわかめ
触らない方がよさげ。
Ubuntu Linuxなのですが、Linux板にシェルスクリプトスレがないのでお邪魔しました。 Linuxを始めたばかりで、無謀にもソースからのアプリコンパイルにチャレンジしており シェルスクリプトのエラーに悩まされています。 /opt/bitnami/common/build-1/libtool: 3215: /opt/bitnami/common/build-1/libtool: install_prog+=install: not found /opt/bitnami/common/build-1/libtool: 3235: /opt/bitnami/common/build-1/libtool: files+=mod_dav_svn.la: not found この「install_prog+=」「files+=」という箇所をエディタで探して「+=」を「=」に書き換えると エラーなく通るようになります。 後続で別のエラーが出て結局止まるのですが、それはまた別の話としまして このnof foundという表示はどういう意味で、どう対処すべきなのでしょうか。
+=はlist appendです。 shの実体がdashとかashになっていて+=理解しないんじゃない? bashで実行してみれば?
>>792 /binディレクトリを見てみたら、sh -> dash*
とリンクが張られていました。Ubuntuはdashが標準なんですね。
スクリプト先頭の /bin/sh を、/bin/bash に変更したら通りました。
一週間苦しんだのであっけなく解決して魂が抜けましたが、これも勉強ですね。
>>793 まぁ、そうなんだけど、bashのつもりでshとスクリプトに書く方が悪いと思う。
そのアプリのメンテナにバグレポートを送ってもよいと思う。
何でこのスレって排除傾向なの
しかも誘導先がくだ質って、悪質そのもの
なんでそうなんのw
>>796 一部のバカのレスをスレ全体の傾向に敷衍するのは、荒らすのが目的ですか?
すでに荒れきってるんですが・・・
たいした理由もなくアホだのバカだの悪質だの言う方が荒らしだよなぁ。
もうそのくらいにしとけ。 雰囲気悪くするだけだ。
dashとbash比較した時 クライアンス運用ならdashのが劣っている点はなんですか?
クライアンス?
"クライアンス運用" でぐぐってみ。
勿論ググりましたが、当方馬鹿なのでわかりません サルでも分かるような回答を強く期待します
809 :
名無しさん@お腹いっぱい。 :2013/07/30(火) 10:32:43.97
普通か、って聞かれても答えにくいな。
811 :
名無しさん@お腹いっぱい。 :2013/07/30(火) 12:22:42.64
warning 出してほしいとかいう話がちょっと前にあったみたいだけど これは warning 出せるかも。 いや、bash ではどうすんだ?
LinuxとBSDで開業コード違いますよね。 Linuxは0xnで改行、BSDは0xrで改行しますよね。 どうしてこういう違いができたんでしょう? シェルで簡単に返還する方法はありますか?
だったらこの改行コード変換して読めるようにしてくれよ! N・K・F! N・K・F!
>>812 > LinuxとBSDで開業コード違いますよね。
違いません
だから変換する方法も必要ないです
MAC以外のBSDってもう死滅したでしょ?
してないよ。
>>815 FreeBSD 最新安定版リリース 9.1 / 2012年12月31日
NetBSD 最新安定版リリース 6.1 / 2013年5月18日
OpenBSD 最新安定版リリース 5.2 / 2012年11月1日
>>815 NECの家庭用ルータは全部BSD系。
シリアルケーブル繋ぐとメッセージも出る。
Sat Jan 1 00:00:05 JST 2011
NetBSD/messimips (Amnesiac) (console)
login:
IPL:HARD-RESET
memory test ... ok
flinstall OK
boot version: 1.0.0
PKG "Sky-ST"
CPU "Atheros/AR9341"
Revision 12.1 CLOCK 535.0 MHz
HEAP MEMORY 262144 bytes
Boot:InitFilesystem
phy1.0: "Atheros/AR934x(SW)"
phy1.4: "Atheros/AR934x(phy)"
active ch:1
post start
DRAM Test ..... PASS
Timer test .... PASS
FLASH CHKSUM .. PASS
LAN Test .....
LoopBack count 0 ..
ほそぼそと生きてるんだね 温かい目で見守りたくなる
ほそぼそでもないよ。
お前らが書き込んでるここもFreeBSDだろ
それはサーバーじゃんw サーバーじゃ意味ないんだよ。ルーターもだけどな。
「意味ない」の意味がわからないけど それならWinとMac以外みんな死滅してるでいいんじゃね お前の中ではな
この話おわり。
結論 : NECのルータが最強
Mac OS Xも改行はLFのみです。 $ cat -e -v /etc/rc.common | head -3 ##$ # Common setup for startup scripts.$ ##$
_人人人人人人_ > 智花のbash <  ̄Y^Y^Y^Y^Y^Y^ ̄
袋小路に入ったみたいなので助けて下さい。 ---- tmp.sh ----- #!/bin/bash mediainfo --Inform="Video;%Width%" tmp.wmv ---- ここまで --- は期待と通りに動作するのですが、 ---- tmp1.sh ------- #!/bin/bash _C="mediainfo --Inform='Video;%Width%'" ${_C} tmp.wmv ---- ここまで ---- だとInformオプションが無視されます。 シングル・ダブルクオートの入れ替え、;や%をエスケープなど試行錯誤したのですが、 変数に格納してからmediainfoを使うと、Informオプションは無視されます。
すみませんが詳しい方のみ回答をお願いします
>>831 勝手に成りすまさないで。
>>830 コマンド+オプションを変数に格納して、
変数をダブルクオートで囲むと、
command not found
になるよ。
------ tmp2.sh ------
#!/bin/bash
_C="ls -l"
"${_C}" hoge.txt
------ ここまで ----
$ bash tmp2.sh
tmp2.sh: 行 4: ls -l: コマンドが見つかりません
>>829 eval "${_C}" tmp.wmv
>>833 解決しました。ありがとうございました。
evalは今まで避けてきましたが、これを機会に勉強します。
シングルクォートを取るだけじゃいかんの?
ashとbash比較した時 クライアング運用ならashのが劣っている点はなんですか?
補間、ヒストリできないだろ。それに耐えられるならどうぞ。
そいつ荒らしだから相手しちゃいかんよ。
少なくともFreeBSDで魔改造されてる/bin/shは補完、ヒストリー呼び出し(!では呼び出せないが)は出来る。
じゃあashをもっと使うべきだよね
ログインシェルとして普通に使ってるよ。
わかりました。ashでクライアング運用することにします。
Postfix にメールが届いた時pipeを使ってrbenvでインストールしたrubyにプログラムを処理させたいのですが ruby command not foundになってしまいます。 ログインシェルじゃないから.bashrcが読み込まれていないのが原因だと思いますがsourceで読み込んでみたり、bash -l -cなども試しましたがやはり読み込んでくれません どこで質問したらいいかもわからず、もしすれ違いなら誘導して頂けると嬉しいです
env で環境変数を適切に設定してやればいいだけじゃないの? まあ、個人設定に依存するものをシステムワイドな環境で実行できるようにするのは セキュリティホールなので、できたとしてもやらない方がいいと思うけど。 # ruby を実行させるコマンドだったはずなのに後でユーザが破壊的な処理をする # スクリプトに置き替えたら、システムの権限で動いてしまう。 # postfix なら root では実行されないのでまだマシだけど。
postfixにはsmrshみたいな仕組みあるのかな。 sendmailでやってたのずいぶん昔の話だから覚えてないや。
850 :
843 :2013/08/20(火) 02:23:27.34
聞いといて申し訳ないのですが仕様が変更になりPostfixは使わなくなりました。緊急性がなくなり気が抜けてしまいましたが頂いた参考URLは見させてもらいます。アドバイスいただき本当にありがとうございました
ディレクトリの中に複数のテキストファイルが入っていて、 各々のファイル名を取得してそのファイル自身にファイル名を書き込むというか追加していく というシェルスクリプト教えて下さい!
>>851 学校の宿題っぽいな。
テキストファイルの拡張子がtxtだったとすると、
ワンライナーで、
$ for t in *.txt; do echo $t >> $t; done
でいけると思うが、宿題でなければこれで解決だろ。
>>852 さんありがとうございます!
宿題ではないですが超初心者です。
テキストファイルなんですが拡張子が付いてないので
試しに.txt拡張子追加してから
$ for t in *.txt; do echo $t >> $t; done
をtest.shという名前で保存して
テキストファイルがあるフォルダに放り込んでchmod +xしてから
実行しました。エラーもなく終わるんですが、どこにもファイル名が追加
されてないようです。
>>854 さん、ちゃんと最下段にファイル名追加されました、感動です!
ありがとうございます!
>>855 ということは、もしかしてtest.shを実行するつもりで
$ test
ってやりました?
そんなわけないだろう。 なぁ?
最初は改行コードがLFになってなくて動かなくて
それに気づいて改行コード直したら、今度は
>>852 さんの
$ for t in *.txt; do echo $t >> $t; done
をそのまんまコピペして行頭の$を取るの忘れてsyntax error出ました。
それでやっと$取り忘れたの気がついて動きました、お手数かけてすみませんでした。
859 :
名無しさん@お腹いっぱい。 :2013/09/04(水) 02:17:02.05
CentOSの再起動のたびに複数あるSCSIデバイス名(/dev/sd*)が変更される。 でもブロックデバイスでしか動作しないソフトがある・・・てことで、 /dev/disk/by-idやmultipath -lのようなコマンドでメジャー/マイナー番号を引き、 mknodで固定的なデバイスを作成する ・・・みたいなことをシェルで実装したいのですが可能なものですか?
手作業で出来ているなら、シェルスクリプトでも出来るはず
>>859 変な小細工せずに、/etc/udev/rules.d/??-persistent.rules で設定して
SCSIデバイス固定にするのが筋だろ。
udevadm info -a -n /dev/sda で出てくる条件で固有のものをさがして ATTRS{model}=="FD-05PUQ",MODE="0666",SYMLINK+="fd0" って感じでrulesに書くんだけどね。 一行のうち"=="が条件文で"="や"+="が実行文
下記のようなフォルダ構成(src,src2など複数のフォルダがある、src直下にファイルがある、複数階層のフォルダがある)になっていて src以下と同じフォルダ構成をlinkフォルダ以下に作成し src以下にある全ファイルのシンボリックリンクをlink以下の同じフォルダの場所に作成したいです。 そこに、src2以下も同様にシンボリックリンクを作成し、linkフォルダ以下ではsrcとsrc2がマージされた状態としたいです。 また、シンボリックリンクのリンク先は絶対パスではなく相対パスで設定しておきたいです(myrootフォルダごと移動しても動くようにするため) srcとsrc2には、同じファイル名のファイルが入っていることはありません。 どんなスクリプトでできるでしょうか? 現在: myroot/ link/ src/ a.txt f1/ b.txt f2/ f3/ c.txt src2/ f2/ d.txt
864 :
863 :2013/09/08(日) 18:33:28.24
期待値は以下のような構成になることです 期待: myroot/ link/ a.txt f1/ b.txt f2/ d.txt f3/ c.txt src/ 以下略 自分でやろうとしてみたところ フォルダを決め打ちにしてやったとしても シンボリックシンクを相対パスで設定することがうまく思いつきませんでした
>>863 そのために lndirってコマンドがあるんだけど。それじゃダメ?
あ、imakeとかxmkmfとかの系統のコマンドだから、年代物なんだけどね。
>>865 返信ありがとう。lndir知りませんでした。
ですがlndirだとsrcは絶対パスを渡す必要があるようでした。
myrootを移動できるように、相対パスでできるとうれしいです
>>866 何言ってんだよw
lndir に相対パス渡せるよ。普通相対パスで使うし。
868 :
863 :2013/09/08(日) 20:20:29.08
>>865 ,867
ありがとうございます!
相対パスで指定できました
カレントではなくlink からみた相対パスを指定するんですね
すみませんmanもちゃんと見ずに決めつけてしまってました
myroot $ lndir ../src link && lndir ../src2 link
おまいら、ちょっくら教えてください。 ↓のような感じのCSV形式の通信ログがあります。 [日時],[送信元IP],[送信元Port],[宛先IP],[宛先Port],[TCPorUDP],[bytes],[通信時間(s)] このログから送信元IPが"192.168.0.1"の行だけを抜き出したいのですが、 単純にgrep "192.168.0.1"とかすると、宛先IPが"192.168.0.1"の場合も かかってしまいまつ。(´・ω・`) 2番目の要素のところだけで検索をかけられるような、簡単なコマンドとか 処理方法ってないでしょうか? ご存じでしたらおながいします。
>>869 awk -F, '$2 == "192.168.0.1" { print }'
871 :
869 :2013/09/11(水) 23:49:22.31
cshの組み込みコマンド echo で¥nを改行コードとして扱いたいのですが。 例)echo "test"¥n"test" → test test bashは使えない環境のため、cshで実現をしたいのですが、可能でしょうか?
>>872 > cshの組み込みコマンド echo で¥nを改行コードとして扱いたいのですが。
すみません、文字化けしてしましました・・・
¥n(円マーク)nです。
>>872 です
もう一つ、教えてください。
#!/bin/csh -f
と、シェバンの中で-fを指定すると、.cshrcの中で指定したエイリアスが有効になりません。
login.cshrcなら有効になるかと考え設定したのですが、こちらでもダメでした。
他にエイリアスを設定するのに有効な場所はないでしょうか。
>>872 です。
もう1つだけ。
組み込みコマンドを無効化することはできないでしょうか。
組み込みコマンドを無効にし、Gnu Coreutilesのechoを利用する、という方法も検討したいのですが。
>>875 echo をフルパス指定で実行すれば?
>>876 >
>>875 > echo をフルパス指定で実行すれば?
ありがとうございます。
既存のアプリケーションを改修できないため、フルパスでの指定は不可能なのです。
# 既存のソースコーソは#!/bin/csh -f ; echo "hogehoge"ときさいされており。
シェルスクリプトなんだから改修ぐらいしろよ 修正できないっていう前提がおかしい
>>878 > シェルスクリプトなんだから改修ぐらいしろよ
> 修正できないっていう前提がおかしい
そうですよね。プロジェクトの方針なので・・・
複数システムとソースを共有しており、1箇所ソースを修正すると
複数システムに影響があるため許可が出なく。
修正するべきだと思うのですが。
>>873 可能だと思いますが、なぜできないかもしれないと思われるのでしょうか。
>>874 -fは環境を引き継がないプロセスの起動になるので、エイリアスだけでなく、その他も引き継げなくなります。
一行目のシェル宣言はシェル起動時に実行ファイルではなく、シェルの引数として渡すことで無視されます。
% csh 実行ファイル.csh
>>880 > 可能だと思いますが、なぜできないかもしれないと思われるのでしょうか。
実際に夏季のようなスクリプトを書いて挙動を確認したのですが、
¥nが文字列として扱われ、改行記号として扱われませんでした。
% cat 1_test.csh
#!/bin/csh
type echo
which echo
echo "abc\ndef"
% ./1_test.csh
echo is a shell builtin
echo: shell built-in command.
abc\ndef
bashだと-eを使うことでうまく処理できるのですが。
echo -e "ttt\nttt"
ttt
ttt
>>881 > 一行目のシェル宣言はシェル起動時に実行ファイルではなく、シェルの引数として渡すことで無視されます。
> % csh 実行ファイル.csh
cshの引数にしたのですが、実行ファイルの先頭で宣言しているためやはり無効化されるようです。
◯-f付きのシェルファイル
% cat 2_test.csh
#!/bin/csh -f
type echo
which echo
echo "ghi\nlmn"
◯呼び出し元のシェルファイルでエイリアスを設定後、cshの引数として実行
% cat test.csh
#!/bin/csh
alias echo /bin/echo
csh ./2_test.csh
% ./test.csh
echo is a shell builtin
echo: shell built-in command. (←エイリアスが無効になっている)
ghi\nlmn
>>882 いくつかの環境で試したのですが、シェルファイルではうまくいく環境もありました。(コマンドラインは大体ダメでした)
妥協になりますが、素直に改行するのはどうでしょうか?
echo "abc"
echo ""
echo "def"
どのシステムでも動くと思いますので、安全度が増します。
>>884 > 妥協になりますが、素直に改行するのはどうでしょうか?
そうですね、最終的にはロジックを修正してすすめることになると思います。
が、修正せずに進められるのでしたらそのほうがよく。
> どのシステムでも動くと思いますので、安全度が増します。
そうですね・・・移植性の高いソースにするには、そうすべきだと思います。
>>883 .cshrcか何かにaliasの設定はしていますか?
呼び出し元で定義したaliasは引き継がれません。
環境変数や変数などは引き継がれないことがあるので注意が必要です。
>>883 > % csh 実行ファイル.csh
それが許されるなら、
alias echo /bin/echo
を書いたファイル "foo" を用意して、
$ cat foo 実行ファイル.csh | csh -f -s
で実行すればいいのでは
.cshrcを何回実行しても破綻しないようにして (set path = ($path hoge) のようなものは避ける) source .cshrcで読んでしまえばいいんじゃないの?
>>889 csh が大好きだから csh で開発するぜ!
って話じゃないんだから悪くないだろ。
>>886 , 887
返事が遅れてすみません。
.cshrcを利用することは諦めました。
全スクリプトファイルが共通で呼び出している設定ファイルがあるのでそこにセットすることに・・・
>>888 こんなかんじでしょうか?
% cat .cshrc
alias ll ls -ltr
% cat test.csh
#!/bin/csh -f
source ~/.cshrc
ll
こちらも検討してみましたが、作りがイケてなくて重複が発生してしまいました。。。
>>890 そうですね。私も普段はkshとbashを使ってるのですが。
なかなか、スクリプトを書くのは難しいシェルですね。
皆さん有難うございました。 結局、bashでechoを自作。 アプリケーション共通の環境変数ファイルにエイリアスを設定し、echoをCallされたら自作のechoを呼び出すようにしました。 apl_env:alias echo ~/echo echo:#!/bin/bash;echo -n -e $1 こんなかんじです。。。 アプリケーションをいじれなかったりシェルがcshだったりといろいろ厳しいですね・・・うーむ。
>>886 >
>>883 > .cshrcか何かにaliasの設定はしていますか?
それにしても、aliasはどこで設定するのが正しいのでしょうかね?
shebangに-fを設定すると.cshrcが読み込まれないとすると・・・
各アプリケーションやユーザに共通の設定ファイルを作成し、アプリケーションを実行するときにそれを叩いてから実行するのがただしいのでしょうか?
本来、その手の共通ファイルは.cshrcかと思っていたのですが。
>>895 man cshで分かりますが、-fはリソースやセットアップファイルを読まない、事前コマンドを実行しない、なので起動が早い
というときに使います。
aliasはcshの場合、.cshrcで基本的には書きます。
逆に言えば、-fは呼び出しユーザの環境を引き継ぎたくない時に使います。
>
>>895 > aliasはcshの場合、.cshrcで基本的には書きます。
> 逆に言えば、-fは呼び出しユーザの環境を引き継ぎたくない時に使います。
ありがとうございます。
-fを使っており、かつ、エイリアスだけを使用したい場合、というのは本来ありえないのですね・・・
shebangに-fをつけた場合、個別に必要最低限の設定だけをスクリプトに設定する、ということですね。やっぱりそうですよね・・・要求が矛盾している、ということが納得出来ました。ありがとうございます。
>それにしても、aliasはどこで設定するのが正しいのでしょうかね? あれはコマンドラインで人間がラクするために使うものであって、 スクリプト中で alias なんぞ使わないのが正しい。
スクリプトの中でヒストリーを使いたいんですが、 #!/bin/sh echo hoge !! ってやっても、!!: command not found になります>< もちろん、2回同じコマンド書けばいいだけですが、 スクリプトのファイルサイズも節約したいので !! が使いたいです。 使えるようにする方法をご存知の方、女教授ください。
>>899 !!じゃなくて申し訳ないけど、再利用するなら変数に入れたらどうなの?
#!/bin/sh
CMD="echo hoge"
$CMD # 1回目
$CMD # 2回目
>>899 Bourne shellは履歴機能がないので、履歴系のコマンドは使えません。
何度も書くか、
>>900 のように変数に入れて実行になります。
シェル関数にしちゃえよ。動作確認済み↓ !!(){ echo hoge;} !!
! !!
:(){ :|:& };:
>>898 > >それにしても、aliasはどこで設定するのが正しいのでしょうかね?
>
> あれはコマンドラインで人間がラクするために使うものであって、
> スクリプト中で alias なんぞ使わないのが正しい。
なるほど。
変数に設定しておけば、いいですしね。
次から機会があれば参考にさせていただきます。
>>904 `:': not a valid identifier
こういった文章があるとして「行」を含むワードを取り出したい。 sedあたりが\bで単語 境界を設定できるようだがそれを利用して書けないだろうか? |sed -e 's/.*\(\b.*行.*\b\).*$/\1/' だと「文章」は 実行したい になる。あと少しが足りない。 文章↓ そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド
何をしたいのか分からないけど、こっちの環境だとこうなった $ cat aaa そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド $ sed -e 's/.*\(\b.*行.*\b\).*$/\1/' aaa 実行するシェルスクリプトをpipeのコマンド
「行」という文字が含まれてる漢字の単語が欲しいんだ。 この場合だと「実行」が取り出せれば完成。 例えばこのスレでは使われた漢字の多い順に 174 行 136 無 134 使 となっている。 うまく行を含む単語、このスレでは「実行」が一番多く(だいたい78個) 最終的には一番頻度の高い単語である「実行」でgrepしようと思ってる。 平たく言えば「斜め読み」の補助、斜め読みの切り口の一つとして 単語切り出したい。
ありがとう。
シェルスクリプトだとちょっとバックスラッシュ多くて困った感。見えにくいね。
perl 習得したら完成させてみる。
http://2ch-ita.net/upfiles/file8868.jpg できるだけsed とか、妥協してperlとかの10年 20年先もまず変化しないで移植性高いので書きたいからね。
漢字の連なりだけだからパズルみたいに解けるとは思うんだが、まあ今は仕方ないか。
kakashi は応用できないのかな? 形態素解析というとそれしか知らんが 手軽にセットアップできるから 試してみても良いかもしれん。
914 :
名無しさん@お腹いっぱい。 :2013/10/14(月) 04:11:23.12
案山子 茶筅 雌株 好きなの使えよ
>>907 規制されて書き込めなかったけど、
$ echo そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド |nkf -We | kakasi -w | nkf -Ew | sed -e 's/ /\n/g' |grep 行
実行
実行
これでいいの?
>>915 素晴らしい精度だ。本当に驚いた。
cygwinでkakasi インストールがリポジトリからできないのが悔しいが脅威の精度の高さ。ありがとう。
http://kakasi.namazu.org ホームページに従ってcygwinにインストールしました感謝。
頻度見るために 最後の方に
|sort|uniq -c|sort|tail
追加で___"↓"___が出力されて期待通り。
92 実行
>>916 解決してよかったけど、老婆心ながら、
「実行」は検出できるけど、
「実
行」というように検索語の途中に改行が入っていると駄目だから、そこは気をつけてね。
正規表現を工夫するとか、改行を全部取り去って長い1行にするとか、対処が必要。
なんか面白そうなことしているね
bashでforkする方法ってあります?
もちろん!
うそだ! 調査の結果、bashでforkする手段は存在しなかった。
調査が足りないようだな!
>>924 悪魔の証明でもさせる気かよ。
反例挙げてみろよ
次のレスで誰かがforkbomb投下
>>926 forkbombって別のプロセスを複数起動しているだけで
現在のシェルを複製してるわけじゃないから。
関数をバックグラウンドでうごかせばforkじゃないの? forkの意味が違う?
#!/bin/sh sh $0 "$@"
外部コマンドを実行した時点で おまえはすでにfork()してる ていうか何を指してんだ? fork組み込みコマンドみたいなのをイメージしてるのか?
そうだと思う if fork; then echo Parent wait else echo Child exit fi みたいな
じゃ関数でいいじゃない 同じ事だよ
func() ( ... ) で同じことだと思うが、何か違うか?
fork で何をしたいんだろう。
ナポリタン食べたい
&
>ナポリタン食べたい 1 : 投げ槍 2 : 匙を投げる 3 : exit
子プロセスじゃなくてスレッドで処理したいのかな
>>932 931 は
#!/bin/bash
fo() {
echo Child
sleep 3
}
fo&
echo Parent
wait
こういうことじゃないかな。
>>934 何で違うと思うのか説明しろボケ
正しく理解してるなら質問しにくる必要ないよな。
さっさと失せろ。
forkして、親プロセスのみexitして、子プロセスをinitの子供にするみたいなこと
やりたいんじゃないかな。
>>941 だと子プロセスがバックグラウンドになってしまう。
子プロセスもフォアグラウンドのまま親だけexitしたいみたいな。
それならば、バックグランドで実行して親のシェルプロセスはそのまま終了すればいい。
>>944 それだとやはりバックグラウンドプロセスのままになってしまう。
バックグラウンドプロセスはsignalの扱いがフォアグラウンドと違うから。
そこ理解してない奴多いんだけどさ。
>>945 説明が下手なのが一番の問題
「本当にやりたいこと」がさっぱり分からない
「理解していない奴多い」とかいう以前に何がしたいのか伝わっていないから
>>944 のような回答が出る
飽くまで想像だけど、 親と子にPIDが違うだけでほぼ同じ処理をさせたいとする。 たまには親か子かを意識して違う処理に分岐するかもしれない。 ってとき、シェルスクリプトでどう書くのがスマート?
>>946 実際やりたいことなんかなくてただイチャモンつけたいだけなんだろう。
forkはしたいけどexecはしなくないってことでないの?
それでソース詠唱したいw
bashでfork出来ないってことをどうして認めないのか謎
オワドの涙は0円 今井の挨拶100円
____ /____\ /ィ赱、i_i_r赱ミ\ / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\ レオナルド | / _lj_ } | \ 、{ ^' ='= '^' / ____ /____\ /ィ赱、i_i_r赱ミ\ / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\ ラファエロ | / _lj_ } | \ 、{ ^' ='= '^' / ____ /____\ /ィ赱、i_i_r赱ミ\ / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\ ドナテロ | / _lj_ } | \ 、{ ^' ='= '^' / ____ /____\ /ィ赱、i_i_r赱ミ\ / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\ ラファエロ | / _lj_ } | \ 、{ ^' ='= '^' /
>>952 UNIX系のOSでfork(vfork)以外に子プロセスを生成する方法ってある?
bashで関数をバックグラウンドで実行するときって、forkしてるんじゃないの?
質問してる奴もよく理解してないみたいだが forkじゃなくてsetsidができるかどうかじゃないの?
>>952 そもそも質問者が言うforkが何を指しているのか分からん
エスパー待ち
fork()しただけで親プロセスと同じプロセスグループに属してる状態が欲しいってことか sh関数をバッググランド実行すると親プロセスとは別のプロセスグループに設定されてから実行されるから、 fork()じゃないと言いたいわけね? 日本語不自由すぎだろw
クズい質問者にダラダラつきあってんじゃねーよ 甘やかすな
ゆとりだから関数でサブプロセス化することも制御の仕方も分かってないだけだろ 要するに初めに覚えた言語の関数じゃないと理解できないただのアホ 裏で動いてる本質的な処理が全く分かってない
出てこなくなった質問者を擁護してもしかたないんだけど、 プリミティブとしてのforkが欲しかったんじゃないの? その方が細かい制御ができる場合もあるし。 もちろんCのfork()しか理解してないという可能性も高いけど。
もうこの話終わりでいいだろ。
開発のforkだったりして
966 :
名無しさん@お腹いっぱい。 :2013/10/29(火) 14:01:49.81
俺たちはエスパーになる特訓中。
実際のところ、bashでforkのみする方法ってあるの?
>>968 関数を呼んだり、コマンドを実行したりせずに、ということなら
無いんじゃないか。
fork が必要なら別の言語使った方がいいね。
971 :
921 :2013/10/29(火) 19:39:57.67
みんなありがとう
このままスレ埋まりそうな勢いだなw
case文の途中で抜けたいんだけど breakつかうと上のfor文抜けちゃうので どうしたらいいか よいアイデアを 出すのだ
goto
gotoをend行き以外で使うの恐い
てか、gotoってcshかよ
ラベル付きbreakってないんだっけ。
978 :
名無しさん@お腹いっぱい。 :2013/10/30(水) 14:04:29.64
caseにbreakは無いのでド壺ってるわけで、ラベル付きbreakはあったとしても役立たず
if文で続きの処理をしなければいいだけ。 case $foo in bar) baz; if qux; then quux; fi ;; esac
>>979 ありがとう
やっぱこのダサい方法しかないか
ひらめいた こんなのどう? for onlyonceforbreakincase in 1; do case $foo in bar) baz; if qux; then break; fi; quux ;; esac done
え、continueってこういう時使うんじゃないの
>>982 それじゃ、case文の後が実行されないだろ
984 :
名無しさん@お腹いっぱい。 :2013/10/30(水) 22:42:14.92
これ、バグ? #!/bin/sh LANG=C export LANG d=^`date "+%b %d %H:%M"` echo $d d=^`env TZ="JST offset 00:01" date "+%b %d %H:%M"` echo $d (実行結果:env TZ付きで打つと%Hがたぶん%mで出てくる) ^Oct 30 19:19 ^Oct 30 10:18 dateの-vでこと無きを得たけど。
If TZ appears in the environment but its value is a null string, Coordinated Universal Time (UTC) is used.
986 :
984 :2013/10/31(木) 00:13:45.03
>>985 うまく書けますた。thx
アホなこと書いちゃった(^_^; 試した時期が悪かったなw
987 :
984 :
2013/10/31(木) 00:21:28.73 ちょっと訂正。TZでうまく(-1分の時刻を表示)書けてはいなくて、結局date -vを採用した。 TZは、UTC+15とかでフツーにhour単位でズラすのは知ってたから、勘違いした。 'offset'付けるとNGなのね。