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

■ このスレッドは過去ログ倉庫に格納されています
2018/09/21(金) 23:34:47.98ID:/eJt2TVD
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
375デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:31:24.78ID:m+FxQhlt
>>374
その話は関係ないから打ち切ろう

あるツールが「引数で指定した同じファイルを二回読込みしている」
そういう処理をしている。(そのツールの修正は不可能)
ここまでは理解しているかな?
376デフォルトの名無しさん
垢版 |
2019/05/03(金) 21:32:23.63ID:m+FxQhlt
まあ結論としては無理ってわかってんだけどさ
bashの拡張を持ってしても
2019/05/03(金) 21:35:32.54ID:m+FxQhlt
あ、一時ファイル(FIFOファイル含む)作りたくないっていうのが最終的な希望ね。
メモリだけ(tmpfsや類似のメモリベースのファイルシステムやブロックデバイス除く)でやりたい。
無理ってわかってるけど。
378デフォルトの名無しさん
垢版 |
2019/05/03(金) 23:01:24.06ID:wXl0ssRE
ただの無知か。
2019/05/04(土) 09:14:36.29ID:HnSBFy63
>>371
例がないと何を言っているか意味がよく分からない。
teeとかファイルに出力しながら標準出力にも出力しているけど、
そのようなことがbashだけで表現できればOK?
2019/05/04(土) 09:40:10.00ID:eyQzK648
>>379
「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。

#!/bin/sh
cat "$1"
wc -l "$1"


↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
2019/05/04(土) 09:47:38.10ID:HnSBFy63
>>380
ファイルを作らないでメモリだけでっていうことなら、
↓こんな感じならOKなの?
dat=$(cat $1)
2019/05/04(土) 09:57:48.90ID:eyQzK648
>>381
それでもいいよ
何をしたいのかわからんけど

kono-comand ?

↑?の部分になんて書く?
2019/05/04(土) 10:01:46.67ID:eyQzK648
明らかに読み間違えてるレスがくると疲れるんで、
一時ファイルを使った場合の例も書いておくは
これは例なんで、この例を修正しろなんてレスは不要

generate-text > /tmp/test.txt
kono-comand "/tmp/test.txt"

この一時ファイル test.txt を作りたくない
なんで?とかいう質問も不要
2019/05/04(土) 10:05:16.07ID:HnSBFy63
>>383
ホントに意味が分からないんだは、
上の例でもこれでいいんじゃないのと思っちゃう。
generate-text | kono-comand
だからこれを直せってほうが意味通じるかも。
2019/05/04(土) 10:05:29.00ID:ic6F2rX1
条件の説明が下手すぎ
2019/05/04(土) 10:07:09.78ID:eyQzK648
>>384
本当に疲れる。

>>371を読み返せ。

> リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド
> リダイレクトを受け付けないコマンド

パイプもリダイレクトだ。
2019/05/04(土) 10:08:50.78ID:eyQzK648
っていうか、

generate-text | kono-comand

kono-commandの内容は上に書いたとおり↓で

> #!/bin/sh
> cat "$1"
> wc -l "$1"

修正不可能つってるんだから
これでは動きません。の一言でよかったなw

>>385
動かないコードを書いる時点で説明の問題じゃない。
2019/05/04(土) 10:09:39.22ID:ic6F2rX1
>>384
コマンドが標準入力をサポートしてない場合のだろう、よってパイプが使えない
標準入力サポートしていてパイプでいいだろうというコマンド例を挙げてくるとか説明が下手すぎなだけだろうなw
2019/05/04(土) 10:10:34.97ID:eyQzK648
>>388
あ、回答者の説明が下手すぎってことかw
2019/05/04(土) 10:10:41.51ID:ic6F2rX1
いつもの自信過剰な人か
2019/05/04(土) 10:11:55.19ID:eyQzK648
>>390
ん?今回はへこましてみるか?

俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。

で終わればいいやん。
2019/05/04(土) 10:15:59.85ID:ic6F2rX1
標準入力もデバイス(ファイル)としてある
2019/05/04(土) 10:16:50.69ID:eyQzK648
https://hogem.hatenablog.com/entry/20090530/1243612485

> diff -u hoge.out fuga.out
> diff <(./hoge) <(./fuga)

よくこんな感じで、一時ファイルを作らない例として挙げられてるけど、
これって、diffが引数のファイルを一度しか読み込まないという
内部実装に依存しているってことなんだよな。

だから複数回読み込んでいたりすると使えない。
一度しか読み込まないという仕様はないだろうから
たまたま使えたということ。
2019/05/04(土) 10:17:09.83ID:eyQzK648
>>392
知ってる
2019/05/04(土) 10:23:29.06ID:ic6F2rX1
ストリームでいいのかファイルでなければならないのか条件説明がやっぱり下手すぎ
標準入出力は普通は単なるストリームで戻ったりはしたない、一気通貫するだけ
2度読み??とかストリームでないなら当然ファイルにしなければならないだろうに、あたりまえだろう。結局あたりまえのことを確認したいだけなのか。例で上げてくるのがストリームでいいだろうのを出すから下手なんだよ
2019/05/04(土) 10:24:53.38ID:eyQzK648
>>395
これを満たせばいいだけ。
いい加減にしろや


「リダイレクトを受け付けないコマンド」例
ファイル内容と行数を表示するために「同じファイルを二回読み込む」
これは "例" でありこのコマンドの内容についてのレスは不要
実際には中身はわからずバイナリで修正不可能なものとする。

#!/bin/sh
cat "$1"
wc -l "$1"


↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す
2019/05/04(土) 10:26:01.06ID:eyQzK648
はは。catとwcでファイル読み込みを二回実行してるから、
ストリームでは無理なことにも気づいてない(笑)
マヌケか
2019/05/04(土) 10:26:07.92ID:ic6F2rX1
それが下手だと言ってもわからないんだな
2019/05/04(土) 10:27:31.82ID:eyQzK648
>>398
どこが下手なのか言ってないからね。

ストリームで不可能な例を見て、
これストリームで可能じゃん!って
言ってしまった時点で、お前の負け
2019/05/04(土) 10:30:40.72ID:eyQzK648
俺が言いたいのは、

> diff <(./hoge) <(./fuga)

が使えるかどうかは、コマンド(この場合はdiff)の
内部実装に依存するから、試してみるまでわからないということ、
ファイルじゃないと二度読みはできないとかそういう話はしてない。


<(./hoge)が使えるかどうかは、コマンド次第という話をしてる

どんなコマンドだって、一度読むだけで実装することは可能(メモリに読み込めばいい)
だから、<(./hoge)が使えるかどうかはやってみるまでわからんのだよな。
という話をしてる。
2019/05/04(土) 10:31:29.76ID:ic6F2rX1
>>384
というように、
cat "$1" | wc -l
したいわけじゃないんだよ。後は後出しでいろいろ言ってくるだろう
2019/05/04(土) 10:32:27.87ID:eyQzK648
ということを、とあるファイルを引数にするコマンドを
一時ファイルを作らないでやろうとして
あれ?となった次第。

そのコマンド、一度だけしか読まないでできるように思えるんだけどな。
2019/05/04(土) 10:33:45.55ID:eyQzK648
> cat "$1" | wc -l
> したいわけじゃないんだよ。

>>380 を読めばそれぐらいわかる
2019/05/04(土) 10:36:59.95ID:ic6F2rX1
catやwcなんぞ各コマンドの入力ソースはストリームでしかないので、できないことはないけどな。お前には教えないがw
2019/05/04(土) 10:38:28.81ID:eyQzK648
>>404

> これは "例" でありこのコマンドの内容についてのレスは不要

あーあ、やっちまった。コマンドの内容にレスしたね(笑)
2019/05/04(土) 10:40:23.60ID:ic6F2rX1
>>405
>>385 そう言うなら、当然これを受け入れろな
2019/05/04(土) 10:40:24.64ID:eyQzK648
例だから、実際にはcatやwcが使われているわけじゃないのに
catやwcなんぞとかwww
2019/05/04(土) 10:40:58.27ID:eyQzK648
>>406
自分の理解力のなさを自覚するように。

こっちは、ちゃんと例を出してる。
その例を満たせなかった時点でアウト
2019/05/04(土) 10:44:00.90ID:ic6F2rX1
コマンドの入力がストリームでいいならできる、他のなんか知らんコマンドがストリームじゃダメならできないでしかない。使用するコマンドによるでしかないだろにアホか
2019/05/04(土) 10:53:18.47ID:eyQzK648
> コマンドの入力がストリームでいいならできる、

そんな当たり前のことを言われてもなw


重要な点は、本来、該当のコマンドは「ファイルを指定する」前提であるということ
diffコマンドみたいにな。

それを半ば無理やり、ストリームから読み込ませる文法が
bashにはあるということ

> diff <(./hoge) <(./fuga)

だが、本来コマンドは、ファイル名を指定させる以上、ストリームを前提としているとは限らないわけで、
そういうコマンドに、bashを使って無理やりストリームで渡して動いたとしても、
それはたまたま動いただけいう話をしてる。
(コマンドの仕様で規定されてないならば)実装依存なので動くという前提に立ってはならない。
2019/05/04(土) 10:54:58.56ID:eyQzK648
あ、bashの拡張なんて俺は普通使わんけどなw
今回はたまたま利用可能だったってだけで
2019/05/04(土) 10:55:49.57ID:ic6F2rX1
では、なにを当たり前のことを延々と言っているのかね?
というような、お前のレスはこんなんばっかだな
2019/05/04(土) 10:56:37.92ID:eyQzK648
>>412

俺「やっぱできないよなぁ」
→ 俺もできないと思うよ。

で終わればいいやん。
2019/05/04(土) 10:58:48.90ID:eyQzK648
基本的に、俺が出した結論が正解なので、
最後の最後でここで他になにかないのか?と聞いても
新しいことは何もわからないというのがいつものパターン
2019/05/04(土) 11:00:31.72ID:ic6F2rX1
そうならないのは、
>>385,390

(実は答えは別にもあるのだが、お前には教えないw)
2019/05/04(土) 11:03:05.91ID:eyQzK648
>>415
その答えは俺も知ってるけどな(笑)
2019/05/04(土) 11:04:39.93ID:eyQzK648
そういや前にも、

他にもやり方あるけどお前には教えてやんないよ。ばーかばーか

みたいなレスあったなw
結局やり方なかったみたいだけどw


あ、今回は有るんですよね?知ってます。だって俺も知ってるからね!
2019/05/04(土) 11:05:09.17ID:ic6F2rX1
ほほー、よくわからんが解決してなにより
めずらしくちゃんと終えられてよかったよ
2019/05/04(土) 11:10:16.30ID:eyQzK648
ほほー(笑)
2019/05/04(土) 20:25:44.11ID:ifYIOobQ
やれやれ、何事かと思ったら……
「そのツール」って何だよ。それを書かない時点で相手にする価値が無いゴミだろ。
2019/05/04(土) 21:30:57.91ID:eyQzK648
ツール名聞いたって何の意味もないくせにw

じゃあgccとでも言っておこうか。一例として
2019/05/05(日) 00:09:54.93ID:v1YqewFO
チンピラ以下の馬鹿だな
423デフォルトの名無しさん
垢版 |
2019/05/05(日) 01:20:16.53ID:kL93aIfd
なぜかシェルスクリプトのスレなのにコマンドの世界の話をしてますね。
2019/05/05(日) 01:55:58.03ID:BV99JfCS
シェルスクリプトはコマンドを使って組むもの。基本的なものですらコマンドだったり。
コマンドの動作がどうだから入出力がどうだからで組みもするもんだろう。
2019/05/05(日) 04:20:05.42ID:HUD7QHVp
いつものってことはこいつは常連客なのか
ちゃんとコテ付けてくれないと困るなぁ
426デフォルトの名無しさん
垢版 |
2019/05/05(日) 13:10:37.85ID:ptHRpxR9
>>424
プログラムですよ?
2019/05/05(日) 19:12:30.87ID:Cb4SiVVu
なにいってんのこいつ
2019/05/05(日) 22:39:57.67ID:QbHFXZX+
やっぱワッチョイ導入しよーぜ
2019/05/06(月) 01:18:15.86ID:VbOWf0H0
やはりそれが目的ですか
2019/05/06(月) 13:16:54.80ID:UGCyqtDX
どういうこと?
431デフォルトの名無しさん
垢版 |
2019/05/11(土) 15:19:07.32ID:D877RybE
[ string1 > string2 ] ってPOSIX準拠じゃないよね?
POSIXの範囲で(外部コマンドを使わずに)
文字列の大小の比較ってできたっけ?
432デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:15:32.41ID:0u/cIV/f
>>427
おまえさ、ここはシェルスクリプトのスレッドだぞ?

コマンド一発にしたいのなら、そういうコマンドを作ればいい。

UNIXの考え方は、あるものの組み合わせで実現できるものはそうすべきだが、無理やりあるものの組み合わせでやれなんて言ってない。
433デフォルトの名無しさん
垢版 |
2019/05/12(日) 02:18:26.37ID:0u/cIV/f
>>431
どの言語でも、単に文字列を比較する構文は、どういう比較なのか分かりにくいから、まともなプログラマは避ける。
2019/05/12(日) 02:27:43.60ID:4QpB/QIi
これまた変なのが現れたな
2019/05/12(日) 18:06:37.34ID:VATOmp33
>>431
外部コマンドを使わないという制約なら
↓こういうのでは
string1='aaaaa'
string2='bbbb'
[ ${#string1} -le ${#string2} ]
436デフォルトの名無しさん
垢版 |
2019/05/12(日) 19:46:54.27ID:OoMn1CYl
「文字列の比較」ができるという触れ込みで文字数の比較を
している言語やデータベースなんか聞いたこと無いなw

普通は現在のロケールに従って文字列の照合順序で比較のことを言う
百歩譲っても文字コード順とか
437デフォルトの名無しさん
垢版 |
2019/05/12(日) 20:03:17.70ID:0u/cIV/f
>>436
文字列が同じ値かどうかの比較を忘れているのか?
438デフォルトの名無しさん
垢版 |
2019/05/12(日) 22:54:11.71ID:OoMn1CYl
変なやつだったようだな
2019/05/12(日) 23:14:03.33ID:VATOmp33
文字数の比較じゃないのか。申し訳ない、俺の読解力が不足してた。
後学の為に訊いておきたいんだけども、文字列の比較がごく普通にできるプログラミング言語って例えばなんだろう。
440デフォルトの名無しさん
垢版 |
2019/05/12(日) 23:17:08.65ID:OoMn1CYl
C言語
2019/05/13(月) 03:22:38.08ID:gc1mJry9
構文的ならC言語はできない方かなあと
他の(スクリプト)言語でいくらでもあるからそちらでもよかったんじゃないかと
2019/05/13(月) 04:40:36.56ID:0SM9rJAF
>>439
ベイシック
2019/05/13(月) 15:51:16.30ID:JKDjGwzG
>>440
C は言語機能としての文字列比較は出来ないよ。
strcmp() 等で比較するしかない。
444デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:11:06.86ID:/95lNMvT
C言語を基準にしたら文字列同士の比較は簡単な構文ではできない。

しかし、C言語よりあとにできたプログラミング言語は、文字列同士ができ、まったく同じ文字列かどうかの比較ができる。

同じか同じでないか以外の比較は、プログラミング言語によって比較の指定がことなる。

文字列の長さ比較なのか、文字コードの大小比較なのか、よくわからないコードは可読性が低く、シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。

同じOSでも設定違いで変化するから、バグを埋め込むだけである。
445デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:27:44.64ID:biecMsFD
> シェルスクリプトの場合は、OSが変わっただけで比較方法がかわってしまう。

どんなふうに?

例として2つ(以上)のOSで比較方法を書いてみてよ
446デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:33:43.96ID:/95lNMvT
だいたいどの種類のシェルか限定していない状態で具体例を挙げても意味がない。
447デフォルトの名無しさん
垢版 |
2019/05/13(月) 18:34:56.16ID:biecMsFD
意味有るでしょ?限定してないなら
例として○○のシェルならって書けばいいだけだよ
448デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:41:17.20ID:/95lNMvT
シェルスクリプトが環境依存であることを知らない人間に何を言っても時間の無駄。
449デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:42:45.31ID:/95lNMvT
文字コードが異なるだけで、文字照合順序がかわる。

同じシェルスクリプトでもテストコマンドの評価が変わる。
2019/05/13(月) 20:46:52.81ID:WOFscy66
OS?
451デフォルトの名無しさん
垢版 |
2019/05/13(月) 20:56:23.36ID:/95lNMvT
>>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オプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
2019/05/13(月) 21:26:39.05ID:biecMsFD
>>449
今その話関係ないよ?
2019/05/13(月) 22:14:58.04ID:9QsNbP8l
文字コードが異なる文字列の比較をするときって
どんなとき?
2019/05/13(月) 23:06:37.15ID:zTqgOdMW
エンコーディングが変われば文字列の大小比較の結果も変わるかもしれないが
それを指して「比較方法がかわってしまう」と言ってるのか?
そうだとしても OS に依存するものではないだろうし
「シェルスクリプトの場合は」というのもおかしいように思う。
勉強不足な私のためにもう少し説明してはくれないだろうか。
ところで、シェルスクリプトで文字列の大小比較ってする?
2019/05/13(月) 23:16:05.42ID:T+zd+wGF
するからbashで拡張されたんじゃねーの?
2019/05/13(月) 23:19:07.49ID:TrAKdX2K
>>443
それ言ったらObject.compareTo()な言語全部じゃん
2019/05/14(火) 01:01:38.75ID:M5HaQ5Df
>>455
Bashってそんなことできたのか。
2019/05/14(火) 01:10:46.93ID:upCBpEzH
>>457
posixじゃないだけで多くのシェルで使える。
使えないのはposhぐらい
2019/05/14(火) 09:55:51.06ID:M5HaQ5Df
ん? Bashで文字列の大小ってどうやって比較するんだ?
[ "abcd" < "cde" ]
↑こういうのエラーになるぞ。
2019/05/14(火) 10:38:41.16ID:Vb/jSjs4
[[ "abcd" < "cde" ]]
461デフォルトの名無しさん
垢版 |
2019/05/14(火) 11:17:21.83ID:4FRIObo4
文字列の大小は文字列長のことを言っているのか?
2019/05/14(火) 12:48:35.79ID:CYW9GfRv
>>459
[ "abcd" \< "cde" ]
2019/05/14(火) 16:26:17.41ID:kz8JbfNJ
>>461
いや,この一連のレスの文脈では文字列の比較は
文字列長の比較を意味しない。
俺が>>435を提案したら>>436で否定された。
2019/05/14(火) 16:30:21.51ID:upCBpEzH
「文字列の比較を行う」という構文やライブラリで
文字列長の比較を行ってるものなんてあるか?

数値の比較はできるんだから「文字列長を取得する」命令だけあれば十分
だから「文字列長の比較を行う」命令なんてないだろ
2019/05/14(火) 19:07:44.93ID:M5HaQ5Df
Bashで文字列の大小比較って結局なにが基準なのかな。
2019/05/14(火) 19:08:11.58ID:M5HaQ5Df
辞書順で先かあとかじゃね?
2019/05/14(火) 19:08:35.08ID:M5HaQ5Df
(連投すまん)自問自答みたいになっちゃったけど
辞書順でした。
2019/05/14(火) 19:37:57.03ID:SUlCeWD6
他のプログラミング言語を知らなさすぎだろうというのが複数いすぎ
2019/05/14(火) 20:36:33.50ID:bepTC+/0
日本語すら怪しい日本人がうようよいるご時世ですから
2019/05/14(火) 21:13:15.31ID:Mw6Gyvjp
そういうやつも日本語わかってないというのも定番
471デフォルトの名無しさん
垢版 |
2019/05/14(火) 23:19:21.13ID:+OBjJPst
シェルスクリプトはわからないが、文字列長が同じ場合は、文字コードの大小を先頭文字から比較していき、大小比較をするプログラミング言語は存在する。
2019/05/14(火) 23:38:13.99ID:TDDhIyFE
で、その名前は?
473デフォルトの名無しさん
垢版 |
2019/05/15(水) 01:49:21.77ID:MwugOkQt
>>472
PL/SQL
2019/05/15(水) 01:54:48.92ID:qxUiM81Y
へぇ、文字列長が違ったら大小を比較しないんだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況