1 :
名無しさん@お腹いっぱい。 :
2005/11/03(木) 23:01:41 シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>1-5 くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□人間初心者へのお願い: ・このスレはシェルスクリプトについてのスレです。 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの 使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド: 制御・条件判定系: [,test,expr,true,false,yes,getopts テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join ファイル名・ディレクトリ系: find,xargs,basename,dirname 出力系: echo,printf 対話コマンド制御系: expect http/ftpの処理自動化: wget,curl
shellscript の中で perl 使うのはありですか?
sudo でぐぐったら、須藤元気が出てきてワラタ
じゃなくて、シェルスクリプトの中で、 あるユーザのホームディレクトリを取得したかったんです。 sudo -u username echo $HOME としてみました。そしたらrootのディレクトリ教えてくれました・・・ さらに finger username | grep Directory: | sed "s/ *Shell:.*//" | sed "s/^Directory: //" もやってみましたが、fingerが入っている必要があるのと、 出力フォーマットに依存するので汎用的じゃないなと・・・ どなたか知恵をお願いします。
>sudo -u username echo $HOME sudo の前に $HOME が展開されとるんじゃねーの? 新しめの sh なら echo ~username でどぞ。 これがうまくいかない古い sh ならば、 csh -c 'echo ~username' で。ksh でもいいけど。
>>11 サンクス!
echo ~username
でさらっといけました。
これを使いたいと思います。
ただ、、、sudo の変数、を後に展開させる方法ってあるのでしょうか?
あうあ・・・・・・ homedir=`echo ~$username` $username が後に展開されてしまって。。。。
>>13 そういう場合は evalを使う。
username=guest
homedir=`eval echo ~$username`
「[」が外部コマンドの場合、内部コマンドで書き換えるとしたら どういう方法がありますか?
>>14 ありがとうございます。
うまくいきました。
シェルは奥が深い・・・
17 :
15 :2005/11/04(金) 15:30:03
現用のOSで使えるものをお願いします。
>>15 がいしゅつだと思うが・・
まあ、新スレ始めだから書いとくけど、
文字列の比較なら case文で代用。
test -f fileなら、
: < file 2> /dev/null
で代用できる。
それrビットが落ちてても成功するの?
>>19 あくまで「代用」だからこれで桶だろ。
test -f fileを、それに近いtest -r fileで代用し、
それなら < file で代用できるというハナシだろ。
そもそも [ が外部などという、今ではあり得ない仮定のもとに話しても無駄。
>>18 それってヌルコマンド必要なのか
俺は単にファイル作りたいときとか、touchとか使わんで単に
$ >file
とかよくやるんだが、これって昔のbourne shellでは動かない?
>>21 : は(古いshでも)必要ないけど、ここではわかりやすいように書いてるだけだろ。
「> file」はよくやるけど「< file」は普通はやらない。
あと、
$ < input sed 's/hoge/hage/' > output
みたいな書き方もできるけど、人に説明する時こう書くと混乱するので、
$ sed 's/hoge/hage/' < input > output
と書くみたいなモンだろな。
>>14 echoが無駄だよ。それに ` ` も無駄。
username=guest
eval homedir=~$username
だけでOK。
data1.dat data2.dat data3.dat ...といくつかあるファイルをprogram1で加工して、 できあがった file1.dat file2.dat ...をprogram2でさらに加工したいです。 for i in 1 2 3 4 #※過程1 do ./program1 data${i}.dat done for j in 1 2 3 4 5 #※過程2 do ./program2 file${j}.dat done とすれば事は済むのですが、過程1と過程2の中で、program1、program2は 並行して実行しても問題ないので、できれば並行して実行したいです(CPUが複数個あるため)。 過程1で並列実行、過程1が終わったら、過程2を並列実行するような方法てありませんか?
>>22 そうか? 俺はいつも↓こう書いてるな。カッコいいだろ。
< input > output sed 's/hoge/hage/'
>>24 for i in 1 2 3 4 #※過程1
do
./program1 data${i}.dat &
done
wait # 過程1すべてを待つ
for j in 1 2 3 4 5 #※過程2
do
./program2 file${j}.dat &
done
でいいんでないの?
>>24 質問の意味が曖昧だけど、
for i in 1 2 3 4
do
{ ./program1 data${i}.dat; ./program2 file${i}.dat; } &
done
としたいということである可能性もあるな。
>>26 たぶんそれでできそうです。waitコマンドってのがあるのですね。
>>27 わかりづらくてすみません。
./program1 に data1.dat data2.dat data3.dat data4.dat
を処理させて、これが全部終わったら
./program2 に file1.dat file2.dat file3.dat file4.dat file5.dat
とやりたいのです。data1とfile1は1対1に対応しないので、待つ必要があります。
>>20 > そもそも [ が外部などという、今ではあり得ない仮定のもとに話しても無駄。
Minixの最新版では外部コマンドだよ
あり得ない〜は無駄厨もよそへ行ってやってくれ。
OS依存じゃなくてshell依存だ 内部コマンドにこだわるのは 外部コマンドを使えないパラノイアなのか それとも遊びたいだけなのか っていつも気になる
この前シェルスクリプトを書いた時、 うっかり #!/bin/sh を書き忘れたんですが、 それでも動いてしまいました。 これってバグでしょうか? それともシェル依存の現象でしょうか? そもそも、#!/bin/sh と書く必要あるのでしょうか? これってコメントアウトされてますよね?
>>33 shebangでぐぐれ。
#で始まっている行だから、インタプリタ(この場合はシェル)にとっては
ただのコメント行で、kernelにとっては先頭の#!が実行ファイルを
識別するためのマジックナンバーになっている。
shebangが無いスクリプトを実行しようとした場合、kernelはENOEXECエラーを
シェルに返す。ではなぜそれが実行されるかというと、あんたが使っている
シェルが、ENOEXECが返されたとき、自分でそれをスクリプトとして
実行するように作られているからだ。
>>33 >そもそも、#!/bin/sh と書く必要あるのでしょうか?
試しにシェルスクリプトに
#!/usr/bin/env perl とか #! /usr/bin/env cat とか
色々入れて実行してみな。
>>30 いまどきPOSIXも知らない貴様こそ死んでください。
>>35 欲嫁。
perlの話じゃなくて、/bin/shの場合の話だろ。
冒頭数バイトのマジックなんとかがないと カーネルが自動的に /bin/sh に渡すわけ?
>>38 >>34 に一応書いたつもりだが。
まずシェルは、コマンド名が与えられた場合、それがバイナリの実行ファイルか
スクリプトかは考えずに、それ自体をexecしようとする。
execで与えられたファイルのマジックナンバーが正しくない場合、つまり
アーキテクチャで実行可能なバイナリイメージ(ELFだとかa.outだとか)のもの
でなくて、#!でもない場合は、「kernelは」実行を拒否る。
kernelに実行を拒否られた場合、「シェルが」シェルスクリプトとして
実行しようとする。要するに、
スクリプト自体をexecするのではなく、
/bin/shをexecし、引数として渡す。
一方、マジックナンバーが#!の場合は、「kernelが」
#!の後で指定されているインタプリタを起動する。
40 :
38 :2005/11/06(日) 17:23:41
>>37 そっちこそ欲嫁。
シェルスクリプトの一行目に #! /bin/sh 以外の
コマンドを書いたらどうなるか試してみろという意味だ。
> 欲嫁 むしょうに腹が立ったのはなぜだろう (;´Д⊂)
shbangで始まっていない場合、 csh/tcshは、shと異なる動作をするので注意が必要。 1行目が # で始まっていれば csh スクリプトとして実行しようとし、 それ以外ならば sh スクリプトとして実行しようとする。 #!/bin/sh と書くつもりで、 #/bin/sh などと書いていると、 ログインシェルがtcshな人が使うと動かないスクリプトができあがる。
s/shbang/shebang/
数字じゃなくてもマジックナンバーって言うのは、UNIXではフツーのこと? 「それを書くと何か特別な作用がある文字列」=マジックナンバー という解釈で合ってるかな?
47 :
33 :2005/11/06(日) 20:48:04
皆さんありがとうございました。
#! がなくても/bin/shが起動するのはシェルの挙動だったのですね。
>>35 >>41 それは知ってますよ(苦笑)。
env経由で起動させてPATHから探させる技とかも含めてね。
>>39 FreeBSDってそんなうんこ実装してるのか?
さすがだ。
>>48 どこから"FreeBSD"って言葉が出てきたのか知りたい。
通はWindowsに限りますな。
>>49 うんこみたいな実装はFreeBSDに決まっているから
□人間初心者へのお願い: ・OSの良し悪しはスレ違い
でも、Linuxさんはもーっとうんこです。
くさすのもいいが、せめてもっとマシな実装例とそのOSを示せよ
Windowsは
>>39 のようなうんこ実装はしてないよ
Windowsはどんなうんこですか?
ノーエアーうんこ
うんこ、かっこわるい。 ( by 前園
grep -f file.txt のコマンドでどうも欲しい結果が得られないのでなんでかなと思って調べたら file.txtの中身に「*」が含まれてたのが原因でした。 なにか良い対策方法がありましたら教えてください。
シェルスクリプトと何の関係もないが、fgrep(1)
>>59 fgrepを使う。
fgrepなら*などが正規表現じゃなく、単なる文字として解釈される。
62 :
59 :2005/11/09(水) 12:20:49
スレ違いかも知れないですけど教えてください。 [TEST.ksh] #! /bin/ksh while true do echo `ps -ef | grep TEST.ksh | grep -v grep | grep -v more | grep -v view | grep -v vi | grep -v cat` sleep 2 done こんなシェルを流すと・・・ # TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh root 10854 20624 0 17:58:36 pts/0 0:00 /bin/ksh TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh root 10862 20624 0 17:58:40 pts/0 0:00 /bin/ksh TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh root 20624 19170 0 17:58:09 pts/0 0:00 /bin/ksh TEST.ksh 2秒毎に1行づつ結果が出てくるんですけど、 結果の2行目とか4行目とかみたいに、たまに TEST.ksh を2つ検出してしまうのはなぜなんでしょう? もちろんTEST.kshを2つ動かしてる訳じゃないです。 タイミングとかによるのかな・・・
・シェルスクリプトのことをシェルってゆーな
ヒント:ppid
>>63 FreeBSDを使っているとそうなる。別のOSを使ってください。
>>63 > echo `ps -ef | grep TEST.ksh | grep -v grep | grep -v more | grep -v view | grep -v vi | grep -v cat`
(...)
> もちろんTEST.kshを2つ動かしてる訳じゃないです。
backquoteの中はサブシェルで動くから、kshのプロセスは2つでしょ。
そうすると、シェルがforkしてサブシェル作るときにargvをわざわざ
変更しなければそうなるのは自然じゃないかと思うけど。
>>65 ごめんなさい。わからないです。
上の例で言うとPIDが 20624 が自分のTEST.kshだというのはわかりますけど
PPID が20624となってるTEST.kshがなぜ生まれるのでしょうか?
>>66 FreeBSDじゃないです。AIXです
>>67 なるほど、ありがとうございます
backquoteの部分は内部的にはもう一つプロセスを作ってそこで処理してるって事なんですね
> argvをわざわざ変更しなければ・・・
この辺はどうやればいいのかわからないのでちょっと調べてみます。
正直言うと、簡単な自シェルスクリプトの二重起動防止を作りたかったんですけど
排他ファイルを書き出す方法だと、シェルスクリプトが途中で落ちたときにファイルが残ってしまい困るし
psで検出すると上のように2行検出してしまう事があるし、どうしたものかと思ってた次第です。
もう少しいろいろと調べてみます。
>排他ファイルを書き出す方法だと、シェルスクリプトが途中で落ちたときにファイルが残ってしまい困るし trap
>>69 lockf()あたりを利用することを勧める。lockf()によるロックはプロセスが
死ねば解除されるので、ゴミ掃除の問題は無い。
話題のw FreeBSDにはlockf(1)というコマンドがあるが、無ければ無いで
似たようなものを作るのは簡単だ。
lockf()をF_TLOCK指定で実行→成功したら引数で与えられたプログラムを
execvp()するだけのプログラムを書き、それ経由で実行するようにする。
Cで書いてもいいし、より手軽にPerlなどで書いてもいいだろう。
>>70 こう書かれると何がマズイのか良くわからないんですが・・・
排他といっても
「ここにこのファイルがある時はTEST.kshが動いてる証拠ですよ」
くらいの処理しか考えてなかったのですが・・・
>>71 助言ありがとうございます。
lockf(1)があればOKだけど、なければCか何かで書いて作るって事ですね
うーん、お手軽にシェルスクリプトとコマンドだけでは作れないって事ですか・・・
lockf ってクローズ(つまりプログラム終了でも)でロックが解除されるから 外部コマンドには出来ないんだよね FreeBSDのはシェル組み込みなのか?
75 :
74 :2005/11/10(木) 16:52:51
ググったら分かった lockfコマンドの中で自分のコマンドを動かすのか こりゃいいアイデアだ
>>74 だ〜か〜ら〜 FreeBSDは糞実装だから真面目に考えちゃだめだってば。
実際なぜFreeBSDがUnix like OSだと名乗る資格があるか疑問だ。
ついこないだまではNetBSD、FreeBSDとl足並みを揃えてたりしてたのに、 カーネルが糞とまで言われるようになってるとは、、、FreeBSD何したん?
何もしてないよ。 わけわからんイチャモンをつけるアホがいるだけ。
>>76 の脳が糞実装なのは衆目の一致するところだ。
糞実装だと言われて糞実装じゃない証拠を提示できないということは つまり糞実装だという点については皆さん同意ってことですな。 #簡単なやつらだ
>>82 そもそもどこがどう糞実装なのか示せないということは
つまり糞実装ではないということですな。
おまえらスレタイ100回嫁
ずいぶん昔に、ゴミ箱スクリプト書いたかた居たかと思ったのですが、 そのときのソース揚げてもらえませんか?
>>87 rm を どっかにmv するようにラップするだけじゃないの?
>>83-85 糞実装だと言われて糞実装じゃない証拠を提示できないということは
つまり糞実装だという点については皆さん同意ってことですな。
お疲れさん。よくできました。
と、ペンギンが騒いでいます。
いいかげんにしろ。
糞実装とは具体的に何を指すのかを説明しないと反論のしようがない ってこともわからないのではアホとしか言いようがない。
OpenBSDスレとレスのタイミングが近いな。
95 :
名無しさん@お腹いっぱい。 :2005/11/12(土) 09:48:06
bシェルですが insert into sample values ( ${i} ) go のようなイメージでインサート文作りたいのですが ()の表現が上手くできません。 括弧を文字として扱う方法を教えていただきたいのですが。 宜しくお願いします。
>>95 質問が不明確だね。
i=hoge
echo insert into sample values \( ${i} \)
ということをやりたいのかな?
文字列を空白で分割したときに、いくつのブロックに分割されるかシェルのコマンドで調べるには どうすればできますか? たとえば、 $ CMD "foo bar" 2 $ CMD "foo" 1 $ CMD "foo bar hoge" 3 のような感じです。パイプとかを使うのはまったく問題ありません。 よろしくお願いします。
str="foo bar hoge" set -- $str echo $#
wc じゃあかんのか?
korn shellでdateで現在の日付を取得して その日付の数ヵ月後、数年後などを出す ものはありますか?-vは使えませんでした。
質問です。シェルスクリプトの中でPerlを使う際に、 シェルスクリプトで値を入れた変数を渡すにはどうしたらいいのでしょうか? アホな質問ですが、よろしくお願いします。 ■失敗したスクリプト #!/bin/sh pageurl="http://hogehoge.com/img/" curl "$pageurl" | perl -wne 'm/href=.([^>]+.jpg)/;print $pageurl$1;' ※Perlのスクリプトの中の$pageurlの値が定義されてないというエラーになる。
> curl "$pageurl" | perl -wne "m/href=.([^>]+.jpg)/;print \"$pageurl\$1\";"
>>104 早速のレスありがとうございます!
あー。そうか。クォートの問題なんですね。エスケープをどうするか考えないといけないのか。
早速試してみます!ありがとうございました!
107 :
名無しさん@お腹いっぱい。 :2005/11/13(日) 01:02:39
bashで、プロセス名から、プロセスIDだけを取り出して、 それをkillするには、どうすればいいですか?
スクリプト書くより pkill を使うといい。 あれば。
>>107 こんな感じ?
ps ax | grep [p]rocess | cut -d ' ' -f 1 | xargs kill
>>109 grep 自身のプロセスを引っ掛けてしまうのでは?
>>109 grep自身は引っかけないが、コマンド名と同じ文字列を引数などに含む
別コマンドが引っかかる可能性があるし、かなり無駄で不確実な方法だな。
>>111 もう気が付いてるかも知れんが、
「grep [p]rocess」は、シェル展開で「grep process」を実行することになる。
一方、ps axの出力で該grepプロセスは、「grep [p]rocess」を含む行として表われるから、
ヒットしない。
banner grepとかは即死じゃん
>>114 ちがうよ。 [p]rocess はシェルでは展開されず、
[p]rocessのままgrepに渡される。
grepは[p]rocessを正規表現と解釈するからprocessとして検索する。
その結果、やはりprocessという文字列を引数に含むコマンドがあると、
それが引っかかって誤ってkillされてしまう。
[p]rocess はシェルで展開されて process という名前のファイルがあればそれを返す。 なければ [p]rocess という文字列が返る。 '[p]rocess' だと展開されない。
118 :
名無しさん@お腹いっぱい。 :2005/11/13(日) 11:53:33
>>109 ,114,116
. に process がある場合と無い場合で振る舞いかわらんか?
まだまだ青いな坊や。 カレントディレクトリにprocessというエントリがあるとシェルが展開する。
そういうことだ。 カレントディレクトリに”process”が無ければ、だな。
>>109 grep [p]rocess などというのは旧世代のバッドノウハウ。
若いモンから「どうしてpkill使わないんですか?」と言われる前に、
古いやり方は忘れた方がいい。
無罪のプロセスが誤killされることに変わりないのだから。
無罪の -> 無実の
pkillがどのバージョンから使えるか憶えるくらいならpsの 出力を正しくパースするほうが楽。
`parse' は「パーズ」じゃね?
確かになかなかよい方法が浮かびませんね。 1. pkill,pgrep,killall,pidof などを使用する。 2. /proc 以下を調べる。 3. デーモンなら /var/run/pid とかにあらかじめ pid を記録しておく。 4. ps -o "pid,command" として grep "^[c]ommand" で絞る。
>>125 辞書の発音記号だと、
(英)[pa:rz]
(米)[pa:rs]
だから、パースでもイイよん。
>>124 何ムキになってんの?
ps x |awk '{ if ($5 == "command") {print $1}}'
>>128 不正解。
コマンド名がフルパスだったりすると期待通り動作しない。
>>127 その辞書は間違い or 情報が古い。
現在では米標準発音も英南部標準発音もいずれもパーズ。
>>129 必死だね。あえて'=='で比較したのに。
ALC の辞書はパースしか載せていないな。 どっちも聞く気がするけど。
>>132 いやだ。三省堂の辞書がどうだろうと知ったこっちゃねえ。
くだらないな にわかに知って語りたがってるだけだろう 放置推奨
pkillすげぇ。 argv[0]変更して起動したコマンドでも、 argv[0]変更前の本来のコマンド名で見つけてくれる。 こりゃ、psの出力をパースしたんじゃ不可能だな。
ls -l /proc/[1-9]*/file E2BIG喰らわないように工夫しなさい。
>>136 さすがに専用コマンドだけあって抜かりないな。
pkill にもいろいろあったりしないのかな。
140 :
名無しさん@お腹いっぱい。 :2005/11/14(月) 12:23:27
ディレクトリ、/binにある全ての実行可能ファイルのman一行出力をテキストファイルに書き出す。 ファイルの数は膨大なので、スクリプトを書いて処理すること。 大学でこのような課題を出されたのですが、正直何をして良いのか全くわからず途方にくれてます。 forを使うらしいのですが、そこから先に進めません。どうしたらいいでしょう?
マジレスすると初心者スレ行った方がいいと思う。
くだ質でも同じこと言われるだけだと思う。
>man一行出力をテキストファイルに書き出す。 これはどのコマンドを使うの?
>>144 whatis(1) のことじゃないかな。
そうそう.
>>144 のような質問だけで解決するとよい.
間違ってもいきなり,どうやってやんの?
とか聞かないほうがいいぞ.
本来単位取れないヤツを周りの力で誤魔化して点取らせても 社会的に迷惑でしかないだろ
逆に大学で頑張ってもそんな知識社会だとほとんど役にたたんだろ 俺大学でいろんなプログラム言語とかやったけど 今では会社入ってから覚えたインフラ構築とかばっか
それは本質において「学校の数学が何の役に立った?」とか言うのと同じ愚を犯している。 学校で学ぶものは知識ではないよん。
まあでも、すぐ腐る「専門知識」とやらばかりを教える専門学校が幅を利かせ、 三流大学もその轍を踏む時代ではあるな。
>>150 その通り
しかし今の学校ではテストとやらで結果を出さないと卒業できない仕組みになってる
その為には学ぶものではないとは言え知識なんだよな
要領よくテストやレポートを切り抜けるテクニックは卒業後も大いに役立つと思われ
140のような人物は、大学の成績うんぬんに関係なく 「ウチに来ても使えなさげ」なのは確かだろ? その意味では、学校の勉強や成績つーのも案外バカにならない。
初心者の俺も挑戦してみた。 `ls /bin/*` って書いて失敗した。
man -f man が動かないと思ったら /usr/sbin/makewhatis しないとだめなのか。。。 find /bin -perm +111 | xargs man -f > /var/tmp/result.txt で良い気がするけど for 文使うの?(w
>>156 自己れす。
パスが入っちゃうからダメだった。
find /bin -type f -perm +111 | grep -v '^bin/[^/]*/' | sed 's/^.*\///' | xargs man -f > /var/tmp/result.txt
これだけ具体的に問題を訊いておいて
ここにある答えコピペしたら聞いた奴が
誰か丸分かりじゃないのか?
>>156 こういう書き方を期待しているのでは?
for i in /bin/* ; do
if [ -x "$i" ] ; then
man ...
その方が簡潔やね
>>157 後半、こっちの方がお勧め。
find /bin -type f -perm +111 -exec basename {} \; -exec man -f {} \;
>>160 findのexecは続けられるのか。メモメモ、
粘着きんもーっ☆
カタカナで書いて、発音が正しいも何もあるかい。
parse【発音】pα':(r)s
>>167 だからといって parse を「ゴメス」とか発音してはだめだろ
ゴメスをparseと発音すれば問題ない
s/z
パースでもパーズでもない parseはparse
リュシータ
パンパース
>> 172 あんたの発音を IPA で書いてけろ
>>175 この板でIPAって書くと別のIPAと間違われるから、 国際発音字母 って書いたほうがよさげ。
178 :
名無しさん@お腹いっぱい。 :2005/11/21(月) 19:13:34
すまんが誰か教えておくれ シェルスクリプトでビット演算する方法ってあるんだろうか?
$ uname FreeBSD $ echo $((5|10)) 15 $ echo $((5&4)) 4 $ echo $((5^5)) 0 $
180 :
名無しさん@お腹いっぱい。 :2005/11/21(月) 19:32:21
質問させてください シェルスクリプトでpasswd hogeを実行すると パスワードを求められますが パスワード入力もシェルスクリプトでやることってできますか? できるならやり方おしえて欲しいです。 よろしくおねがいします。
expect
>>182 できました!
ありがとうございますー!
>>182-
>>183 おれ、ここの、こういう会話好き。
185 :
名無しさん@お腹いっぱい。 :2005/11/22(火) 17:51:17
シェルスクリプトを実行するとpsコマンドとかで引数が見えちゃいますよね。 パスワードのたぐいなら引数などで渡さずに、パイプやファイル経由で取り扱えば よさそうですが。perlなんかだと$0に代入しちゃう安易な手段もあるようです。 シェルスクリプトで、ちょっと何やってるのか見せたくない場合の裏技とかってありますかね? まあ。これが出来ちゃうとセキュリティ上の問題にもなるような気がしますが。 詳しい人教えてくださいませ。
でも、じさくじえんなんだよね。
>>185 ヒント: スパゲティを量産する自称プログラマー
spaGheTTYって名前のターミナル開発したら、プログラマは誰も使わないだろうな・・・。
spamghetti という製品はあったけどな。名を体を表すというコードだったが。
190 :
185 :2005/11/23(水) 00:41:00
うむ、やっぱ方法ないのかな。
ググってみたけどrootkitのたぐいの話しか出てこない。
>>187 全部自分で書いたものじゃないからしかたないのだ。中身を書き直す時間が
無いので穴だけ塞ぎたいのだ。
パーミッション絞ったファイルに書いて読ませる、とか?
>>185 シェルスクリプトから起動されてる個々のコマンドの引数を隠したいということ?
それは無理だろ。
引数を隠すのは起動されたコマンドの仕事だが、
あらゆるコマンドがそんな機能を持つわけじゃない。
それにそんな機能があったとしても、起動直後は残るから、
糞重い環境とかだとタイミングの問題でいずれ漏れる。
つか危ないやつからpsの実行権を取り上げろ
194 :
185 :2005/11/23(水) 02:05:44
>>191 書き換え箇所が多いので避けました。
>>192 うむ、起動直後だけちょっと見えちゃう方法なら知ってました。
とりあえず少々面倒だが方法は見つかったです。
セキュリティモジュールぶっ込むことにしました。
しかしちゃんと動くのだろうかコレ。
シェルの実行時に引数が与えられたかどうかの判定はどうやるのがいいのでしょうか? 今は if [ ! $1 ] then else fi としているのですが、bashではこうやるもの、見たいな定石はありますか?
bashは知らんが #!/bin/sh case $# in 0) echo no;; *) echo yes;; esac あと、 ・シェルスクリプトのことをシェルってゆーな
>>196 >・シェルスクリプトのことをシェルってゆーな
根拠は?
バカっぽいから。 違うものを違う名前で呼ぶのは混乱を防ぐために当然のこと。
sedスクリプトをsedとは呼ばない。 awkスクリプトをawkとは呼ばない。 perlスクリプトをperlとは呼ばない。 phpスクリプトをphpとは呼ばない。 JavaスクリプトをJavaとは呼ばない。
>>202 「お約束」って書いてあるのが読めないのか。このあきめくらが。
JavaScriptをJavaと呼ばない
JavaScriptのスクリプトってなんていうの?
じゃばすくりぷとすくりぷと
PostScriptのことをPostと呼んだら、(たとえ好意的に解釈してもらったとしても) 絶対に通じない。 しかし、SellScriptのことをShellと呼んだ場合は相手が好意的に解釈すれば 一応通じる。
SellScriptのことをShellと呼んだ場合は好意的に解釈してもらっていた相手でも それ以降( ´_ゝ`)プッ
馬鹿を判別する目安にしたいので あえていい加減な言葉遣いを続けていただきたい
おまえあたまいいな
>>208 SellScriptって、販売用の営業マニュアルか何かですか?
それをShellと呼んでも通じませんね。ShellScriptならともかく・・
シャルスクリプト
今度UNIXで使うプリンターを買いたいのですが、 プリンターの設定でハマるといやなので、 UNIXに繋ぎやすいプリンターを探しています。 やっぱり、UNIXからプリントアウトする場合は ポスト対応のプリンターがいいのでしょうか?
みんな騙されるな!
>>216 「ポストプリンター」は、「POSTメソッドでリクエストを受け付けるプリンタ」、すなわち
IPP対応プリンタのことだったんだ!
はいはいなんだってなんだって
>>216 ポスト対応のプリンタは高い。それより、ゴーストのドライバが対応してる
プリンタを買った方がよい。設定は、ゴーストにそのプリンタ用の
オプションを付けたシェルを書いて、そのシェルををlpd or cupsの
フィルタにすればいいだけ。
よそでやれ。
だから、ポストスクリプトをポストと略すなと
え、ポスト対応ってパワーオンセルフテストに対応してるってことだろ?
224 :
198 :2005/11/27(日) 01:13:48
>>202 漏れは別に「シェルと呼ぶのが適切」などとは主張してないよ。
単に「・シェルスクリプトのことをシェルってゆーな 」の根拠の
提示を要求しているだけ。
要求はのまない。諦めろ。
シエルがどうしたって?
違うものを違う名前で呼ぶのは混乱を防ぐために当然のこと。
酸化とか用語直してくれよ。
シェルスクリプトをシェルと呼ぶのは シェルスクリプトをシェルと呼ぶこと自体が問題なのではなくて シェルと呼ばれる別のものがあるのに、シェルスクリプトをそれと同じシェルという呼び方する点に問題がある。
>>229 シェルスクリプトの実行インタープリタと、
コマンドラインのインタープリタが別物なら
>>229 の主張は成り立つ。
しかし、実際にはどちらも同じシェル。よって、
「シェルと呼ばれる別のもの」は「無い」ので
>>229 の主張は成り立たない。
たとえば、perlスクリプトを書いて処理した方が楽な場合、
「こういうのはperlでやった方が楽」と言う。この言い方には異論はない。
ならば同様に、
シェルスクリプトを書いて処理するのが適している場合、
「こういうのはシェルでやった方がよい」と言っても良いことになる。
でも「シェルを書く」は違うだろ。 「perlを書く」と言わないように。
粘着は放置、ってのが2chのルールだと思っていたんだが。 ・・・スマン、俺も釣られた?
釣られるであれば気にはなっている問題だと認識しているのでしょ。
くだらねぇ。
UNIXの達人になるとシェルでメールが打てると聞きました。 それってすごいですよね。でも、メールはシェルで打てても、 シェルではインターネットはできないですよね? それとも達人になるとシェルでインターネットを見ることもできるんですか?
迷惑メールの自動送信の話ですか?
くだらねぇ。
初カキコ シェルスクリプトで書く シェルで書く どっちとも、言うよね?bashスクリプトを書くとはイワねーだろw そんなに、厳密に定義した言語体系でしか喋れないと、実世界で人に理解して貰えないし、人を理解出来ないマニア
おまえの回りはヴァカばっかだからそうかもしれんが。 普通は言わない。言うべきでもない。必要があれば「bashスクリプト」も使うべき。
シェルスクリプトを書く。 シェルで書く。
シェルで書くと言った場合はコマンドラインからの打ち込みを想像するな。
お前は携帯電話を携帯と呼ぶことは無いのか? 間違ってもインターネットするなんて梨田炉? 損なことばっかり、いってるから女もできないし、友達も少ないんだよ。 とりあえず、話し方教室っていうのがあるから、行って見るといいぞw
3連投は自演の基本だ
くだらねぇ。
ホームページを持っていますが、 携帯からインターネットを見ているかどうかを判断する シェルを書くにはどうすればいいでしょうか?
携帯電話はシェルスクリプトじゃないし、ケータイはシェルじゃない。 でも、UNIX屋ってPHS派が多そうだな。漏れのイメージ的には。
くだらねぇ。
おっぱいは 見て良し。 触って良し。 揉んで良し。 舐めて良し。 吸って良し。 良いとこだらけ。
誰の どんな によるだろ。
正直おっぱいがなければおれの人生はもっとましなものだった。
一度や二度のおっぱいがなんだ!
おっぱいは成功の元
×成功 ○性交
くだらねぇ。
258 :
198 :2005/11/27(日) 22:37:22
つうわけで「・シェルスクリプトのことをシェルってゆーな 」の根拠は 誰も提示できませんでしたね。
男のおっぱいはどうなんだ?
あれはいわゆるトマソンというやつです
>>198 うん。
馬鹿判定に使うからどんどん使っていいよ。
263 :
198 :2005/11/28(月) 23:27:44
>>262 なるほど。具体的反論ができないってことですな。告白乙。
>>263 お前面白いからついでにコテハン名乗っとけ
盛 り 上 が っ て ま い り ま し た 。
266 :
198 :2005/11/30(水) 00:42:53
もう一回書いたら笑ってやろう。
くだらねぇ。
横からスマンが、
>>262 の完敗だな。(´・ω・`)ショボーン
ふふふ
ループスレと聞いて飛んできました!
あんまりかまうな。
おいら的には, 直感的には以下のような違いが... シェルを書く: sh でも bash でも csh でも zsh でも scsh でも独自のものでも良いが, シェル自体ををデザインして実装する行為 シェルスクリプトを書く: sh でも bash でも csh でも zsh でも scsh でも独自のものでも良いが, 実装されたシェルの文法にしたがって, 何らかの処理を記述する行為
所詮個人の直観にすぎないのですな。
うむ。 シェルを自分で書ける人にとっては、「シェルを書く」と 「シェルスクリプトを書く」は完全に別物なんだが、 いかんせんシェルを書けない人にとっては、「シェルを 書く」=「(シェルそのものを書ける訳ないんだから) シェルスクリプトを書く」って自動変換されちゃうみたい なんだよね。 そういうのを自分で公言して、恥ずかしいだろうにと 自分でシェル作ってみたりした人は思って、「シェルって いうな」なんて助言してみるのだけど、どうにもシェルを 自分で作れない人は、略しても通じる言葉と通じない 言葉の区別すらつかなくなってるわけです。 例えばアルコール飲料や雑酒をビールビールと言い張って ビール好きから眉を顰められたりするって感じかな。ま、 それで恥ずかしくないならいいんだけどね。きっといつか 市民権も取れることでしょう。ガンガレ。
>>274 >シェル自体をデザインして実装する行為
納得。
教授もシェルを書くといっていた。(もちろんシェルスクリプトのこと)
すかさずつっこまないと。
木村泉センセとか村井純センセあたりが「シェルを書く」と言ってたら、 漏れは「シェル」派に転校するぞ〜
「シェルを書く」を「シェルスクリプトを書く」ことだと類推できると いうことは「シェルを書く」という言葉の意味が正しく伝わっていると いうこと。つまり十分通用する慣用表現なのである。
>>276 はあ? とっくに市民権を得てるがな。ほんと馬鹿が多いな最近のUnix板は。
タネンバウム先生が「シェルを書く」と言ってたらどうしようと思ったが、 MINIX2では確認できず… MINIX3ではashが標準シェルになってる模様。
「類推」とか「慣用表現」とか言い出すあたりが苦しいな。 わざわざあいまいさを持ち込む必要などないし、 そもそも漏れはそんなに寛容な表現を認めませんよと。
駄洒落はいかんよう
シェルのスクリプティングは簡単なコツを覚えるだけで広く応用することができる これを「一を聞いて十をシェル」という
なんだかギャル文字を認めるか否かの争いに似てるな。 肯定派と否定派に世代の差があると見た。
↓そろそろ誰かが何事もなかったかのように良問を投げる
くだらねぇ。
>>284 「漏れ」ってなんだ?俺はそんな日本語は認めないぜ。
どうみても糞スレです。 ありがとうございました。
おれはスクリプトと言う。perl sed を含めて。 手順書のイメージだな。
たとえばこう考えたらどうだろう おまんこする。 おまんこは固有の部位で動詞にするには無理がありそうだが おまんこにちんこを挿入するという表現はなかなか 公に使いにくい そこで「おまんこする」拳を握って人差し指と中指の間から親指 それが最強 ジェルスクリプトを作ると露骨な表現をしなくても シェルを作るで通じればそれが文化になる
295 :
名無しさん@お腹いっぱい。 :2005/12/01(木) 10:21:33
>>293 > ジェルスクリプトを作ると露骨な表現をしなくても
> シェルを作るで通じればそれが文化になる
てのは、
>>274 的な立場からみると、シェルのデザイン/実装もできない
無能者集団の文化だけどな。
それでも、一応、文化ではあるか…
思考能力の差を世代のせいにしてはいけない。
そうそう。オバサンにも多いよ。自分の都合さえつく命名方法なら 他人のそれと矛盾しても全然気にしないどころかそれを理解することを 回りに要求する人。 だから少なくとも世代だけが原因というわけではない。
身障者を蔑視するような用語は放送、書籍、教育から排除されて それに異議も唱えず民衆から自然に排除されていくだろう 同様に排除されてる「まんこ おまんこ」であるが これは差別用語に比べて排除される傾向はない 教育、放送等の標準語からいくら排除してもマンコは消えない それに変わる言葉があまりにも出てこないから 陰部、女性性器、膣、性行為といくら代替の言葉をさがしても まんこには適わない 言葉狩りが浸透した昨今でも若い女性におまんこしない?と 言えば良くも悪くも通じる 方言要素の大きい言葉であるが地方出身者でもおおよそ通ずる浸透率 このマンコという言葉の浸透率や使用率や継承率を研究することで 俗語のメカニズムのなかで90%は解明されると考えられている 俗語は日々創造され続けているので100%は無理だが まずおまんこである それがシェルスクリプトなのにシェルを作るという誤表現の解明の近道
>>298 ここは正規表現のスレッドではありませんよ。
>>295 大抵はコンテクスト上どちらを指しているかは理解可能。
……というか普通に現場でシェルスクリプトを指してシェルと呼ぶ
同業者が結構多いので、理解できなければやっていけない。
ま、せいぜい象牙の塔にでも引きこもっててくれ。
302 :
295 :2005/12/01(木) 15:44:55
>>301 > 大抵はコンテクスト上どちらを指しているかは理解可能。
て、言うのは否定しないよ。「だけど心情的には…」って話なんだが。
>普通に現場でシェルスクリプトを指してシェルと呼ぶ >同業者が結構多い 駄目業界
>>280 村井氏はねとわくの人だけどUNIXの人じゃないから。
>>283 たぶんタネンバウム先生が使う言語(英語)では、
write with shell
では?↑の意味で
write a shell
とか言ってたら普通に変だけど。
>>301 >普通に現場でシェルスクリプトを指してシェルと呼ぶ
>同業者が結構多い
どこの業界の話ですか(w
同級生と書き間違ったのだろう。
>>301 だけど、
システム屋だよ。「俺は」そうは略さないが、シェルスクリプトのことを
シェルと呼ぶ人は本当に多い。
こっちも面倒だから、仕様書のような正確性を必要とする文書の中で
使われているのでなければ、一々指摘しない。
実のところ、システム屋が仕事で「シェルを書く」と言ったら100%それは
シェルスクリプトのことだから、間違う余地はない。
>>307 少なくとも、それを前提とすることを他人に要求する人がシステム屋には多いということだね。
>>307 FAって何だ?そんな日本語、通用すると思ってんのか?
>>308 俺は何も要求しとらん。「漏れ」とか「FA」とか言ってる連中が下らない
呼称のことに拘っているのを鼻でワラットルだけだ。
>>309 シェルスクリプトを書くことをシェルを書くというなら、それはすなわち
受け手にシステム屋は「シェルを書く」という言葉を本来の意味で使うことが
できない人種だから諦めて合わせてやれ、という前提を受け入れることを
受け手に要求していることにほかならないわけだが、
もしかしてそれが理解できないのだろうか。
>>310 別に言ってる奴には「要求」してる意識なんぞ無いだろう。
「漏れ」といってる奴は、「漏れ」という日本語がある種のコンテキストで
使われているときに、それは「俺」を意味する、そう理解しろ、と
要求しているのだろうか?
単に皆がそう言ってるからそう言ってるだけだろう。
で、未だに「漏れ」という用語を使う人間は、それがネナベテストに利用されている
ことも知らないのだろう。
で、あんたには「そういう言い方は正しくないから止めろ」と言うか、
一々そう言う面倒だから受け入れる、という選択肢がある。それは
あんたの自由だ。
縮めて「シェる」でいいじゃん。
追加。 それを自由だと言いつつ何で鼻で笑ってるかって、 そりゃ滑稽だからだよ。 何の思想性も一貫性も無い、平気で崩れた日本語を使ってる人間が、 意味が理解できない訳でもないのに、特定のタームに対してヲタク的拘りを 見せるのがな。 俺から見れば、「シェルスクリプトをシェルと呼ぶな」という主張は 2chで「半角カナを使うな」と主張するのと同じぐらいに滑稽に見える。 まあ、俺が勝手に「滑稽だ」と思っているだけだから、せいぜい自由に主義主張を 通したまえ。
あなたを一番滑稽です
>>309 >
>>307 > FAって何だ?そんな日本語、通用すると思ってんのか?
>
>>308 > 俺は何も要求しとらん。「漏れ」とか「FA」とか言ってる連中が下らない
>>313 > 俺から見れば、「シェルスクリプトをシェルと呼ぶな」という主張は
> 2chで「半角カナを使うな」と主張するのと同じぐらいに滑稽に見える。
( ゚д゚)ポカーン
>>314 小学校に入りなおして「てにをは」ぐらい勉強して来い
>>315 何にポカーンとしてるのか知らないが、出来れば説明してもらえないだろうか。
俺の態度が一貫していないというのなら、その理由は簡単だ。
>>309 のは「皮肉」であって、別に俺は「漏れ」や「FA」を否定しとらん。
まあ今時「漏れ」もどうかとは思うがな。
>>316 せいぜい自由に主義主張を通したまえ
> そりゃ滑稽だからだよ。
> 何の思想性も一貫性も無い、平気で崩れた日本語を使ってる人間が、
> 意味が理解できない訳でもないのに、特定のタームに対してヲタク的拘りを
> 見せるのがな。
なにこの糞スレwww
安心しろ、このところずーっと糞スレだから。 ちなみに俺は最初にあらわれてシェル云々と言い出した人物とは別人だぜ。
くだらないスレになったお
シエルの話しようぜ。
326 :
324 :2005/12/01(木) 21:45:45
>309、>313 正直、こだわってんのはお前w こだわってないなら、2chなんざ笑って流せばおk。 なのに流せないばかりか、こだわりまくって、 挙句の果てにはオタク的拘りみたいなレッテル 貼り始めてさw UNIX板では微妙なこだわりを装う、もしくは本当にこだわるのが スタイルなわけです。そこら辺勘違いして、他人も自分と一緒で、 必死にこだわってるとか考えてちゃ、何時までたっても笑い者の ままですYo!
くだらねぇ。
↑まねスンナ
ともかくこのスレでは、
>>1 のとおり
・シェルスクリプトのことをシェルってゆーな
だ。
気に入らんなら、「シェル総合」スレ作って、
>>1 に「シェルといえばシェルスクリプトのこと」って書いとけ。
俺はそうは言わないが、システム屋のことをヴァカと呼ぶ人は本当に多い 実のところ、このスレではシステム屋と言ったら 100%それはヴァカのことであって、間違う余地はない
まあいくら言い訳しても、シェルを書くとか言っちゃった人間は 100%それは馬鹿扱いされることに疑う余地はない。
>>332 たかがその程度のことで他人の知性程度を判断できるアンタのバカさ加減に
俺は乾杯するよ……
お前ら、社会に出たことないだろ
言い訳しても無駄だと言っている。
「言い訳」も何も、俺は「シェルスクリプト」の代わりに「シェル」なんて 言わないけどな。ただ、その言い方を認めてるだけだ。客や協力会社の 人間に言い方ぐらいでいちいちつっかかってられるか。 ま、俺が悪かったよ。「シェルスクリプト」と「シェル」の違いが三度の飯より 重要な希少な人種の溜まり場で、客や他社の人間、別の世界に生きてる人間と 話したことも無いんだろ?そういうスレだもんな。 実に場違いな煽りでしたよw
言い訳しても無駄だと言っている。
言い訳しても無駄だと言っている。
俺もリーマンやってるが、客が間違っているからといって 自分が間違えていいということにはならない。甘ったれるな。
このスレが質問者に対する教育や矯正の側面ももってることを忘れるな もちろん、ごまかしたり釣ったり煽ったりからかったりもするがな
甘ったれるな。
>>338 は?誰に言ってんの?「リーマン」は正しくて「シェル」は間違いだという
あんたの根拠は何?
>>339 ま、本来それだよな。ただ俺的にはもうこういうfj.usage行き的な
void的なネタは飽き飽きしてる。
いつまで「は?レスって何ですか?」みたいなネタ続けんのよ、という。
いい割れ目して無駄毛も剃っている。
呼び方の話題はいつまで続くの?
はん?
>>339 > このスレが質問者に対する教育や矯正の側面ももってることを忘れるな
ここ最近のスレでそんなのは大嘘かつ欺瞞であることが完全に証明されました。
・シェルスクリプトのことをシェルってゆーな ・シェルスクリプトのことをシェルってゆーな、っていちいちゆーな ・シェルスクリプトのことをシェルってゆーな、って言われていちいち反発するな
このスレでは「ぬるぽ」の代わりに「シェルを書く」と 書けばいいのですね?
「ガッ!」の代わりは何にしたら良いだろう?
しかし、
>>198 から延々とひっぱってたのか… いやはや
スクリプトッ!
>>335 そういう相手と関わって「シェルを書く」という言い方を受け入れる
のも必要だと理解する人なら、区別する文化圏の人を相手にするときは
逆にきちんと区別するのも重要だと理解できる筈だけど。
特にアカデミックな相手のときはそうだし、自分より相手が詳しい分野について
はいくらでもそういうことがある。
でもそういう場所であるこのスレで、シェルを書くという言い方をする人たちが
いるということにだけこだわりまくって
「〜の違いが三度の飯より重要な希少な人種の溜まり場」
なんて言うってことは、そういう人を相手に商売したことがなく、
要は、「区別しない人種を知ってる自分は知らない(とあなたが勝手に思ってる)
キミたちより偉いんだぞ」という優越感を覚えるための煽りだったということでしょ。
シェルを書く
言い訳しても無駄だと言っている。
C 言語でシェルを書く
>>353 自動的にシェルスクリプトを作成出力するC言語のプログラムあるよ。
その(C言語で書かれたコマンド)を使って自動的にシェルスクリプトを書く
という意味だよね?
C言語のプログラムをC言語ってゆーな。
なんだこの糞スレ いつからこんなスレになったのか…
プッ!
プッ!プッ!プッ!
ようは「シェルスクリプト」が長いからうまく喋れないんでしょ? そういう人は「シェルスク」でいいじゃん
361 :
312 :2005/12/02(金) 16:46:22
「シェる」でいいじゃん
「シェル」というよりも「スクリプト」と言ってくれたほうがナンボかマシ。
・シェルスクリプトのことをスク水ってゆーな
>>357 その前からFreeBSDへの根拠のない煽りや
パース or パーズ論争などのくだらない要素満載
単にレベルが低いというだけならはるか昔から……
「FreeBSDへの根拠のない煽り」 FreeBSDは、どうみたって糞だろ。
>>365 お前はスレタイ100回読んだ上でさっさと巣に帰りな
坊や。
糞を糞といって何が悪い。
>>361 勝手に人を騙るなよ。
単にスレを荒らしたいだけの愉快犯だな。
369 :
198 :2005/12/02(金) 18:12:00
FreeBSD C shell 糞を糞といって何が悪い。
お前が糞というのが悪い
「シェる」何げにいいな。書くときしか使えんけど。
UNIX原理主義に法り、 正しい用語をしない奴を、徹底的に叩く。
373 :
324 :2005/12/02(金) 21:34:09
さ ら に 盛 り 上 が っ て ま い り ま し た 。
□お約束 ・シェルスクリプトのことをシェルってゆーな ・約束を守れないヤツは来るな。
シェルスクリプトをシェルって言うやつって、 データベースからデータを「吸いあげる」とか言うやつと同じタイプ。 SI屋っつうかIT土方特有の言葉使いをするんだよな。
違うよ。むしろウェブページをホームページというのに近い。
IPアドレスをIPっていう方が近い。
一時期、ハードディスクを「ハード」と呼ぶ香具師が多かったなあ おじさんはめまいがしたよ 定着しなかったようでなにより
380 :
324 :2005/12/02(金) 23:06:23
ディスクトップとかインストロールとか。聞いてるこっちが恥ずかしい。
なんかどんどんスレ違いになってきているわけだが。
インスカトロール
パッパラフニフニ パッパラほえほえ パッパラフニフニ たまご! パッパラフニフニ パッパラほえほえ 焼いたらこげちゃった パッパラフニフニ パッパラほえほえ パッパラフニフニ おイモ パッパラフニフニ パッパラほえほえ ゆでたらとけちゃった とっても とっても クールなあなたに アンアン すっかり 夢中 うっとり ねっとり ハートがどっきり ちょっぴり見せちゃうわ 天気がいいから どっかへ行きたい ヤンヤン お願い 聞いて ウッフン 特別 豪華なランチを どっかで あげるからンラララン ランラララン ヤンヤヤヤン ヤンヤヤヤン 東(とう)西(ざい)南(なん)北(ぼく) 東(トン)南(ナン)西(シャー)北(ペー) ランラララン ランラララン ヤンヤヤヤン ヤンヤヤヤン 1(ワン)2(ツー)3(スリー)4(フォー) 1(イー)2(アル)3(サン)4(スー) あん トマトはダメ 私のもの たこはあげる 見ためが キライ
パッパラフニフニ パッパラほえほえ パッパラフニフニ たまご! パッパラフニフニ パッパラほえほえ ゆでなきゃ生たまご パッパラフニフニ パッパラほえほえ パッパラフニフニ ビール! パッパラフニフニ パッパラほえほえ ゆでなきゃ生ビール なんだか ちょっぴり その気になってる アンアン あなたの 瞳 うっとり しっとり ムードをぴったり すりすり しちゃおかな 何にも 知らない うぶな 少女に ヤンヤン 言わせちゃ やあよ ウッフン さいごの 殺し文句は やっぱり あなたからンラララン ランラララン ヤンヤヤヤン ヤンヤヤヤン カムサハムニダ アイムソーリー ランラララン ランラララン ヤンヤヤヤン ヤンヤヤヤン ラオチューカンペー 卒業万歳 七転八倒(しちてんばっとう) 七勝八敗(ななしょうはちはい) 弱肉強食 焼肉定食 あん たまごはダメ 私のもの ヤン たまご! たまご!
385 :
198 :2005/12/02(金) 23:23:27
なるほど。有耶無耶のうちに誤魔化してしまおうという魂胆ですな。
根拠は?
ねーよwwwwwwwww
なあに、198の真似をしてみただけさ。
いや、385は本物の198だ。
根拠は?
この一週間のこのスレ流行語大賞は決まったな
パッパラフニフニだな。
>>392 =198
なるほど。有耶無耶のうちに誤魔化してしまおうという魂胆ですな。
シェルスクリプトをシェルとか言うやつは、
シェルを書けるようなレベルにないので。
>>376 のいうように、IT土方。
まあ、文脈で分かるけどね。気にはなる。
必死だな。( ̄ー ̄)ニヤリッ せいぜい、2chで吠えてればいいんだよ。キモヲタは。 人と話す時に、シェルで書くって言われて、どうせリアルじゃ否定できないくせにw
根拠は? っていいかげん芸がないか。まるで198みたいだ。 まあ、客が言ってるからそれに合わせるってのは、リーマン的にはおk でも、それが正しい/好ましいかどうかは別問題だし、 ローカルなルールがどこでも通じると思うのも間違い
言葉を正しく使えない奴がシェルスクリプトを 正しく書けるんだろうか。 #!/bin/sh とか書いておきながら bash の文法で書いてそう。
システム屋だよ。「俺は」そうは略さないが、bashのことを shと呼ぶ人は本当に多い。 こっちも面倒だから、仕様書のような正確性を必要とする文書の中で 使われているのでなければ、一々指摘しない。 って言われるぞ。
そもそもLinux系では /bin/sh = /bin/bashのシンボリックリンク なので、"Linuxについての話の中では"全く問題ないわけだが。 *BSDとか他のUNIX系OSは知らん。
ジャーゴンやスラングの類を全く使わないITドカタの方が珍しい。 Hackers' Dictionaryに乗らないような日本特有の言い回しも多い。 土管屋だの金物屋だの パスを「切る」、ディレクトリを「掘る」、レコードを「舐める」、... インターネットサービスプロバイダは普通単にISPまたはプロバイダと呼ばれるし、 誰もWWWを「ワールドワイドウェブ」とは呼ばない。
シェルでサイトを見るのに、インターネットがインスツールされてなくても いいんですかぁ?というか、UNIXにはインターネットは付属してませんよね?
わかっていってるのとそうでないのでは違うよね。 素人に解説するときはホームページっていうよ。
システム屋が勝手に使う分には結構だが、2ch にまで持ち出さなくても…。 逆に 2ch 語をリアルで喋ってたらキモいだろ。
>>404 「パスを切る」とか「データを吸い上げる」とか言うのにも一々突っ込むのか?
突っ込むとすれば突然関係ないことを語り始めた
>>401 の精神状態についてだ。
とりあえず乗ると載るが区別できないくらい言語能力が足りないのを
ジャーゴンと言ってごまかしている件について。
あのさ、自演か何か若欄がシェルスクリプトをシェルって4でもいいっしょ。 駄目って言う奴は、同定決定 で、scriptの仕様書書いてるやつって、どこの企業?
>>407 そこまで適当に変換されると読みづらいよ
正しく変換する自信が無い時に誤変換でごまかすってのは良くあるよね。 特にDQNの人とか。
漢字書けないってのはまあ今の時代よくある話っちゃあよくある話だけど、 読むこともできないってのは問題だな。
意地でもこの話題でクリスマスまで持ちこたえる。
最初はシェルっていうのに抵抗があったけど、慣れたら気にならなくなった
↑二度と来るな。
416 :
262 :2005/12/04(日) 12:12:28
一週間ぶりに来てみたけど、まだやってんのかよ。 好きに使えっていてるだろ。頭悪いな。
_|: : : :\, . : ´: : : : : : : : : : : : : `ヽ- ―¬ || : : : : : :/: \:./: : : /:/\: : : ヽ:\: : \:.└-- ァ j| / | ¬ : : : : /: : /:. ,:イ:、:// / \: : :ト、: X: ヽ\: : / || \ | ー : : :./:.:.:./:.〃//\':/ \|/: :.}: : ヽ \>||. / ヽ__ぃ . ‐ 7: : :/:.// |/ ̄ ̄ヾ /  ̄ヽハ: : :.',: | || /^し (_ |: : :.|:./ | ○ | { ○ |ヽ: :.|:.| || ナ ヽ ヽ__ | ¬|/ ヽ ノ ヽ ノ ヽN || t」ー (_ / .ス  ̄ ̄  ̄ ̄ | || / / { || /  ̄ ̄ ̄ ̄ ̄ ト. | 〃 o o 入 し / |:i / || : : : ーi. , |:| ,ハ jj _____ 7: : : : ヽ ' |:! /|┘ }}/'  ̄ ̄ ̄`\ 〃 ..厶 -‐''::¨:::ヽ { リ /ヽ┘ /' }' ::::::::::::::::::::::::::::::{. `=ニ二二ニニ= '.::::::::::::::::\ ::::::::::::::::::::/\:\ /:/\::::::::::::::::::\
おれはジルだな。
氏ね
マリオカートをマリオって言うようなもんだな
素朴な疑問です。 シェルを書く時、bash依存の命令を使うとすぐに「bash依存!」と言って叩かれるのに、 makeを書く時、GNUやBSD依存の命令を使っても、別に叩かれないのはなぜですか?
shとbashの違いとかポータビリティとか、 覚えたての初心者だから、言ってみたいんだろ。 makeの違いがわかるような時期にはもうそういうのは卒業してる。
違いのわかる男キタ━━━━━━(゚∀゚)━━━━━━ !!!!
>>421 シェルは手で書くもの。だから書き方に拘りが出てくる。
いろんな場面で即席でシェルを書くこともある。
makeはイマドキ手では書かない。./configureに作らせる。
だから、記述内容について拘らない。
426 :
名無しさん@お腹いっぱい。 :2005/12/04(日) 15:45:10
bash 依存は書いてもいいけど、 #!/bin/sh 指定するなって話じゃないのか。
makeスクリブトの話はスレ違い
makeを書く
そんなにシェル量産するのか?
>>425 「シェルを書く」
じゃねぇ
「シェルスクリプトを書く」
だ
Makefileのことをmakeってゆーな
お前等おもろいな。「makeを書く」が壷にはまりまくり。 次は、「m4を書く」「configureを書く」「configを書く」「perlを書く」 「inetdを書く」「ntpを書く」「namedを書く」「pfを書く」「NISを書く」 「NFSを書く」「UMLを書く」もうバンバンいっちゃうぞ〜。 システム屋ってスゲエなwww
>>416 262:2005/11/28(月) 02:05:41
416:2005/12/04(日) 12:12:28
>一週間ぶりに来てみたけど
438 :
名無しさん@お腹いっぱい。 :2005/12/04(日) 21:46:24
そもそもLinux!=UNIXだしぃー。
まだやっての?このネタ…
運用シェル perlで書いても 運用シェル
1 1.9898 2 1.9900 3 1.9789 4 1.9920 というようなファイル「val」というのがあったとします この中の2列目だけを参照して例えば1.98以上のものが何個あるか数えるというスクリプトを作りたいのですが可能でしょうか? もし可能ならばどのように作ればよいか教えてもらえますか 半日本やらインターネットやら見てもわかりませんでしたので
>>441 小数点を含んだ数値処理はシェルでやるには無理がある。
awkかperlを使った方が早い。ということで、スレ違い。
敢えてやるなら、まず小数点を取り除く前処理して、
readで読んでtestで比較しながらカウンタ用変数をインクリメント、
最後に変数の値をechoかな。
そうでしたか 強引な質問にもかかわらずやり方も教えていただいてありがとうございました
まあ待てよ。 それぞれの数値をbcで判定して結果をもらえば可能。
>>441 cat val |while read aa1 aa2;
do tt=`echo "if( $aa2 >= 1.98){ print 1, \"\n\";} else { print 0, \"\n\";}" |bc`;
if [ $tt -gt 0 ]; then echo $aa1 $aa2 $tt; fi;
done |wc -l
>>442 シェルスクリプトのことをシェルってゆーな
残念、442の用法は間違ってない。
>>447 いや、間違ってるだろ。
小数点のあるなしはともかく、コマンドライン上で数値計算することはありえない。
だから、数値処理の話が出ている段階でシェルスクリプトであることが確定している。
それをシェルと呼んでしまっているから、やはり間違い。
いいからてにをはを勉強してこいと
452 :
名無しさん@お腹いっぱい。 :2005/12/05(月) 21:51:21
#!/usr/bin/sh for fn in ./work/*.JPG do if java Test $fn then echo "This is OK." else echo "This is NG." fi done あるフォルダの中の画像を調べてOKかNGかを判定して表示するスクリプトを 書いているのですが動いてくれません(T_T) JavaのTestというプログラムは判定を行って正しければ System.out.println(0); 正しくなければ System.out.println(1); という命令を実行します.
>>452 標準出力と終了ステータスの違いわかってる?
System.out.println()は標準出力に出すだけで、
終了ステータスとは関係ない。
このままでやるなら、
if [ `java Test $fn` = 0 ]
とかで判定するんだろな。
あと、#!/usr/bin/sh はSolaris依存だから、#!/bin/shと書いた方がいい。
>>452 シェルスクリプトのことをスクリプトってゆーな
456 :
452 :2005/12/05(月) 22:20:31
>>453 ありがとうございますm(_ _)m
自分で試行錯誤してみて完成しました。私の場合は
if [ `java Test $fn` -eq 0 ]
としてみました。
レスの内容からすると私のプログラムはあまり綺麗じゃない感じですね。
判定プログラムは標準出力で終えるよりも
System.exit(0); もしくは System.exit(1);
とした方がよいのでしょうか
>>456 この場合のように、リターンが整数値の判定だけを行うんであれば、exitのほうがいいだろうね。
シェルスクリプトのことをシェルって呼ぶ風習が一部にあるのは知ってたけど、 実際にそういう風習のある部署に来たてみたら、 「シェルを削除しといて」ってさらっと言われたりするのが不思議なかんじ。
さらりと削除して「業務命令ですから削除しときましたっ」っていっとけ
シェルってのはシェルのことなんだよ。それだけのことだ。
シェルがどうのこうのと話してると思ったら、セルのことだった そんな経験はありませんか?
セルビデオのことをセルってゆーな
ワロス
>>452 なぜそのJavaの中で直接
System.out.println("This is OK.");
System.out.println("This is NG.");
とやっちゃダメなの?
わざわざシェルで受ける必要ないじゃん。
>>465 おまえ、頭の固いやつだな。
質問用に要件を絞ってるんだろ。
>>465 JavaスクリプトのことをJavaってゆーな
VisualBasicをVisualと呼ぶオレ様がやってきましたよ
おぉ、ビジュアル系プログラマーか。聞いたことある
だが見たことはない
>>465 ていうか
>>452 だと1ファイル毎にいちいちクソ重いJVM起動しないといかんのが癌だ。
俺の好みから言うと、引数でファイルのリストを渡せるようにして、
各ファイル毎に処理して
ファイル名1 OK
ファイル名2 NG
のような形式で結果を標準出力に出力するようにJavaプログラムを組んだほうがいいと思う。
すいません。ちょっと教えて下さい。 空白を含むテキストファイルを 1行ずつ読みこんで処理したいんですが、 for line in `cat filename`とすると、 各行の最初のスペースまでしか$lineに入りません。 for line in "`cat filename`"とすると、 今度は全行一度に$lineに入ってしまい、 各行毎に処理することができません。 何かいい方法はありませんでしょうか?
while read line; do echo $line done < filename
474 :
472 :2005/12/06(火) 20:08:15
>>473 どうもありがとうございます。
ちょっと今試せないので、後で試してみたいと思います。
>>471 JVMが糞重いのはあなたの環境が糞まみれだからです
あ、そ。ならJava製のechoコマンドでも作って今度からそれ使えば?
lsがjavaの方が効きそう
一度でいいから見てみたい Javaで書かれたXサーバ
結構有名なのにな。
もう煽り合うのやめてください。 お願いします。 少しの人間のプライドとエゴでスレを汚さないでください。 うううううううう。
エゴエゴ
>>475 欲嫁。
>>471 は「JVMが」重いとは言っていない。
「JVMの起動が」重いと言っている。
だから、シェルから毎回ファイル毎にJVMを起動するのが重いから、
JVMの中だけですべてのファイルに付いて(ファイルリストで)
処理した方がいいと言ってるんだよ。
「JVMの起動が」重いのは、現在のJavaの最新版+ハイスペックマシンでも
変わっていない。
>>483 氏ね。
「シェルを書く」を徹底的に叩く高尚なスレに、
Javaなぞ低級品の話を持ち込むな。
>>484 > 「シェルを書く」を徹底的に叩く高尚なスレに、
mkdir my-shell; cd my-shell
vi parse.y
vi main.c
vi Makefile
make
とかやってると叩かれるんですか?
それは「シェルを書こう」スレあたり作ってそっちでやらんとここでは叩かれる
>>484 Javaはコンパイラ言語。
シェルはインタラクティブ言語。
一般に、コンパイラ言語とインタラクティブ言語を合わせて
高級言語と呼ぶ。よってJavaも高級言語。
それを低級と呼んでいる
>>484 はヴァカ。
>>487 お前こそ、日本語をきちんと理解できない、かたわ。
うわー…下手な釣り…びっくりした。今時珍しいぞこんなの。
みんな見ろよ
>>487 を
>>487 Javaはインタープリター言語だろ。
自力で実行できないわけだし。
VMタイプのをインタプリタというのはちょっと違うと思う。 Javaコンパイラは仮想計算機用のマシン語コードを生成する。 つまり、そのマシン語を解釈できるようなハードウェアならば、 直接実行できる。そうでない一般的なハード上ではVMやJITのような 仕組みを使うわけだけれども。
通常
o 入力ストリームを逐次実行するのがインタプリタ
o なにがしかのマシンコード(VM含む)に変換するのがコンパイラ
なわけだが,
>>487 高級言語の定義が滅茶苦茶だってのは認める.
ちなみに
>>487 はインタプリタとは言ってない件に関してひとこと > 490
どう見ても釣りです。 本当にありがとうございました。
まあJavaじゃなくてもプロセス起動は遅いからねえ。 for i do sed 's/foo/bar/' $i > $$ mv $i ${i}.bak mv $$ $i done みたいなラッパーループを使うよりは perl -pi.bak -e 's/foo/bar/' * の方が格段に速いし。 あまりツールボックスアプローチ的ではないかもしれないけれども。
>>494 単なる外部コマンドの起動と一緒にしちゃいかん。
javaの起動は別段重い。
sedやmvの起動とは比べものにならない。
sedやmvは、シェル内部コマンドよりは遅いというだけで、十分使えるが、
javaを起動したりすると使いものにならん。
>>495 いやそれは十分わかってるよ。だから
>>471 のように書いたのだけれども。
ま、findやxargsのようなコマンドとの相性もいいし、最低限ファイルのリストを処理できるように
しといたほうが何かと便利だよね。
おまえらバカだねー そんなに気になるならクラスローダを書けばいいじゃん
>>497 スレタイ100回嫁。
ここは「シェルスクリプト」のスレであって、あくまでシェルのツールボックスの
一つとしてJavaプログラムを組み込む際の一般的な相性の悪さ/問題について
論じられているに過ぎない。
それに、
>>452 を複数ファイル対応に改造するのと、カスタムのクラスローダを
記述するのとどちらが効果が高くて楽だと思う?
>>497 はクラスローダをシェルスクリプトで書くつもりだよ。 多分
500 :
名無しさん@お腹いっぱい。 :2005/12/08(木) 00:01:07
×「シェルスクリプトで」 ○「シェルで」
朝来たときに仕事終わってりゃ良いのでどうでも良いです。
キリ番とりつつ「シェル」ゆうなクズ。
シェルウィーダンス?
日本unix界の人材における停滞とマンネリぶりを このスレの実によくあらわしてるな。
ま、とりあえず「てにをは」を勉強しなおそうな。
>>496 xargsは仕様バグがあるので使っちゃいけないコマンドなわけだが・・
今時の xargs は -0 があるから、その問題は回避できる。 xargs に -0 のない OS では、GNU の奴を入れるべきかも。
>>506 その使用とやらの影響しない範囲での使用ですが遣っちゃダメなんですか?
xargsの仕様の問題を避けてきちんと使える奴は、「使っちゃダメなんですか?」 とか質問しない。なぜなら、使って良い場面か悪い場面か自分で判断できるから。 使っていいか悪いか質問する奴は、その時点でもうxargs使っちゃいけない。 なぜなら、仕様の問題を把握できてなくて、自分で判断できてないということだから。
>>508 処理するファイル名に仮定を置けるんなら、別に使ってもいいでしょ。
毒のないフグは食べてもいいというのも知恵なら、 毒のないフグだとは思うけど念のため食べないというのも知恵というものだろう。
>>512 毒がない部位を食べるつもりなんですが食べない方が良いですか?
つまり
>>506 は正確な判断ができないわけですね。
>>514 ちがう。まともなシェルの1つも書けないゴリラ以下の知能の持ち主。
ググっても man を読んでも xargs のバグの解説が見つからない。 教えてえろい人。
('A`)エェー
ファイル名にスペースやタブが含まれてると、そこで別のファイル名に 分離されてしまって正しく動かないという問題だよ。 *BSD や Linux なら、find では -print の代わりに -print0 を使い、 xargs には -0 オプションをつければ問題を解決できる。 常にそうする癖をつけてれば、念のためとか考えなくていいから簡単。 商用 UNIX で、これらのオプションがない場合には、GNU のをインス トールして使うのがいいと思う。xargs 使わずに個別にコマンド起動 すると、かなり遅くなるので。
8つぐらい走らせたいプロセスがあるのだけど。 CPUが4個あるマシン使ってるので、一度に4つ起動したいのだけど、なにかうまい方法ある? A、B、C、D、E、F、G、Hとプログラムがあるとしたら 最初ABCDを起動させて、どれか終わったらE、さらにどれか終わったらFを実行する…って感じ。
521 :
:2005/12/09(金) 02:20:43
make
makefile に依存規則を書いて make -j4 ですな。 I/O 待ちの空き時間を有効に利用するには、make -j6 ぐらいが いいかもしれん。 *BSD か Linux ならデフォルトの make で OK だけど、商用 UNIX だと並列機能がない make が入ってる場合があるから、そういう場合 は GNU make あたりを入れるて使うように。
4CPUあれば、8つ同時に投入ぐらいなら、それほどオーバヘッドは ないだろうけどね。ただし、8プロセス分の、十分なメモリがあれば の話だけど。メモリを溢れてページングしだすと極端に遅くなるから。 A & B & C & D & E & F & G & H で済むので簡単。
IOがそれほどないプロセスだったら、4並列が最適かも。
FUDを使って布教しようとするGNU者が居ます。
えー、FUDってなによ。 てゆーか、自分では GNU者じゃなくて、NetBSD者のつもりなんだけど… UNIXでしか使ってないなら、空白入りのパス名なんて作る方が悪い→終了 で済むことも多いけど、samba で Windows のファイルサーバとかやらせ てると、ユーザが勝手に作っちゃうからどうしようもないのよ。
何だかんだいって、GNU のツールの拡張機能は便利なものが多い。
GNU以外の、たとえばSolarisのxargsに-0が実装されるまでは xargsは封印(使用禁止)にする、でFA。
> Solarisのxargsに-0が実装されるまでは 条件が抜けてる 1. そのスクリプトを、-0 をサポートしてない商用UNIX上でも動作させる必要があり 2. その商用UNIX上にGNU のツールをインストールできない、やむをえない事情があり 3. そのスクリプトを走らせる環境で、空白を含むパス名が使われている (例えば samba サーバを走らせている) 可能性を考慮すべきであると考えられる場合 に限ってなら、FA。 上記の条件の一つでも欠けていれば、FAじゃあないねえ。
ソラリスで-0が未だに無いのは、つまり無くても困らねってことだ
同じく Solaris に xargs コマンドが存在するのは、xargs コマ ンドが必要だからだってことだな。 つまり、xargs 使用禁止ってのは自己矛盾した規則だってことだ。
>>531 単にPosix2やらUNIX98やらの標準規格への適合性の問題じゃないの。
ま、使いどころ間違えなければ便利なコマンドなのは間違いないんだけど。
$ touch a\
-r
のようにして、xargs rmとかに渡すと危険なことが起きかねないファイルを作るのは簡単だ。
でも、その問題なら Solaris でも「… | xargs rm --」とすれば回避できる から、-0 オプションなんてなくても大丈夫だよ。
じゃ
>>532 にインスパイア(wされて、
% touch a\
../なんとかかんとか
とかは?
という風にさ、色々なケースを一つ一つ細かく潰さなきゃならないところが問題。
しかもuniversalな解決法がないからxargsを使う場面場面ごとに毎度考察が必要。
そりゃ、個々のケースはそれぞれ
>>532 のように潰していけるんだろうけどさ。
universal な解決法がないから使っちゃいけないって阿呆かねwww 場面ごとに考察して、問題がなければ使えばいいだろ。 細かいことでガタガタ抜かすなよ。
商用 UNIX 以外のプラットフォームなら xargs -0 <command> -- で、十分 universal な解決法なんだけどね。 まあ、そのうち Solaris の xargs にも -0 が入るんじゃないの。
やってみれば分かるけど、
>>534 は勘違い、というか、
その touch コマンドは失敗します。
理由は、「/」は常にディレクトリの区切りと解釈されて、パス名の
中に含むことはできないから。
(もちろんカレントディレクトリ直下に「a改行..」という名前の
ディレクトリがあり、そのディレクトリへの書き込み権限があれば、
touch はできるけど、そういう意味じゃないよね。)
だから、
>>532 のような方法は、たとえ Solaris であっても「rm --」
のように常に「--」を使う習慣さえつけていれば、touch コマンドを
実行した人が書き込みを行なえるディレクトリ以下に対してしか影響
を及ぼさないので、普通の運用では、セキュリティホールには入らない
と思う。
話は少し変わるが、 (古い?)Solarisの rmって、-- が使えないんじゃなかったかな? なので、常に rm -- とする習慣を付けるのも万能ではないから困りもの。
Solaris 1 ならともかく、Solaris 2 なら全て「--」をサポート してるよ。Solaris 2 の元になった SVR4 が「--」をサポート してるから。 さすがに Solaris 1 (SunOS 4) はもう end of life です。
まとめると 1) 空白含みのファイル名に対応するにはfind -print0とxargs -0を使え(findとxargsが対応さえしてれば問題ない) 2) オプションに見えるファイル名に対応するには -- を使え ってことか。--使えないコマンドには、ファイル名に仮定が置けないならば xargsは使えないってことになるのかな。
> --使えないコマンドには、ファイル名に仮定が置けないならば > xargsは使えないってことになるのかな。 そうでもないでしょ。 rm は副作用が致命的だから -- つけて気をつけないと いけないけど、もし xargs で実行するコマンドが rm じゃなくて du -s だったら特に問題は起きない。 まあ、いまどき -- に対応してないコマンドは、標準コマンドには ほとんどないと思うけどね。
セキュアでポータブルなシェルスクリプトってのは作れないな。
セキュアでポータブルな……何だって? シェルスクリプトなら簡単だよな。書くときに気をつければいいだけ。 シェルなら今のシェルでもセキュアだよな。セキュアじゃないのは 実行されるコマンドなわけで。
任意のコマンドが実行できる時点でセキュアでない。
その論法はおかしい system(3)のようなのがある言語はすべてセキュアでない,ということになるな. まぁ,実際この世にセキュアな言語などというものが存在するのかが謎だがな.
>>545 perl4本の用語解説をインスパイアしたような流れだな...
>書くときに気をつければいいだけ。 きっとここに突っ込んで欲しかったんだろう。
いわゆるバッドノウハウの総本山みたいな感じ?
setuidされてなければ大丈夫
>>545 >system(3)のようなのがある言語はすべてセキュアでない,ということになるな.
その通り
551 :
名無しさん@お腹いっぱい。 :2005/12/10(土) 17:14:44
馬鹿晒しage
552 :
名無しさん@お腹いっぱい。 :2005/12/10(土) 17:15:26
553 :
名無しさん@お腹いっぱい。 :2005/12/10(土) 17:25:44
Solaris8の/bin/shの変数の挙動について教えてください。 COUNTという変数があって ---- COUNT=0 ・・・0で初期化 while ほげ do : (whileループ中にカウントアップ処理) echo "COUNT=$COUNT" ・・・・(1) : done echo "ループ終了後のCOUNT=$COUNT" ・・・・(2) ---- という処理を実行させたところ、whileループ中の(1)の処理では 正常にカウントアップされた値が表示されるのですが、 ループ終了直後の(2)の値は、何度実行させても0になります。(;´Д`) こうなる原因はなんでしょうか?また改善方法についてヒントをください。 おながいします。
557 :
554 :2005/12/10(土) 23:17:02
>>555-556 ありがとうございますた。
とりあえず下記のサンプルで試してみました
パターン1
----------------
#!/bin/sh
COUNT=0
while read i
do
COUNT=`expr $COUNT + 1`
echo "now count = $COUNT"
done < /etc/passwd
echo "Last count = $COUNT"
----------------
パターン2
----------------
#!/bin/sh
COUNT=0
cat /etc/passwd | while read i
do
COUNT=`expr $COUNT + 1`
echo "now count = $COUNT"
done
echo "Last count = $COUNT"
----------------
558 :
554 :2005/12/10(土) 23:17:33
パターン3 ---------------- #!/bin/sh COUNT=0 exec 9<&0 < /etc/passwd while read i do COUNT=`expr $COUNT + 1` echo "now count = $COUNT" done exec 0<&9 9<&- echo "Last count = $COUNT" ---------------- そうしたら、パターン1とパターン2のLast countは0のままで、 パターン3は正確な値がでました。 ちなみにパターン1のシェル指定を/bin/bashに変えたらあっさりと 正確な値が出たので、とりあえずはbashで逃げることにします。(;´Д`)
bourne シェルの有名な欠点だな。 kshにすれば、パターン1もパターン2も値を引き継げる。 ちなみに、bashは変態仕様なんで、 パターン1は値を引き継げるけど、パターン2はダメ。
561 :
:2005/12/11(日) 01:56:05
うん、Solaris決め打ちでいいならkshにすべきだよね。
zsh も、ksh と同様パターン1〜パターン3全て動くんだよね。 ksh だと対話的に使った場合の機能がちょっと足らんという場合、 bash を使う人が多いんだけど、zsh の方が幸せだと思う。 スクリプトで使う場合には、ksh の方が小さいからいいだろうね。
>>560 bash はパイプライン中に変数を定義しても
ダメみたいだな。
$ bash
$ a=1
$ echo $a
1
$ ls | a=2
$ echo $a
1
kshって昔からSolaris(というかSVR4)に入っているのに あんまり使われてないね。 メニュー表示(select)とかシェルスクリプトに向いてる機能があるのに
565 :
554 :2005/12/11(日) 10:43:33
コメントありがとうございます。 bashにもそういうクセがあるとは知らなかったし、Solaris標準のシェルであれば 何でもいいので、kshかzshを使ってみようと思います。
zsh は Solaris 標準じゃねーぞ。 今は勝手に入ってることが多いのはたしかだけど、 インストールのしかたによっては zsh は入らないこともあったはず。
でも、この例題だったらwcを使う。
ジャー、ゴボゴボ
>>564 kshは結構つかわれていたよ。
売り物ソフトのインストーラーに利用されていたりして。
結構っつうか素人と日本とかFreeBSD界隈以外はシェルといえば普通はkshのこと。
('A`)エェー
SunOS4.x使ってたけど、cshだった。
シェルと言えば宮沢ミッシェル(*´∀`)
>571 それはないな。 インストールスクリプトがkshスクリプトになってヴァーとかあったが、 普通はkshなんて思ってるのは中の人だけ。
「自分はこう思う」ということだけを理由にして、 他人を納得させられるとでも思っているのか?
自分の普通が他人にも普通とは限らないと思ってればいいよ。
CDEの標準シェルはksh
商用UNIXのほぼ100%でkshが標準。POSIX標準シェルもほとんどkshと同じ。
つうかkshがPOSIX標準になったって感じかな。
kshが標準に思えないやつは
>>571 でも言及したとおりただのアマチュア。
今や商用UNIXなんて、シェア食われてるだけのガラクタじゃないか…。
商用UNIXだけがプロ志向と考えるなら正しい だがその前提がありえない
kshからポートされたものにシェル関数があるんだけど、否定者はこれは使わないの?
kshも使うことあるけどさ... シェル関数は、使う前にポータビリティその他のバランスをよく考えるようにしてる。 避けてはいないけど、結果として滅多に使わないことになる(当社比)。 関数使うような場面では、perlに行っちゃっていい場合も結構あるし。
すいません、教えてください。 test_N.txt foo_N.txt bar_N.txt を test.txt foo.txt bar.txt にリネームしたいんですが、どうすればよいのでしょうか? なんかすごい簡単そうに出来そうなんですが、挫折しました_| ̄|○
まぁいろいろあるだろうが、 expr $i : hoge でどう?
for f in *_N*; do mv $f ${F%_N*}${f#*_N}; done てのはどうかな。
とあるjavaプログラムをcronで実行する為のシェルを作成しようとしています。 通常に何も考えなく実行するとCLASSPATHが通っていないため、実行できませんでした。 でためしに CLASSPATH="目的のパス" を追加してみたのですが、同シェル内のenvで吐き出してみても確かにCLASSPATHの環境が入っていません。 入れる方法ってどうしたらよいのでしょうか
最善の方法ではないだろうけれど、一番最初に思いついたのは for file in *_N.txt; do mv "$file" "$(echo $file | sed 's/_N.txt$/.txt/')"; done 展開とかはどうにも覚えきれない。
>>589 スルーすべきところはスルーするとして
とりあえず java -help かなにか見れ。 -cp だとか -classpath とかオプションがあるから。
スルーできない俺はどうすればいい?
593 :
586 :2005/12/15(木) 18:53:41
>>586 マジレス。perlのrenameスクリプト使え。その用途では超便利だから。
rename 's/_N//' *_N.txt
でオシマイ。
>>586 rename _N "" *txt
おまえらバカかぁ
>583は大嘘なのだが、なんで585以外誰も文句いわんのん?
いやまあ「583が嘘」と信じるに足る資料でもあれば いっしょに文句言ってあげるよ、585さん。
kshこそがUnixのシェルにふさわしく正しいシェル。 プログラミング言語としても最も一貫性が高く確実な動作が期待できる。 bashやzsh、tcshにはFreeBSDに似たうさんくささが漂いまくっている。
プログラミング言語としてはrcの方が上だな
俺はSolarisユーザなんだが、kshが一番標準(POSIXとかSUSとか)への準拠度が高い。 これは他のプラットフォームでも当てはまるのかな?
>>601 つうかkshがPOSIX標準に昇華したのが実情。
一人で頑張ってるな。
ま、俺は /bin/sh か bash を使うけどな。
bash(笑)
スクリプトでもzsh使ってるな。 インストールできない環境では仕方なく bashかshとなるけど。
おれもボーンしか使わない。他のなんかあり得ない。
スクリプト書くならshだな。 普段はbashかksh
609 :
名無しさん@お腹いっぱい。 :2005/12/16(金) 22:02:45
でも sh だけだと機能が足りなくて記述しにくい場合があって、 そんなときは、zsh や非標準的なコマンドをつかいまくるときがある。
610 :
585 :2005/12/16(金) 22:58:49
ばわ。忘年会終了っと。
んじゃ、事実の列挙いきます。
まずは
http://en.wikipedia.org/wiki/System_Vを見ろと 。
shell functionはSVR2 1984から実装されました。
kshが一般にでてきたのはkshがSVR4に付属してから。
SVR4のリリースは1990です。
なのにshell functionがksh由来と誤解してる人が多い理由は、
BSDの元になったSystemIIIでは、shell functionがなかったせいかと。
BSD系を使っていた人は、1990年にはいってSVR4系のSolarisやOSF1を使って
初めてshell functionに触れたわけです。もしくは、kshの亜流で触れたか。
そんなわけでksh=shell functionの源流と誤解する人が続出。
ただ、問題の焦点になってるkshと/bin/shでどっちが最初にshell functionを実装したか?
っていう点だけに絞るとちょっと微妙。というのも、誰も最初にfunctionを実装!とか言ってないん
だよね。kshは1983年に実装された奴が最初の実装。SVR2の/bin/shは1984年リリース。
もしkshがfuncionを最初に実装してたら・・・みたいな。
まあ、kshは1983年の実装で世界で最初にtty editingでviモードとemacsモードを
用意したシェルだ!とか叫んでるわけで、、、もしfunctionを最初に実装してたなら、
黙ってるわけ無いよな。pgr。という感じかな〜。
失敗。俺は585じゃないぜ。597=610だ!くそ。598め、引っ掛けかよ!
びっくりした俺が本物の585。
> BSDの元になったSystemIIIでは これだけでお前の話は信用できないことがわかる。
あはは。Version 7とかいった方がよかったかな。 ググってたら/bin/shについてはBSD系で利用されてるshの元はSystem IIIという 記述がでてきたのでそのまま引用しちゃったよ。間違ってると思うなら、否定じゃなくて、 「訂正」よろ。
615 :
名無しさん@お腹いっぱい。 :2005/12/17(土) 00:36:00
boneとbash知ってれば良いでしょ。 それでなくても少ない飯の種。 シェルスクリプトを仕事で書くことも限られている。数はどんどん減っている。 Linuxに注がれる税金で食っていかないなど信じられない。
> kshが一般にでてきたのはkshがSVR4に付属してから。 そうだっけ? SVR4 よりもはるかに前から、ベル研がUUCPでソースを配ってた ような…
> boneとbash知ってれば良いでしょ。 boneじゃなくて、Bourne sehll だよ。 ポータビリティが必要な場合のために、Bourne shell の知識は確かに必要。 そうじゃない場合には、bash よりは ksh や zsh の方が好きだな。 zsh と比べて bash の利点って、なにかあったっけ。特にない気がする。
つまり、車はトヨタ、CPUはインテル、OSはWindowsってタイプの 人が bash を選ぶと。(ぉ
bone<ハズかシス(=///∇///)ゞ
仕事上必死こいてUnix(Linux)勉強しとりますが、想像してたより遥かにWindowsばっかり。
今の職場を離れたら何処で技術を生かせばよいのか・・・
勢いでLinuxを入れてしまった自治体以外に、10年後もうシェル餌は無いのではと思います。
>>621 Linux様が仕事を与えてくださる以上、そこに文句をいうなど信じられませぬ。
ただまあ職場にはWindowsは当然のこと、HP-Unix、FreeBSD、Linux、更には汎用機(へのアクセス環境)まであるんですが・・・
10年後、だれがこれ、管理するんだろう?
おまいら、せめてスクリプトはBourne shellで書いてください。
>>619 bashの利点は、Linuxが動いていればおおむね入っている。かな。
ほとんどの Linux ディストリでは、zsh もデフォルトで入ってると思うが。 RedHat, Fedora Core, SuSE、どれも特に何も選ばなくても最初から入るぞ。
Linuxzaurusや玄箱、CobaltRAQなんかのLinuxは標準状態ではbashはあるけどzshはないかな。
>>624 それ全部rpm系のディストリビューションだから列挙の意味がない。
SuSEは微妙に違うけど、FCとRedhatはほぼ同じだし。
Redhatって最低限のパッケージ選んでもzsh入ったっけ?
> それ全部rpm系のディストリビューションだから列挙の意味がない。 rpm かどうかって、パッケージシステムの違いであって、 パッケージの取捨選択とは独立でしょ。 Fedora Core と RedHat も相当違う。
スレ違いもいい加減にしろや。ここはkshのスレだ。
>>619 >zsh と比べて bash の利点って、なにかあったっけ。
bashはあくまでBourne Shellの上位互換になっている。
Bourne Shell用のスクリプトはすべてbashでも動く。
しかし、zshは機能拡張の際に上位互換性(の一部)を犠牲にしたので、
Bourne Shell用のスクリプトの一部は zshでは動かない。
なので、あくまでBourne Shellの拡張と言う立場を守るなら
bashが優位。
zshはあくまで独自拡張シェル。
bashはposix shellの拡張だ、ボケ。 bourneは実装によって区々だから、全てのbourne スクリプトが、bash上で動くとは限らない。
>>630 結果的にbashはBourne Shellの上位互換性が保たれてるよ。
厳密には、ブレース展開がデフォルトで非互換だから、
set +B して、ブレース展開を無効にすると完全互換になる。
zshの場合は互換性はない。
おまいら ^ がパイプだったころを思い出しながらスクリプト書いてまつか?
今でもパイプは^ですが
> 結果的にbashはBourne Shellの上位互換性が保たれてるよ。
これは嘘。
bourne shell にはいろいろ変種があるので、その全てについて
互換性があるとは限らない。
> zshの場合は互換性はない。
これも嘘。
現時点で、bourne shell とは何かを定義するなら、POSIX の
/bin/sh の仕様とするのが妥当だが、
http://pc8.2ch.net/test/read.cgi/unix/1131026501/556-563 を見ても分かる通り、zsh は POSIX 互換だが、bash は非互換。
すなわち、bourne shell との互換性を重視するなら、zsh を
使うべきであって、bash は捨てないといけない。
>>634 >現時点で、bourne shell とは何かを定義するなら、POSIX の
>/bin/sh の仕様とするのが妥当だが、
ここに理論の飛躍がある。
長年使われてきた多くのUNIXの/bin/shはPOSIX互換ではない。
しかし、これが事実上の/bin/shとして業界標準的に定着している。
bourne shell とは何かを定義するなら、POSIXではなく、
事実上定着している/bin/shの仕様と考えるのが妥当。
逆に、POSIX互換にすると事実上定着している/bin/shとは非互換になる。
そういう意味で、bashは/bin/shの上位互換。
zshは非互換。
だから、スクリプトならkshをつかえよ。
> bourne shell とは何かを定義するなら、POSIXではなく、 > 事実上定着している/bin/shの仕様と考えるのが妥当。 そういう意味では、bash も Bourne shell 互換じゃないね。 たとえば Bourne shell では「~user」は single quotation をつけなくても「~user」そのままと解釈されるされるが、 bash だと「/home/user」のように展開されてしまうから 互換性がない。 これに限らず、bash が Bourne shell と互換性がないところは いくらでもある。zsh が Bourne shell と互換性がないという なら、それは bash でも同じ。
>635 bash使ったことないだろ? あれ使った経験があって上位互換だなんて寝言が言えるならマジ尊敬するよ。
bash 使ったことがないんじゃなくて、むしろ、本物の Bourne shell を使ったことがないのでは? bashism (ないし bashizm) って、良くバグレポートのタイトルにも なってるぐらい有名だよねえ。
>>637 Bourne shでは ~user のような記述はしないし、
たまたまチルダーがそのまま文字列に使われる確率も低いので、
その点は問題にならない。
しかし、zshでは変数の展開時の解釈が変わってしまったので、
この点が大きな問題になる。
たとえば、
var='hoge hage'
と代入した後、
some_command $var
という記述があったとすると、
zshでは$varの展開でhogeとhageが分離されず、
スペースを含めてそのまま1個の引数として解釈される。
つまり、zshの$varは、Bourne shの"$var"に等価なわけだ。
なので、あえてダブルクォートせずに$varで解釈させたい場合、
そのBourne sh用のスクリプトをzshで実行すると期待通り動かない。
しかし、bashなら問題なく動く。
コマンド名を sh として起動した場合、zsh は、その変数展開の 解釈についても、自動的に Bourne shell 互換になるよ。 zsh として起動した場合も、.zshenv に setopt SH_WORD_SPLIT と書いておけば Bourne shell 互換になる。
>>641 その点ならbashも同様の"はず"だが。
>>641 裏を返せば、コマンド名shでzshを起動するなどのことを
明示的にやらないとBourne shell互換ではないってことだね。
(bashだと、コマンド名bashで起動しても互換だけど)
で、実際問題zshをshの代わりに使うためには sh -> zsh の
symlinkが必要だと思うが、sh -> zsh などというリンク張ってるホストは
見たことないな。
sh -> bash ならよく見るけど。
シェルスクリプトのスレなんだから、シェルの優劣の宗教論争なんて ほかのスレでやってくれ。
>640 ? >641 ! zsh使っててsetopt SH_WORD_SPLITしてない奴がいたのか。珍しす。 そのオプションの存在すら忘れるくらいずっとONにしっぱなしだぜw ま、非互換ってことでいいよ。zshは非互換。>631がいってるみたいにbashも非互換。 仲良くやれよな。
>>645 setopt SH_WORD_SPLIT しちゃったらzsh使う意味が半減するじゃん。
いちいちダブルクォートしなくても変数が使えるのが
zshのメリットのひとつだろ?
>symlinkが必要だと思うが、sh -> zsh などというリンク張ってるホストは >見たことないな。 MacOSX 10.[01]
つまりkshを使うのが常人ということだな。
651 :
名無しさん@お腹いっぱい。 :2005/12/18(日) 06:46:21
空白を含むパスにおいてあるコマンドを実行するにはどうしたらいいのでしょう? #! /bin/sh ... netSDK="/c/Program Files/Microsoft Visual Studio .NET 2003/SDK/v2.0/Bin/" ... try_execute (){ echo "Trying execute: $@" >> $config_log $@ >> $config_log 2>&1 ret=$? echo "Execution status code: $ret." >> $config_log return $ret; } ... try_execute "\"${netSDK}ildasm.exe\" /?" ... Trying execute: "/c/Program Files/Microsoft Visual Studio .NET 2003/SDK/v2.0/Bin/ildasm.exe" /? ./configure: "/c/Program: No such file or directory 低脳bash('A`)
自分の無能をbashのせいにするなよ。
654 :
651 :2005/12/18(日) 07:38:13
ryoukai!!
>>651 $@ >> $config_log 2>&1
のところを、
"$@" >> "$config_log" 2>&1
にすればいいだけの話。
変数参照時は、常に " " を付ける癖を付けろ。
今や空白を含むパス名は日常茶飯事だからダブルクォートは必須。
>>653 bash依存の話題じゃないのでこのスレに書いていいんだよ。
でもまあ #! /bin/sh ではじまってbashという質問者さんは 向こうでやった方がなにかと幸せになれると思ふ
>>647 本当? sh -> bashじゃないの?
>>655 だね。
zshの件にしても、Bourne Shell互換で使うにはbash/zshのどちらが
適しているか、という話題なので、このスレに書くべきだ。
(bash/zsh依存の話題ではない)
>>653 は余計なお世話ということでFA。
向こうだってシェルスクリプト総合スレなんだから、 こちらに書く「べき」なんてロジックはどこからも成り立たないだろう。 658は妄言ということでFA。
それにしても
>>653 の理由にはならないけどな。
互換ってことだけいうと、bashはどれだけ互換モードで走らせても 動作しないシェルスクリプトがある。そのせいでashとか作るハメに なってる。ditributerもbashじゃ駄目だと認めてるわけね。 一方経験上zshのsh互換モードで動かなかったことはない。 俺はzshを押すな。まあ、/bin/shがbourne shellな普通のシステムには 関係ないことだけどね。linuxとかashが存在してるのにデフォのshは 互換性に乏しいbashのまま。一度bashを標準にしたから元に戻せない ってことなんだろうけど、馬鹿だよな。
そこで経験上とか言っちゃうと説得力がないので具体例をおながいします。 shの互換性チェックスクリプトとかどっかないんだろうか。ありそうなもんだけど。
>>651 一行目が間違っている。
正しくは
#!/bin/ksh
だ。
>>662 POSIX.org から互換性検証プログラムを入手してチェック。
>664 どこから落とすの? あそこ見づらくてよくわからないからもうちょっと詳しく
年寄りは、bashつかえないんだよ。 新しいことにもついて行けないじじいたち...かわいそす
シェルスクリプトの互換性についての議論スレはここ?
今やってるのはシェルの互換性だろ? シェルスクリプトの互換性っていうと、このスクリプトは Solarisに持ってっても動くか、とかそういう話になる。 個人的には後者はこのスレの範疇だけど前者はスレ違いのような気がする。 bashやzshや俺様専用シェルを開発してる人のスレってわけじゃないから やったとしても建設的な結果は得られないだろうし。
>>661 >ashとか作るハメになってる。
それは違う。
ashがあるのは、起動フロッピーの中に入れるため。
bashの互換性の問題ではない。
でも、最近はもうフロッピー起動なんてしないし、
CD起動またはUSBメモリ起動が当たり前になったから、
ashの役目も終った。
事実、Fedora Coreとかではashは削除された。
bashがあればすべて桶。Bourne Shell互換完璧。
互換完璧ってwww つい先日もなんかのメイク用スクリプトで行末に空白があったから bashが乗ってるLinuxじゃ動かなくて、スクリプト修正するハメになりましたが?
オヤジ臭が漂うスレでつね。
確かにbashの狭い世界に固執するのは年寄りくさい。
tclsh
>>670 その行末の空白にどんな存在意味があるのかを問いたい。
>674 存在意味の無い空白があるぐらいで動かなくなるbashのどこが互換だと問いたい。
>>675 全角空白だったとか改行コードが違ったとかじゃないよな?
どんなスクリプトか、ぜひ見せてくれ。
真面目な話、bashは本当に互換性バッチリだと信じて そういう質問をしてるわけ?釣りじゃなくて? 普通にbashが/bin/shなLinux使ってりゃ(使わされてりゃ)、 非互換問題に日々遭遇するだろうに、そんな状況で目を キラキラさせてbashは互換なんですとか言ってる奴は 全員釣りだと思ってたよ。 何でエラーが出たかは覚えてないけど、多分まだtarファイルは 消さずにおいてあるから調べりゃ見つけれる。覚えてたら 調べとくわ。
>>677 俺は bash と sh の互換性にはあまり興味が無い。
単純に
>>670 のエラーの原因が何なのか
興味が湧いたから俺も検証したくなっただけ。
そういうわけで、気が向いたら
>>670 のソースよろしくな。
bash/shの非互換性かあ。まとまったら結構いい資料になると思うなあ。 bashのtype -pは便利だけど少なくともSolaris /bin/shで動かない。 bashのechoが-nを受け付けるのはPOSIX的におかしい。 bashでexport VAR=VALUEと書けるのは悪くない(POSIXで許されてる)。
自作のスクリプトをソラリソに持ってったらじぇんじぇん動かなくて結局Perlしか使わなくなった俺ガイル
>>679 欲嫁。
bashとshが相互互換という話じゃないよ。
bashがshの上位互換という話。
だから、bashでのみ使えるtype -pとかexport VAR=VALUEは
この議論とは関係ない。
sh用のスクリプトがすべてbashでもそのまま動くという話。
bash用のスクリプトがshでは動かないのは当たり前なので、
そういう話をしているんじゃないよ。
で、shのスクリプトはzshではそのままでは動かないということ。
上位互換、下位互換、相互互換の区別も付かんのか…。
ksh使っとけ
上の方でもでてるが、whileにパイプやリダイレクト使った場合の挙動の違いとかあるしな。 bashがshの上位互換というのは、間違い。 単に「互換」というからには、100%で無ければならない。
>>684 上の方のwhileのパイプの件で書いてあったのは、
shでは動かなかったが、bashにしたら動いたという話。
なので関係ない。
ここで関係あるのは、「shで動いたのにbashでは動かない」ことはない、
ということ。
>上の方のwhileのパイプの件で書いてあったのは、 >shでは動かなかったが、bashにしたら動いたという話。 この場合はたまたま bash の方が希望の動作だったというだけのことでしょ。 逆に sh の挙動の方が望みという状況だってありえる。 同じものが同じに動かないってのは互換とは言わん。
>>686 「動かない」「意味をなした動作をしない」のが希望の動作であるはずがない。
なので、上の例についてはshの挙動が希望の動作のわけがない。
反論するなら実例を挙げろ。
上の方の while の例は動いとる(=エラーになっとらん)だろ。 スクリプトを書いた人間の意図と違う(使い方を間違ってる)だけ。 バグは互換性以前の問題。
だからksh使っとけって
シェルを書くのと、正統談義をひっくるめて、 これからケーシェルを書くスレということにします
>>690 ケーシェルって、MS-DOS時代にコマンド環境だけUNIX風にするために
command.comの代わりにインスコしたやつだろ。
今で言うCygwinみたいな。
KI-shellか?
石野さんのシェル
非互換性、けっこう情報集まったな。wikiにするか?
>>694 いらん。ksh を使えば何の問題もない。
伸びるときと過疎るときの差が凄いなw
伸びるためには魔法の言葉が必要です。 「シェルを書いてるんですが・・・・」 さあ皆さんもご一緒に。
「シェルを書いているんですが…」が「シェルスクリプトを 書いているんですが…」の誤用であるかのように認識できる ということはつまりちゃんと通じているということだ。
す げ え 釣 ら れ た く な っ た 俺 ガ イ ル
ところで ksh 連呼してる奴は全然釣れてなくて惨めだな。
Solarisスレにも来てたなあ。 だれからも相手にされてなかったみたいだけど。
別に釣りでも何でもないが。単なる正論。有効な反論が一切無いのがその証拠。
ksh連呼は俺以外に一人はいる。
じゃあ、シェルスクリブトを書いてるときの擬音は「しぇるしぇる」にしようぜ
「スクリブト」ってのは新しいな
ネタがなくなったからってわざわざ供給しなくてもいいんだよ
自作シェル
>>704 誤用と正しい用法との境界はあいまい。奈良時代の日本語から見れば
現代日本語はもう誤用のオンパレード。
>>699 ごめっ、言わずにはいられない。
既に釣られてんじゃん
スレが順調に伸びております。
あのころほどではぜんぜんない
冬休みの課題として、シェルを始めたいと思います。 まずは何からやればいいか、皆さんの経験を教えてください。 あと、今はフリーのシェルをしていますが、 仕事でシェルをやる場合、やっぱり有料のシェルを買ってじゃないと 身につかないですか?
>> 身につかないですか? > そのとおりです。
Excuse me. Where is the station ? Yes, I do. Waaahhh !!!
冬休みですか? いいえ、ここにいるのはオジサン達だけです。
720 :
名無しさん@お腹いっぱい。 :2005/12/28(水) 13:14:43
シェルスクリプトのプロンプトを保存するにはどうすればいいでしょうか? 今はTELNETでシェルスクリプトを起動してから、 シェルスクリプト変数PS1に代入していますが、 TELNETを終了すると消えてしまいます。 TELNETのメニューのどこかに設定すればいいのだと思いますが、 どうすればいいでしょうか?
721 :
クマ :2005/12/28(水) 13:25:07
クマー!
まあ冬休みだし、勉強の意味で、つたない自分の知識を整理してみっか。
>>720 まず、対話的に用いるのは「シェル」で、シェルスクリプトではありません。
シェルスクリプトとは、動的にシェルに命令を与えるのではなく、
一連のコマンド列をあらかじめ静的にファイルなどにまとめたものの
ことをいいます。
また、telnetは相手側ホストとの通信路を確保するためのプログラムで、
その通信内容(ここではシェルを使った対話)までは関与しません。
通常はホスト上のシェルが相手をしてくれますが、そうでない場合もあります。
(telnetでhttpサーバやメールサーバと通信することもできる)
プロンプトを管理しているのは、シェル自身で、telnetは関係ありません。
さて、シェル変数$PS1の内容をシェル起動時に設定するには、.profile等の
ファイル(多分w)に
PS1="オマエの好きなプロンプト"
と書いておけばよいはず。シェルは、起動時に.profileを読み込みます。
↓偉い人採点ヨロ
シェルのことをシェルスクリプトってゆーな
若いのにジジくさいのが最悪だよな
外国へいくと8〜12年くらい若く見られてしまう俺としてはうらやましい。
どこからそういう発想に… これはもうネットゥョ脳としか言いようがないなあ
どこからそういう発想に… これはもうアサピ脳としか言いようがないなあ
$?はメモリ空間を持ってるのかな。レジスタをみてるだけかな。 どのタイミングまでコマンドの戻り値を正しく保管しているといえるかエロい人教えて。
>>729 ソース読めば一発で分かる。ソースなくてもデバッガがあれば分かる。
>>729 >$?はメモリ空間を持ってるのかな。
意味不明
>レジスタをみてるだけかな。
$? の値はアクセスするまでメモリに入っているのが普通だろう
>どのタイミングまでコマンドの戻り値を正しく保管しているといえるかエロい人教えて。
最後まで正しく保管している
香ばしくなる悪寒
シェルってゆうな、クズ。
年始とお盆はリーマンが休みだから普段より馬鹿そうなのが沸く確率が高い
シェルスクリプトの話って大抵の疑問は古いスレで解決されてるし 新しい問題は基本的に出てこない話題だから、 若いスレになるほど馬鹿率が上がるのは仕方ないよ。
そう?年季の入った馬鹿が暴れてるような印象があるんだが。
やばいのが開発系の営業だな。知ってるような知らないような微妙な知識w
少なくとも739という年季の入った馬鹿の実例が生息していることは証明されたな
このスレに限ったことではないが、なんかここ2〜3日、 相手の言ったことをおうむ返しにする程度の妙にヒネリのないレスが目立つ気が。
あけシェル。おめシェル。
シェルってゆうな、クズ。
俺いまシェル書いてるんだけど、スクリプトの文法はどうしよう?
あけおめ。今年こそ犬厨がUNIX板から一掃されますように。
あけおめ。負け犬の化石ジジイどもが業界から引退しますように。
あけおめ。 sh/cshのクイックハックのかたまりになっている業務システムに、 来年度こそ予算がとれますように。
753 :
名無しさん@お腹いっぱい。 :2006/01/03(火) 23:24:04
コマンドライン引数で指定されたファイルが、$HOME/trashboxの中に存在するかどうかを知りたいと 思っているのですが、何か良い方法はないですか。
if [ -f "$HOME/trashbox/$1" ] ... みたいな? ていうか、どこがわからんってのよ。 コマンドライン引数の参照の仕方? ファイルの存在の検査法?
755 :
名無しさん@お腹いっぱい。 :2006/01/04(水) 00:17:08
rm代替用のごみ箱スクリプトで、$HOME/trashbox/日時/の中に対象ファイルを移動するよ うにしているのですが、 もし$HOME/trashbox/の中のファイルを削除しようとした場合、警告を出すようにしたい> と思っています。
その用途のためのパッケージとかないのかな?
FAQも読めないやつらが増殖中
いろいろと探しているとrealpathというコマンドを見つけられました。 if realpath $target | grep ^`realpath $HOME/trashbox` > /dev/null 2>&1; then でなんとかなりそうです。 スレ汚しすいませんでした。
満足してて治まりそうなんだから良いじゃないか。
762 :
名無しさん@お腹いっぱい。 :2006/01/04(水) 23:32:18
UNIXのデバイスには文字型とブロック型がありますが、 シェルでは文字型しか実行できないのでしょうか? シェルでブロック型を実行すると、 Can't open displayとしか出ません。 文字型は問題なく実行できてます。
実行なんてどっちもできない。
シェルってゆうな、クズ。
最近さ、意味わからない質問が続いているの俺だけ? デバイスを実行するって、言葉通りにデバイスファイルをexecve(2)に渡す という意味にとっていいの?
>>764 これからは/bin/shのほうのシェルは「シェル」、シェルスクリプトは「シエル」と
呼ぶってのはどうだい?
シエルとシェル総合スレでも立てて勝手にやってくれ。
シエルといえば先輩(・∀・)
>>762 そうです。UNIXのコマンドには文字型とブロック型があります。
シェルで実行できるのは文字型だけです。
ブロック型を実行するためにはKDEなどで
グラフィカルログインする必要があります。
なので、TELNETのシェルでは無理です。
772 :
:2006/01/05(木) 12:27:04
OS依存なのに、よくそう一般論的に会話をすすめるのね。
>>772 どこにOS依存の話題があるんだよ? 欲嫁。それに話の流れと関係ないし。
>>771 コマンド(=executable=execve(2)が受け付けるprocess fileやインタプリタファイル)
に文字型とブロック型があるって???
ないでしょ...そんなの....。と信じたい。
というか、「シェルスクリプト」の話とは最初
>>762 から無関係な気がする。
ネタにまj
771 はさっさと解説しろよ 762 見ると X が関係していそうだが果たして…!?
コマンド入力で起動すると実行結果が文字で表示されるのが 文字型コマンド。(ls rm など) マウスをクリックするとウィンドウ枠(=ブロック)が表示されるのが、 ブロック型コマンド。(xterm xclock など)
誰だよ「ブロック型コマンド」なんて言葉を超初心者に教えた奴は。 プンプン。
ネタじゃなかったのかョ。 私、たったいま、文字型コマンドとかブロック型コマンドでググりました。はい。
>>777 初耳。てかネタだろ?ネタだよな・・・。
ググってもでてこなかった ネタだよな・・・
GUIならぬBUIってか
マジレスしていい? ブロックデバイスとキャラクターデバイスのことだよね.
めまいがしてきた
∧_∧ クワッ!
∩`iWi´∩ <
>>762 はどこいった!
ヽ |m| .ノ
|. ̄|
U⌒U
789 :
名無しさん@お腹いっぱい。 :2006/01/06(金) 03:37:48
あるディレクトリにある*.datファイル内の文字列 japan を全て jp に置換したいんですが、どーしたらいいでしょうか? bashとかいうやつ使ってます。
sed に置き換えオプションってないよね。 そういう意味で perl の -i 使うと楽だな。 とはいっても、失敗が怖いから 結局作業用の別ディレクトリで同名ファイル作るようにするんだけど。
791 :
789 :2006/01/06(金) 04:21:27
>>790 perl -i -p -e 's/japan/jp/g;' *.dat
でできました。ありがとうございました。
>>789 rename japan jp *japan*.dat
じゃだめ?
>>790 sed にもあるべ?
あれ、それとも GNU sed だけ?
-i は in-place edit 機能のあるsed のみですね。 とりあえず3.95または2001-9-25以降のGNU sedと4.7R または5.0R以降のFreeBSDのやつ。
edのスクリプトなら汎用かもねー
for d in *.dat; do mv ${d} ${d}.tmp cat ${d}.tmp | sed -e "s;japan;jp;gi" > ${d} rm -f ${d}.tmp done じゃいかんの?
>>797 本題とは違う部分だが、
・${d}ではなく"${d}"または"$d"と書くべき。(今時スペースを含んだファイル名はザラ)
・catが無駄
rmも消せるかな。 for d in *.dat; do sed -e 's/japan/jp/gi' "$d" > "$d.tmp" mv -f "$d.tmp" "$d" done
for f in *.dat; do (echo ,s/japan/jp/g; echo w; echo q) | ed "$f"; done
同一ファイルへの書き込みもできるよ。 テンポラリファイル不要。 ↓ for F in *.dat; do (rm "$F"; sed 's/japan/jp/g' > "$F") < "$F"; done UNIXではファイルのオープン中は rmしても実体が消えないことを利用。
>>790 -i は sed がオリジナルでそwwww
>>801 カッコイイ。と思ったが、msdosfs上だと失敗する予感。
>>801 >>803 こういうin-placeな処理っていかにもFAQっぽいけど汎用的なやり方って確立されてないの?
「UNIXプログラミング環境」(古典ですね)には、この目的で 汎用的に使える overwrite というスクリプトが紹介されてます。 手元の版だと233ページ。
806 :
804 :2006/01/06(金) 13:13:04
>>801 ufsのセマンティクスはそうだけど、windowsの共有をマウントしたsmbfsとか
でもちゃんと動くのかな?
年に二回くらいの割合でそういう置き換え作業やることあるけど、
そのたびになんかいい方法ないかなと思いながら
>>799 みたいなワンライナー書いてごまかしてたな。
かといって汎用のラッパーがあっても、使う機会自体がまれなので
使い方すぐ忘れるだろうから、やっぱりワンライナーで済ませそうだ。
このテの処理は何も考えずにPerlを使うに一票
perlでやる方が難しいに一票
811 :
789 :2006/01/07(土) 00:17:51
うを、なんかいろいろあるなー。 Perlは初めて使ったけど、ソースの短さにはびびってしまった。 おらに使いこなせるのだろうか。 シェルスクリプト参考にさしてもらいます。
セマンティクスってシマンテックと関係ありますか?
ない
セマンティックスがブロック型で、シマンテックはキャラクタ型です。
あけおめ。今年こそFreeBSDユーザが絶滅しますように。
cshのスクリプトが亡くなればどうでも良い。
さすがに今時cshスクリプトなんてもう存在してないだろ。 あとは、今でも過去の惰性で少数存在する、 (t)cshユーザーの撲滅だな。
cshでスクリプトを書く池沼はどのように発生したんだ? 去年からうちにきてる派遣も、「cshスクリプト」の経験ありと恥ずかしげも無くアピールしてる。
>>818 cshスクリプトを保守しないといけない環境もあるんじゃねーの?
投稿大情工のschemeの授業の課題提出スクリプトがcshだったのは秘密
うむ。何故かcsherはまだ結構いる。配列が使いたいのか?
>>821 そんな積極的理由なわけがないだろ。最初のログインシェルがcshだったとか
適当な理由だよ。
それより、あけおめ。今年こそFreeBSDがUNIX板から一掃されますように。
正月から一人で何やってるんだ。
>>819 そのスクリプトを書いたやつはなぜcshを選択したのかってことだよ。
「スクリプトはcshで」とか煽動した戦犯がいるんじゃないのか?
>>824 煽動っていうほどでもないでしょ。
配列が使いたいがためにcshのスクリプトを使っている例は良く見るよ。
csh はバグが多いけど、短いスクリプトなら、csh で問題ない 配列以外でも、ファイルパス周りの演算や、ちょっとした算術演算が使えるので shよりも都合がいいことも多い
つーか、csh-whynot に書かれているような件を扱わないようなものならば、 csh で書いても問題ないよ。 なぜ csh を使っちゃいけないのかをわかっていれば、 逆に、使っても問題ないケースというのもちゃんとわかるはず。 何がなんでも使うな、というのはバカのひとつ覚え以外の何物でもない。 もっとも、問題あるものとないものを csh と別のもので使いわけるのが面倒だから はじめから csh なんか使わないようになるけどな。
828 :
名無しさん@お腹いっぱい。 :2006/01/08(日) 18:41:26
ってか、プロジェクトに言ったらcshだっただけだった俺がいる しかも3つ連続
>828 イキロwww ついでに上司かなんかにcsh-whynotを読ませろ。
つう訳で最大の悪人はビルジョイでFA? そういやこのおっさんが関わったものって全部コケてしまったな。
viが煽られた
cshスクリプトしか出来ないのは問題だが、+αでcshスクリプトが使えるって事なら買い。 cshスクリプトを触ってもらうときに便利w
viもJavaもこけたな。BSDももはや立ち直れない状態だし。
Bill嫌いの834に、煽られすらしないcshカワイソス
Billって今どのシェル使ってるんだろう。 csh+viでJavaプログラミングしてるのかな。
よく考えると、いまだに vi に代わるエディタってないな emacs は資源食いすぎるんで標準搭載とは言いがたいし
emacsが資源食いすぎってどんな貧乏HWなんだよ。
富豪自慢かよ!
いまだに標準とはいえないでしょ > emacs みな EDITOR=emacs がきたらそれはそれでこわいけど
今時は, 「Emacs ないとシステム管理できません!!!」 てな, 連中がゴロゴロ要るんだが...
tramp 使っている俺は勝ち組
普通 ed だろ。
まあechoとcatがあればなんとか
システム管理にはキャラクター型コマンドは必須ですね。
ブロック型エディターを使ってる俺は勝ち組
なに?そのブロック型とかキャラクター型とかって標準になったの? 俺にはその言葉、全然イメージわかなくて正直使いたくない。 ギャグで使ってるにしては面白くないし・・・
ごめん 十分おもしろかったわ
catはキャラクタ型、ddはブロック型。
コマンド自体にはそんな区別ないよね?
マジレスしてる今時純朴な奴は
>>777 あたりを見とけ。
oclock は?
777を見たらすごくつまらなかった
Bill Joy って結局どんな貢献したの? ここまで軒並みこけたのに平然としているのが理解できない。
「軒並みこけた」って
>>856 が書けるってことはさ、
Bill Joyのこれまでの仕事とその結末を既に自分で把握できてるんだろ?
わざわざ質問することないよ。
たくさんのファイルの中からある文字列を含むファイルだけをgrepとawkを用いて別のあるディレクトリに移動する みたいなことってどんなスクリプトで出来ますか? わかりにくかったらすいません
grep(とスクリプト)だけでできる。 awkはいらん。
>>858 mv `grep -l * ある文字列` /betsuno/aru/directory
だな。
ただし、ファイル名にスペースとかを含むものがある場合は
さらに工夫が必要。
>>861 バッククォートの中、
`grep -l ある文字列 *`
だな。
863 :
858 :2006/01/12(木) 00:21:29
みなさん回答ありです。参考になります。
>>861 さんのやり方でできないんすよねー。
ファイル名に@とか入ってるとだめでしたっけ・・・
emacs上のmuleで編集してるのですがmuleを終了するとそのスクリプトの内容が消えてしまう
という現象が・・・
参考までに、emacs 上の mule のやり方教えてください。
865 :
名無しさん@お腹いっぱい。 :2006/01/12(木) 01:07:55
rec(){ for FILE in * if [ -d $FILE ] ;then cd $FILE rec cd .. fi done } みたいな再帰処理が可能な理由を教えてください。 呼び出し側の変数「FILE」の値は何故保持されるんでしょう。
FILEの値は上書きされまくってるんじゃないの? rec(){ for FILE in * if [ -d $FILE ] ;then cd $FILE echo $FILE # ここと rec echo $FILE # ここ、では値が違うと思われ cd .. fi done }
869 :
名無しさん@お腹いっぱい。 :2006/01/12(木) 04:02:09
/test/test/test /test/abc/test というディレクトリを /hoge/hoge/hoge /hoge/abc/hoge というディレクトリに一括リネームしたいのですが、 簡単にできそうにありません。 どうしたらよいか教えていただけないでしょうか?
> 簡単にできそうにありません いいえ
オレも簡単に出来ないと思う 複雑な方法でやればいいんじゃね?
872 :
1/2 :2006/01/12(木) 14:02:49
済みません、``(バッククォート)を使ったコマンド実行について教えてください。 【環境】 Solaris 9 C-Shell 【やりたいこと】 あるディレクトリのファイル一覧を取得し、各ファイルに対して処理を行いたい。
873 :
2/2 :2006/01/12(木) 14:04:59
【困ったこと】 以下のようなシェルを作成しました。 foreach file ( `ls -1 ディレクトリ` ) ・・・処理・・・ end ここで、指定したディレクトリに含まれるファイルが少なければ問題ないのですが、 ファイル数が5000あるディレクトリを指定するとエラーが表示されてしまいます。 試しに、以下のとおりコマンドラインから実行しても同様でした。 % echo `ls -1 ディレクトリ` `` から展開する単語が多すぎます。 「`` から展開する単語が多すぎます。」というエラーが表示されます。 このエラーメッセージでGoogle等を検索しても1件もヒットしませんでした。 どうにか解決できないものでしょうか。 よろしくお願いいたします。 ※先ほど別スレに書き込みましたが、こちらに誘導していただきました
>>873 find とか xargs を使うんじゃだめなん?
>>873 とりあえず cshを使うのをやめろ。
cshと見ただけで誰も答えてくれないだろう。
エラーメッセージでググって1件もヒットしなかった原因の一つは、
誰もcshは使わないから。
ひっかからないのは web に書くまでもないからだろ。
877 :
873 :2006/01/12(木) 15:31:43
>>874 ありがとうございます!
やりたかったことはあるディレクトリ以下(サブディレクトリ含む)の
ファイルのフルパスとファイルサイズの一覧を出力したかったのです。
ファイルの一覧を取得して、ファイルなら出力、ディレクトリなら再帰的に処理をする、
といった感じで難しく考えていました。
find と xargs を調べ、以下のコマンド一発で実現できました!
find ディレクトリ -type f | xargs ls -l | awk '{ printf( "%s (%s)\n" , $9, $5 ) }'
>>875 そうですね。。。
今はcshを使用しなければいかない状況になってしまったのですが、
今後はksh等に変更していきていと思います。
ありがとうございました。
いつもの人キタ
nslookupを使っちゃいけない理由って、一言で言うと何だっけ?
一言で言うとスレ違い。
>>877 パスにスペースとか入ってると予期せぬ挙動になることがあるんで
find -print0 | xrags -0
する癖をつけといたほうがいいよ。
nslookupはWindows(DOS窓)のコマンド。 知らずにUNIXシェルで使っても動くわけがない。
>>883 そんな釣りに俺がつられクマー
>>880 BIND的には廃止の方向。
dig とか host とかが推奨。
djb 教徒は勝手にしてくれ
>>882 で、-print0とかが使えないSolarisは使わない癖をつけといたほうがいいよ。
そこで GNU find & GNU xargs ですよ。
>869 lsの出力をexcelで編集してターミナルでコピペして実行。2分でできる。
find . -type f -name "*/test*" > 1.txt sed 's/\/test/\/hoge/g' 1.txt > 2.txt sed 's/^/mv /' 1.txt > 3.txt paste 3.txt 2.txt > tmp.sh chmod +x tmp.sh tmp.sh
シェルスレだからシェルで答えてあげたら?
892 :
889 :2006/01/13(金) 00:19:55
(´・ω・`)
find . -type d -name '*/test/*' | while read do mv "$REPLY" "`echo "$REPLY" | sed 's/test/hoge/g'`" done スペースに対応してみたが、いまいちオサレじゃないな。
↑その場合、宛先側のディレクトリを作成する手続きを入れなければいけない気がする。
>895 ./test/test/testディレクトリを./hoge/hoge/hogeディレクトリに直すことを考えてみよう。 find="find . -name test -print -prune"; files=`eval $find`; until [ -z $files ]; do for i in $files; do mv $i `echo $i | sed -e s/test/hoge/`; done; files=`eval $find`; done 空白改行対応は任せた。>898
900 :
名無しさん@お腹いっぱい。 :2006/01/13(金) 05:42:56
kシェルでワイルドカード"*"を環境変数に入れたあと、これを文字として使いたい。 A="*" こんな感じで入れたんだけど、これを呼び出そうとすると 環境変数に定義してるものが全部出てきてしまう。 上記のようなセットの仕方では文字と認識してくれないの?
898ではないが、testimonyがhogeimonyに変換されちゃ困るだろう。てことでzshで。
for f in ./**/*(^/); do
g=${(j:/:)${${(s:/:)f}:/test/hoge}}
[[ $f == $g ]] || (mkdir -p ${${g%/*}:-/} && mv $f $g)
done
gの計算以外試してないけど。zshなので変数中の空白は問題ない筈。
毎回mkdir -pは遅いからifで分けりゃいいんだが、単純さ優先で。
>>889 testimonyという名前がhogeimonyに変換されてしまう。
>>895 -name '*/test/*' では何も出ないだろう。あと末尾のみtestの場合を忘れてるのでは。
>>899 それ./test/test/testが./hoge/test/testに移っただけで終わってしまうんでは。
902 :
901 :2006/01/13(金) 06:42:52
飯食ってからよく見たら
>>869 の要求と違ってたわ。ディレクトリをリネームか。
再挑戦。これでいいんかな?
ds=(./**/test(/))
for f in ${(O)ds}; do
g=${f:h}/${${f:t}:/test/hoge}
[[ $f == $g ]] || mv $f $g
done
903 :
901 :2006/01/13(金) 06:43:35
[[ $f == $g ]] || mv $f $g は単に mv $f $g でいいか。
904 :
899 :2006/01/13(金) 07:57:41
おはよ。
>901
>
>>899 >それ./test/test/testが./hoge/test/testに移っただけで終わってしまうんでは。
899が何で二重ループになってるか、考えてみよう。
./test/test/testの例だと、一回目の$fileは"./test"、二回目の$fileは"./hoge/test"
三回目の$fileは"./hoge/hoge/test"、になって回るので、正常に、
test->hoge、hoge/test->hoge/hoge、hoge/hoge/test->hoge/hoge/hogeと
mvされる。
>902こそ、一重ループで済ますなら、一発で
test->hoge、hoge/test->hoge/hoge、hoge/hoge/test->hoge/hoge/hoge
やらないといけないようなのに、やってる?f:tとかってどうなるんだっけ。
906 :
901 :2006/01/13(金) 12:18:25
>>904 ああそうか。毎回findを.でスタートしてるから問題ないんだな。
test/から始めるのと勘違いした。
zshの${(O)ds}は配列dsの逆順ソート。findにも-depthオプションがある。
だから毎回findなんてのは必要ない。
902の$f:tはtestに決まってるんだからg=$f:h/hogeで良かったな。結局こうか。
ds=(./**/test(/))
for f in ${(O)ds}; mv $f $f:h/hoge
ここまで単純にできたらまあ満足。
これをfindで書くとしたら
find . -depth -type d -name test -exec mv \{\} \{\}/../hoge \;
これは対象がディレクトリなのを利用しているけど、
その条件が使えなければ単一のリネームだけする処理を書いてそれを-execとか。
無理矢理一行に押し込むと
find (中略) -exec sh -c 'f="{}";g=$(dirname "$f");mv "$f" "$g/test"' \;
くらいか。
907 :
901 :2006/01/13(金) 12:22:23
最後の "$g/test" は $g/hoge" の間違い。
ぐだぐだ 本人はテクニカルなこと書いてるつもりかもしれんが もういいよ ちなみにhogeと同じディレクトリにtestがあると失敗するので まえの方にあった一見ダサい方法のがいいだろうな
909 :
899 :2006/01/13(金) 20:59:27
ただいま。 >906 ああ、逆順ソートが使えたか。それなら、 find . -depth -name test -print|sed -e 's/\(.*\)\/test/mv "\1\/test" "\1\/hoge"/' | sh でいいね。directoryだけに限定したいなら-type dってfindのとこにつけてね。 >908 すまんな。
現代人には>888が一番楽に目的が達成できるだろう。
自画自賛来たw
>910 excelはないけどviがシェルな奴って結構いるんじゃね? $ vi !!ls *.orig :s/\(.*\)/mv \1 \1.orig; cp \1.orig \1/ :%!sh とかrenameが出てくるまでは結構使ってた。 慣れると便利よ。
913 :
912 :2006/01/13(金) 23:30:25
あ、例題まちがったw ま、想像つくよね。そんな感じです。
>>911 時代についていけない香具師?
そういうやついるんだよなあ、ものすごく生産性低くて周りは
困っているのに「おれはハッカーだ」とか思い込んでる馬鹿が。
時代に関係なく、自画自賛はみっともない
自画自賛の次は屁理屈来たw
時代についていけてない単語: 香具師
俺の事これからは吟遊詩人と呼んでください
つうわけで以降はシェルスクリプトをエクセルで編集し活用するスレに変更
>>919 くだらないからスルーされてることに気が付かないのか。
恥ずかしい奴…
この「その4」は2か月ちょいで終わりそうだが しかし正直これまでに比してもかなり内容が薄かったな。 クソレスを 集めて速し 駄スレかな
>>921 で、生産性の低いじゃまものであることはあくまでも否定しないわけですな。
ご苦労さん。
実際なんでもかんでもシェルスクリプトだけで解決しようとする
馬鹿は生きていてはいけないな。
馬鹿がいると困るのも馬鹿
どこかで見た流れだと思ったら
>>198 これか。
同一人物だったら笑えるな。
思うんだが、最近何気にシェルスクリプトの地位が向上してる希ガス。 インターネット普及して、有力なツールが沢山出てきて、GUIで、便利で、間違いなくて、 「自作シェルで文字列扱うなんてもう時代遅れだぽ」と思ってたけど、 昨今の情勢(ISMSが一番キツイ)により、会社で自由にソフトをインストールできなくなった。 手続きは面倒だし、説明責任も必要だし、上司は良く知らないものを承認したがらないし、 そうした時、再びシェルスクリプトの時代がくるのではないだろうか? もしや、シェルスクリプトの本が出版ラッシュだったのはそのせいかも!?
何を言ってるのか全然わからん。
、__人__人__人__人__人__人__人__人__人__人__人__人__人__人__人__, _) (_ _) な なんだって〜〜〜〜!! (_ ) ( ⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒ l´ r'´ ̄` '''ー-‐、く , -─‐- 、.__ r''"´ ̄ ̄``≦_ _| ./ ─- 、 u uV , ,ィ 、 ≦l ,.ィィjノノl i 、 ミ. ,. -─- 、__ . |rヾノ i ̄r;`ヽァj,∠7 ,∠ノノハトNヘ「l / ̄ニゞノ_ハlゝ〃 , ⌒ミ、 l〈r_ ij  ̄ " '{.ゞ'ィスi/ <´n`ー'rf;Yi、ソij ゙ー゚=゙ {セ7′ ,.ィィァ'ハトAlヾ _r/^`ーl , - 、._‐ノ v}r_ ij "" _ -フ''〈;ァl. u , - 、_-フ 〉r_、∠f テcj:Hr。ァ! lヽ ::\. 〈ニ=;‐-/ ./!ー.l /ー`ニ7vノ、ヽ. l_ ̄`/./ l lヘ! ヽ.ニノ└Lノ | \ :: ヽ`ー‐'// | : \ヾ三//l \: ヽニ´ィ、 _,r゙7‐i ij /二ニ7 .〉 | _\ ::  ̄∧\. \:  ̄/| \ヽ /ヽ. ∠ .lヽ l ヽ、\ヾ二ソ/
>>927 そうですね。要は、
「ああもう! 一々名前変えるの面倒! 中の設定変えるのも一個一個テキストファイル開かなきゃいけないし・・・」
単純作業に悶える婦女子。
そこに通りかかった2人のパソヲタ。
一人はツール厨房、もう一人はシェル厨房、
前者は「良いツールあるんだけどな・・・ホント会社ルール厳しすぎだよ」
後者は「何がしたいの? ふんふん。カタカタカタ・・・ できたよ。これでいい?」
婦女子「シェル男君すごーい! 今まで手作業でやってたの、私、馬鹿みたいだよね。」
シェル男「いや、君の努力が損なわれるわけじゃないさ。寧ろ、余計なことしちゃったかな?」
婦女子「全然! ホントありがとう! ・・・シェル男くんって・・・」
〜以下略〜
みたいな世界が待っているということですよ。
昔からシェルスクリプトはそれなりに使われてるし
>>927 は「ん、まあそういうこともあるかな?」程度だが、
>>929 は「絶対そんなわけねーべ」レベルww
>>929 (前略)
シェル男「何がしたいの?」
婦女子「うるさい話しかけるな。臭いから寄るな。」
〜完〜
ええ話や
じゃあ。あたしのジェルでお礼を、、、、
935 :
名無しさん@お腹いっぱい。 :2006/01/15(日) 11:06:20
その後、ルビーの宝石を送り目出度くゴール。 あとは真珠の入った○○○で、(以下ry
936 :
名無しさん@お腹いっぱい。 :2006/01/16(月) 02:42:53
以下のようなスクリプト test.sh で $ test.sh -a "aaa bbb" aaa bbb となってしまいます.これを $ ~/test.sh -a "aaa bbb" aaa bbb となるようにするにはどうすればいいでしょうか? 環境は Cygwin で $ getopt -V getopt (enhanced) 1.1.2 です. --- #!/bin/sh eval set -- $(getopt -o "a:" -- $@) while true; do case $1 in -a) a=$2;; --) shift; break;; esac shift done echo $a echo $@
"$@"やろ
$@だとコマンド実行する時にデリミタで展開されるよ。 "$@"ってやらないと駄目。 更に、getoptの戻り値は文字列なので、それをshが読み込む時に また展開されるのでエスケープしないと駄目。getoptの-oオプションが それなのかな?ま、そっちは自分で確認してください。 $ ./mytest.sh "hello world" hello world hello world hello world -- test.sh #!/bin/sh echo $1 echo $2 set -- "$@" echo $1 echo $2 set -- $@ echo $1 echo $2
>>937 ,938
できました.
ありがとうございます.
このスレ的にはシェルスクリプト男くんだろ
シェルが名前でスクリプトが名字 17才の金髪美少女
俺は、性はビジュアル、名はベイシック。 ビジュアル・ベイシッ君 ビジュアル系
あなたの性別は? 男 女 →ビジュアル
944 :
名無しさん@お腹いっぱい。 :2006/01/16(月) 17:43:26
↑歳バレ
( ゚д゚)ポカーン
パターンをシングルクオートした引数(例えば'*.{h,cpp}')をスクリプト内のある時点で 「明示的に」展開する方法はありますでしょうか。
>>949 ext='*.c'
echo $ext
echo "$ext"
files=$(eval echo '*.c')
echo $files
詳しそうだけど、ここに出入りしてる人間にとっては、読むのだるそう
>>951 最近、Mac OS Xとかmp3なファイルとか、
空白を含むパス名が増えてきたから、
> files=$(eval echo '*.c')
> echo $files
こういう展開されたのを保持するやり方は厳しくなったな。
> ext='*.c'
> echo $ext
じゃないと空白入りのパス名が分離されちゃう。
>>949 hogehoge=`eval "echo $1"`
192.168.1.2 と 255.255.0.0 の論理和を出したいのですが、どうするのが手軽 でしょうか? perl を使ってもいいので教えてください。
>>958 論理*和*なら
echo 255.255.`expr 192.168.1.2 : '[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\.[0-9][0-9]*\)'`
本当に論理和でよかったのだろうか・・・orz
bitwise orだったとしても $ perl -e '$ip="192.168.1.2"; @a=split(/\./,$ip); @b=split(/\./,"255.255.0.0");\ for ($i = 0; $i < $#a; $i++) { $l=int($a[$i])|int($b[$i]); print "$l."; }\ $l=int($a[$i])|int($b[$i]); print "$l\n";' 255.255.1.2 なわけで、何がやりたいのか悩む... 普通はbitwise andだよな。
#!/bin/sh sed 's/a//g' < /dev/stdin 標準入力からのデータを加工する上記のようなスクリプト foo があったとして echo hage | foo のように使えば問題ないですが、foo 単独で実行した場合に stdin を見にいっ て返ってこなくなります。stdin からデータが渡されてるかどうかを判別する うまい方法ってあります?
% tty /dev/ttyp1 % tty </dev/null not a tty
うちの部署になんでもかんでもシェルスクリプトでやろうとする人が いるのですがどうやったらいいでしょうか?
黙ってついて行きなさい
>>962 #!/bin/sh
[ -t 0 ] || sed 's//g/'
これでどう?
すんません。ネットワークアドレスを計算したかったんです。。
>>963 ,966
なるほど、そうすればいいのか。サンクスでした。
>>962 > foo 単独で実行した場合に stdin を見にいって返ってこなくなります。
> stdin からデータが渡されてるかどうかを判別するうまい方法ってあります?
それが普通だから気にするな。
cat, sed, grep...
> sed 's/a//g' < /dev/stdin
"< /dev/stdin"は冗長。
>>972 まあいいじゃん。
空白を含むファイル名を前提とするかどうかは、人によって違うわけだし。
いや、普通、前提にする。 $1 $hoge とか、" "なしで書いてあるスクリプトを見るとすぐ「ダメー」と思う。 とくに、$@とか書いてあるとアフォかと思う。 そういう感覚が大切。
>>978 お前の普通は世間の普通じゃない、とだけ言っておく。
"$@"じゃなくて、$*ってのはよくみるなあ。残念。 "$1"じゃなくて、$1なのはもう話にならないと思う。
981 :
978 :2006/01/20(金) 22:17:46
>>979 へ
俺は
>>975 や
>>980 とは別人だよ。
俺以外に「$var は "$var"と書け」という主張をしている人を複数見ているので、
これが世間一般の普通の考えだと思うが。
理屈にもなんにもなってねえな
"$1"と書かずに$1と書くメリットはまったくない。
スレ違いだが、 sshは引数をスペースを間に入れて結合した文字列をsshdに送る。 sshdは argv[0] = shell argv[1] = "-c" argv[2] = 送られた文字列 のように実行する。 なので'1 2 3'というファイルを指定するためには ssh localhost touch "'1 2 3'" のように''をつける必要がある。 シェルを経由して実行する場合は引数(の数と内容)を保ったまま渡 すのは無理なのかもしれんが。
無理じゃない。ここ最近の議論を良く理解しろ。
987 :
984 :2006/01/20(金) 23:29:30
>>985 シェルを経由して実行って書いたのは
sh -c コマンド
の形式で実行という意味です。
与えられた引数をそのまま sh -c で起動したシェルに渡すのは無
理ではないかと言っているのです。もし可能なら方法をください。
×方法をください ○方法を教えてください
ふつーにできるけど何でできないと思ったんだろ? $ cat hoge.sh #!/bin/sh echo "1:[$1]" echo "2:[$2]" echo "3:[$3]" $ sh -c './hoge.sh "123" "A B C" "x y z"' 1:[123] 2:[A B C] 3:[x y z]
>>989 ごめん。説明が悪かった。
$ cat hoge.sh
#!/bin/sh
sh -c "$*"
$ hoge.sh touch 'hoge hoge'
これでは'hoge hoge'というファイルは作られない。
hoge.shを書き換えて、hoge.shに渡された引数がhoge.shから起動さ
れたシェルにそのまま渡されるようにしたい。
>>990 お前は馬鹿か? ここ最近の議論を良く理解しろ。
固定の引数じゃなくて、 すでに "$@" に入っている引数をそのまま、 sh -c の形で引き渡すのはちょっと大変だね。 sh -c だと引数解釈が結果的に2回行なわれるから、 "$@"は1回解釈のものに対してで引数をそのまま渡せるけど、 2回解釈されると困る。 ようするに、"$@" の2回解釈版がシェル文法に存在すれば簡単なのだけど。。
>>993 sh -c は引数を1つしか取らないので"$@"は使えませんよ。使うなら"$*"
sh -c 'foo "$@"' なんて日常茶飯事ですよ。
sh -c 'foo \'some pattern\' "$@"' とか、
sh -c "foo $bar \"$@\"" とかさ。
>>993 はevalや〜 Expansionを理解してないね。
>>995 > sh -c 'foo \'some pattern\' "$@"' とか、
おまえこそわかっていないようだな。
>>995 > sh -c "foo $bar \"$@\"" とかさ。
sh -c "foo $bar \"\$@\""
一つ\忘れました。
問題はsh -cが引数を1つしか取らないことで、引数を複数許すなら 何も問題はない。
1000000000000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。