シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/ × shoptとかもしらん
○ shoptとかもいらん
なんで当たり前の正解を言ったら
お前悔しがってんの?w
知識自慢したのお前じゃん
そして「は?」の意味わかっただろ。
全く見当違いのことをやろうとして、
全く見当違いの解答をしてるんだよ。
クソガキどもが そりゃ、お前が悪い。shoptもな
なんかもったいぶってるだけでだからな。自覚がないのか?さんざん偉そう俺は初心者じゃないってだけの、質問から外れたことばっかり言っている
お前が>>349を>>352で書けば終わってることだからな
俺は別にお前みたいな知識自慢したくてなんてないぞ。おまえがさんざん俺偉いというだけのような&「そうすれば正解にたどり着く」とかうやむやなこと言うからだろうに
とうとう、「クソガキども」のお言葉いただきましたっ。なんだじじいかw自称他人を自分より劣ると言える 誤 お前が>>349を>>352で書けば終わってることだからな
正 お前が>>349を>>332で書けば終わってることだからな だから何をやりたいのかわかったのは
それ以降のレス読んでからだろうが
意味不明だし、馬鹿がクソな回答しやがるし
ほんと低い >だから何をやりたいのかわかったのは
イミフ。おまえもたいがい日本語ダがメだぞ?w いままでのレスの数々でも
やっぱり「俺高いお前低い」とは言いたいのね。なんでそう言いたいのか自分に問いてみような ああ、「クソガキども」のお言葉いただいたので(なんでそんなこと言いたくなったのか自分に問いてみようなw)、もういいや > なんでそう言いたいのか自分に問いてみような
邪魔だからだな。頭悪そうな兄ちゃんがきて
頭悪そうな会話をしてる。そんな感じだ。 質問する側が馬鹿すぎると馬鹿を引き寄せるだけなんだよなあ。
まず、まともな質問をするために man を読もうよ。 よくわからんが、なんで -f が出てくるんだ?
ファイルの有無が問題じゃないんだろう?
globしたかしないかが問題なんだろう? ""で囲むと展開されなくて""で囲まないと複数の引数として認識するから出来ないので諦めますね >>361
globでファイル名に展開されるかどうかは
ファイル(ディレクトリなども含む)の有無で決まるから >>363
こういう奴がセキュリティホールを作り込むのかね そもそも、ファイル名に、半角英数字、- _ (base64url encoding)以外を使うような、
システムを作る奴が悪い
さらに、Windows では、大文字小文字だけが異なる、ファイル名も作れないし。
例、aB, Ab >>364
セキュリティホールを作るのは、
お前のように正しく理解してないからだよ。
問題が有るというのなら言ってみな。 なぜ自信満々なのか、馬鹿の頭の構造はわからないな。 シェルの歴史に詳しくなれるサイト見つけた
https://www.in-ulm.de/~mascheck/ bashのさ、<() ってさ、sort test.txt みたいなのを sort <(cat test) って書けるから
リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
そうとはかぎらないよな?例えば、同じファイルを二回読み込むとかさ
そういうのってやっぱ一時ファイル作らないと無理だよな? >>371
パイプの概念がないのか?
sortコマンドもどこでどうなったのかを気にしないで使うというのもよくわからない。 >>372
知らんがな。俺に言うなや。
そのツールが、そうなってるんだから
sortコマンドはただの例だからこれ以上追求しなくていい
てか、複数ファイルを入力したり複数ファイルを出力したりすることだって
あるんだから、必ずパイプで解決できるわけじゃない
diffコマンドとかそうだろ 同じ出力のデータを分けて処理することは可能だが、なぜ魔法文にこだわっているのかがわからない。 >>374
その話は関係ないから打ち切ろう
あるツールが「引数で指定した同じファイルを二回読込みしている」
そういう処理をしている。(そのツールの修正は不可能)
ここまでは理解しているかな? まあ結論としては無理ってわかってんだけどさ
bashの拡張を持ってしても あ、一時ファイル(FIFOファイル含む)作りたくないっていうのが最終的な希望ね。
メモリだけ(tmpfsや類似のメモリベースのファイルシステムやブロックデバイス除く)でやりたい。
無理ってわかってるけど。 >>371
例がないと何を言っているか意味がよく分からない。
teeとかファイルに出力しながら標準出力にも出力しているけど、
そのようなことがbashだけで表現できればOK? >>379
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。
#!/bin/sh
cat "$1"
wc -l "$1"
↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す >>380
ファイルを作らないでメモリだけでっていうことなら、
↓こんな感じならOKなの?
dat=$(cat $1) >>381
それでもいいよ
何をしたいのかわからんけど
kono-comand ?
↑?の部分になんて書く? 明らかに読み間違えてるレスがくると疲れるんで、
一時ファイルを使った場合の例も書いておくは
これは例なんで、この例を修正しろなんてレスは不要
generate-text > /tmp/test.txt
kono-comand "/tmp/test.txt"
この一時ファイル test.txt を作りたくない
なんで?とかいう質問も不要 >>383
ホントに意味が分からないんだは、
上の例でもこれでいいんじゃないのと思っちゃう。
generate-text | kono-comand
だからこれを直せってほうが意味通じるかも。 >>384
本当に疲れる。
>>371を読み返せ。
> リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
パイプもリダイレクトだ。 っていうか、
generate-text | kono-comand
kono-commandの内容は上に書いたとおり↓で
> #!/bin/sh
> cat "$1"
> wc -l "$1"
修正不可能つってるんだから
これでは動きません。の一言でよかったなw
>>385
動かないコードを書いる時点で説明の問題じゃない。 >>384
コマンドが標準入力をサポートしてない場合のだろう、よってパイプが使えない
標準入力サポートしていてパイプでいいだろうというコマンド例を挙げてくるとか説明が下手すぎなだけだろうなw >>388
あ、回答者の説明が下手すぎってことかw >>390
ん?今回はへこましてみるか?
俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。
で終わればいいやん。 https://hogem.hatenablog.com/entry/20090530/1243612485
> diff -u hoge.out fuga.out
> diff <(./hoge) <(./fuga)
よくこんな感じで、一時ファイルを作らない例として挙げられてるけど、
これって、diffが引数のファイルを一度しか読み込まないという
内部実装に依存しているってことなんだよな。
だから複数回読み込んでいたりすると使えない。
一度しか読み込まないという仕様はないだろうから
たまたま使えたということ。 ストリームでいいのかファイルでなければならないのか条件説明がやっぱり下手すぎ
標準入出力は普通は単なるストリームで戻ったりはしたない、一気通貫するだけ
2度読み??とかストリームでないなら当然ファイルにしなければならないだろうに、あたりまえだろう。結局あたりまえのことを確認したいだけなのか。例で上げてくるのがストリームでいいだろうのを出すから下手なんだよ >>395
これを満たせばいいだけ。
いい加減にしろや
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。
#!/bin/sh
cat "$1"
wc -l "$1"
↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す はは。catとwcでファイル読み込みを二回実行してるから、
ストリームでは無理なことにも気づいてない(笑)
マヌケか >>398
どこが下手なのか言ってないからね。
ストリームで不可能な例を見て、
これストリームで可能じゃん!って
言ってしまった時点で、お前の負け 俺が言いたいのは、
> diff <(./hoge) <(./fuga)
が使えるかどうかは、コマンド(この場合はdiff)の
内部実装に依存するから、試してみるまでわからないということ、
ファイルじゃないと二度読みはできないとかそういう話はしてない。
<(./hoge)が使えるかどうかは、コマンド次第という話をしてる
どんなコマンドだって、一度読むだけで実装することは可能(メモリに読み込めばいい)
だから、<(./hoge)が使えるかどうかはやってみるまでわからんのだよな。
という話をしてる。 >>384
というように、
cat "$1" | wc -l
したいわけじゃないんだよ。後は後出しでいろいろ言ってくるだろう ということを、とあるファイルを引数にするコマンドを
一時ファイルを作らないでやろうとして
あれ?となった次第。
そのコマンド、一度だけしか読まないでできるように思えるんだけどな。 > cat "$1" | wc -l
> したいわけじゃないんだよ。
>>380 を読めばそれぐらいわかる catやwcなんぞ各コマンドの入力ソースはストリームでしかないので、できないことはないけどな。お前には教えないがw >>404
> これは "例" でありこのコマンドの内容についてのレスは不要
あーあ、やっちまった。コマンドの内容にレスしたね(笑) >>405
>>385 そう言うなら、当然これを受け入れろな 例だから、実際にはcatやwcが使われているわけじゃないのに
catやwcなんぞとかwww >>406
自分の理解力のなさを自覚するように。
こっちは、ちゃんと例を出してる。
その例を満たせなかった時点でアウト コマンドの入力がストリームでいいならできる、他のなんか知らんコマンドがストリームじゃダメならできないでしかない。使用するコマンドによるでしかないだろにアホか > コマンドの入力がストリームでいいならできる、
そんな当たり前のことを言われてもなw
重要な点は、本来、該当のコマンドは「ファイルを指定する」前提であるということ
diffコマンドみたいにな。
それを半ば無理やり、ストリームから読み込ませる文法が
bashにはあるということ
> diff <(./hoge) <(./fuga)
だが、本来コマンドは、ファイル名を指定させる以上、ストリームを前提としているとは限らないわけで、
そういうコマンドに、bashを使って無理やりストリームで渡して動いたとしても、
それはたまたま動いただけいう話をしてる。
(コマンドの仕様で規定されてないならば)実装依存なので動くという前提に立ってはならない。 あ、bashの拡張なんて俺は普通使わんけどなw
今回はたまたま利用可能だったってだけで では、なにを当たり前のことを延々と言っているのかね?
というような、お前のレスはこんなんばっかだな >>412
俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。
で終わればいいやん。 基本的に、俺が出した結論が正解なので、
最後の最後でここで他になにかないのか?と聞いても
新しいことは何もわからないというのがいつものパターン そうならないのは、
>>385,390
(実は答えは別にもあるのだが、お前には教えないw) そういや前にも、
他にもやり方あるけどお前には教えてやんないよ。ばーかばーか
みたいなレスあったなw
結局やり方なかったみたいだけどw
あ、今回は有るんですよね?知ってます。だって俺も知ってるからね! ほほー、よくわからんが解決してなにより
めずらしくちゃんと終えられてよかったよ やれやれ、何事かと思ったら……
「そのツール」って何だよ。それを書かない時点で相手にする価値が無いゴミだろ。 ツール名聞いたって何の意味もないくせにw
じゃあgccとでも言っておこうか。一例として なぜかシェルスクリプトのスレなのにコマンドの世界の話をしてますね。 シェルスクリプトはコマンドを使って組むもの。基本的なものですらコマンドだったり。
コマンドの動作がどうだから入出力がどうだからで組みもするもんだろう。 いつものってことはこいつは常連客なのか
ちゃんとコテ付けてくれないと困るなぁ [ string1 > string2 ] ってPOSIX準拠じゃないよね?
POSIXの範囲で(外部コマンドを使わずに)
文字列の大小の比較ってできたっけ? >>427
おまえさ、ここはシェルスクリプトのスレッドだぞ?
コマンド一発にしたいのなら、そういうコマンドを作ればいい。
UNIXの考え方は、あるものの組み合わせで実現できるものはそうすべきだが、無理やりあるものの組み合わせでやれなんて言ってない。 >>431
どの言語でも、単に文字列を比較する構文は、どういう比較なのか分かりにくいから、まともなプログラマは避ける。 >>431
外部コマンドを使わないという制約なら
↓こういうのでは
string1='aaaaa'
string2='bbbb'
[ ${#string1} -le ${#string2} ] 「文字列の比較」ができるという触れ込みで文字数の比較を
している言語やデータベースなんか聞いたこと無いなw
普通は現在のロケールに従って文字列の照合順序で比較のことを言う
百歩譲っても文字コード順とか >>436
文字列が同じ値かどうかの比較を忘れているのか? 文字数の比較じゃないのか。申し訳ない、俺の読解力が不足してた。
後学の為に訊いておきたいんだけども、文字列の比較がごく普通にできるプログラミング言語って例えばなんだろう。 構文的ならC言語はできない方かなあと
他の(スクリプト)言語でいくらでもあるからそちらでもよかったんじゃないかと >>440
C は言語機能としての文字列比較は出来ないよ。
strcmp() 等で比較するしかない。 C言語を基準にしたら文字列同士の比較は簡単な構文ではできない。
しかし、C言語よりあとにできたプログラミング言語は、文字列同士ができ、まったく同じ文字列かどうかの比較ができる。
同じか同じでないか以外の比較は、プログラミング言語によって比較の指定がことなる。
文字列の長さ比較なのか、文字コードの大小比較なのか、よくわからないコードは可読性が低く、シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。
同じOSでも設定違いで変化するから、バグを埋め込むだけである。 > シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。
どんなふうに?
例として2つ(以上)のOSで比較方法を書いてみてよ だいたいどの種類のシェルか限定していない状態で具体例を挙げても意味がない。 意味有るでしょ?限定してないなら
例として○○のシェルならって書けばいいだけだよ シェルスクリプトが環境依存であることを知らない人間に何を言っても時間の無駄。 文字コードが異なるだけで、文字照合順序がかわる。
同じシェルスクリプトでもテストコマンドの評価が変わる。 >>450
2 デフォルトの名無しさん sage 2018/09/21(金) 23:36:59.94 ID:/eJt2TVD
お約束
・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
つまりシバンは#! /bin/shです。
他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。
OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。
ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。
FreeBSDユーザーは/bin/shの実体がashなので注意。
Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。
csh/tcshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIXに準拠しましょう
有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな ■ このスレッドは過去ログ倉庫に格納されています