シェルスクリプト総合 その35
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 前スレ: シェルスクリプト総合 その34 https://mevius.5ch.net/test/read.cgi/tech/1597990675/ ちなみに発言は↓ここ https://github.com/koalaman/shellcheck/issues/2110 当人の発言によれば, #!/bin/echoという「シバン」にすることに特に意味はないようなので 「単独で実行されたとき」を判定できればシバンじゃなくてもいい。 それはps(1)コマンドを使った「普通の」方法で達成可能。 まあ「普通」が嫌なんだろうなw >>680 それだとsourceしたときにechoされちゃうやろ。 >>681 psを使った方法は名前を変えられるとだめってレスきとるでw シンボリックリンクとかな ちなみにさっき名前にバージョン番号がついたバイナリを落とした所w 「ファイル名を変える」より「/usr/bin/echoがない」ことの方が致命的だと思うんだけどな。 まあ当人がそう思わないんなら(もしかして認識さえしてない?),俺はもう何も言わない。 /usr/bin/echoがないならエラーで落ちるだろ 実行しようとした時に、実行させないのが 目的なんだから、目的は達成できてる >>683 いや,正直「奇抜(そして実装依存)」というだけで, 実用できると思っている理由が分からない。 >>687 そもそも「実用」するようなもんじゃない。 しょせんヘマ避けなので、実装依存なんか問題にならないことは>>686 も言ったとおり。 きみ、アホなの? 実用できない癖に実用性は求めるのか… じゃあファイル名に依存しててもいいじゃん…… 実用っていうのは、echoするって意味だろ ぱっとみてechoできなければ意味ないじゃんって 勘違いしたんだろうけど、echoするのが目的じゃないんだから実用性はある なんのためにあるのか少しは考えたら? エコースクリプトという新ジャンルを思い付いたけど大してする事なかった ヘマ避けならそもそも実行権限つけなきゃいいだけじゃね…… シェルスクリプトをググらず書けるようになったやっぱ言語は覚えた方がいいのか perlとか正規表現の指定しか知らんしまだsedやawkの方が出番あるわ まあ書けないよりは書けたほうがいいのは確かだが、 シェルスクリプトの場合、すでにある便利なコマンドを組み合わせるには 最速の方法なので、その言語を覚えていたとしても使えるようになったほうが良いと思うよ シェルスクリプトの変わりにプログラム言語を使うと コードが冗長になって、やりたい作業をささっとこなせない コマンドの再発明をすることになる >>693 sedはともかく、awkは忘れて、Perlに乗り換えたほうがいいんでは。 つーか、ワイはawkを使えん!w Perlは互換性がなー、と言いたいところだけど その互換性って主にライブラリの話 awkにはライブラリがない。 じゃあライブラリ無しで比べてみよう ライブラリがないawkと ライブラリを使わないPerl どちらが機能が上で互換性があるだろうか? おそらくPerlの方が機能が上で互換性も有るだろうな Perlがawkに劣るのは標準で入ってない環境に当たる可能性が少し高いってことぐらい ifはfi caseはesac など、何で最後の単語が逆になってるんでしょうか? parlはawkやsed風に書けるけどあくまで似せてるだけで細部では違うから戸惑ったぞ awkとperlでは添字がずれるし sedの/foo/!や/foo/,/bar/はperlじゃできないからな awkはテキスト処理に特化した言語だろ そもそも土俵が違う >>696 もう答えが出とるやん。w ワイもそのとおりやと思う。 違うとするなら、昔のサーバーよりも、最近のコンテナのほうがPerlを外したくなるやろな、てところ。 意外とsedの価値が上がってる気が。 ちなみに、互換性ならむしろPerlのほうが? 環境に依存しないワンライナーを書くならsedよりperlの方がいい - Qiita https://qiita.com/takc923/items/8654d69008e921c9c9fb >>697 When keywords are used, generally the reversed character sequence of the introducing keyword is used for terminating the enclosure っていうだけ、terminating the enclosure のために reversed character sequence でいいんじゃねっていう発想なだけだろう どの道具を使うべきかは解決すべき問題が与えられた時点で決まる どれが優れているかなんて一般論で言うのは無意味だろ doブロックの終了はなんでodじゃないんだろう。 odコマンドとぶつかるから? >>699 そのawkをBEGINだけ使って、Perlのような使い方をするコードを シェルスクリプトだって言い張ってる awk言語プログラマだっているんですよ! 長いマルチバイトの文字列をきりのよい文字でカットすることはできますが 動画を落としていますがファイル名はタイトルから取っています しかし昨今タイトルが長い動画があるため規定以上はcutコマンドでカットしていました 問題がありながらもそれなりに使えていたのですが 先日から落とせてない動画があり調べると 文字の途中でcutされてバイナリ文字になっているためか samba経由で見れていないのが原因でした (ls + grepでgrepがうまく動作していない問題もありました) cutコマンドを調べると-bではなく-cを使えば将来的にいいようなのですが 現状-bと-cの動作は同じでした このような場合にどのように対応するべきでしょうか 続き 【現状の実装】 cut -b 1-220 -n 【変更してみた実装】 cut -c 1-220 -n 【途中に加えている編集】 sed -e "y/!’@#$%&−+=_;/\!'@#$%&-+=_;/ ※この編集のために以下の文字列の「!」が「!」になっています これ以外に英数字などのASCII文字を変換をしていますが影響しないため割愛します 【元の文字列】 XXXXXXXXXX_たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 第3話『たとえば「なんでもします!」と言われりゃ悪い気はしないけどそこはダメって言わなきゃいけないようなジレンマ』 【cutの結果】 XXXXXXXXXX_たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 第3話『たとえば「なんでもします!」と言われりゃ悪い気はしないけどそこはダメって言わ? ※最後は「?」になっていますがls上の表示であり実際は違うようです なお最終的には上記の文字列に拡張子を付与しています cut -b 1-220 | iconv -f utf-8 -t utf-8 -c バイト数ではなく、見た目の長さ(全角(?)が2文字分)で切るでいいんだったら colrm 221 かな ext4は255バイトでNTFSはUTF-16で255文字だっけ? ext4は日本語だと85文字ぐらいしかないんだよな IVSをフルに使われたら32文字にまで減るというw それに対してWindowsは255文字 ロケールに対応していれば文字数で切ることは出来るかもしれないけど それだと最大に長さにするのは難しそう かと言ってCロケールとかにすると文字の区切りがわからない 文字として扱いたいけどバイト数で長さを切るって難しいな なんでext4ってバイト数制限なんだろ? やるとしたらUTF8ロケールにして N文字・・・何バイトか調べる N-1文字・・・何バイトか調べる って繰り返して、最大のバイト数に入るまで 1文字ずつループで削るしかないのかな? さりげなく間違いを入れて正しい答えを書いてもらう、そんなのには釣られんから ファイル1から時定数のマルチバイト文字数をファイル2へ出力するプログラムを書いてみたよ https://www.stdput.com/dat/pg/cutstr.zip 手抜きでutf-8限定だけどね >>719 C言語で独自実装してるからやり直し -------- 引数のファイルから指定した文字数をファイルへ出力します コンパイルを行う為にg++が必要です g++をインストールした後にcomp.shを実行して下さい # apt install -y g++; $ cd /(cutstrのディレクトリ)/; $ sh ./comp.sh; -------- 実行ファイル pg_cutstr.out 引数 -i 対象とするファイル -n (出力する数) -i 結果を出力するファイル -------- 実行例 ./pg_cutstr.out -i /tmp/input.txt -n 8 -o /tmp/output.txt -------- bashの機能をざっと見ていたらこんなの見つけたんだけど http://manpages.ubuntu.com/manpages/bionic/ja/man1/bash.1.html /dev/fd/fd fd が有効な整数ならばファイル・ディスクリプター fd が複製されます。 /dev/stdin ファイル・ディスクリプター 0 が複製されます。 /dev/stdout ファイル・ディスクリプター 1 が複製されます。 /dev/stderr ファイル・ディスクリプター 2 が複製されます。 /dev/tcp/host/port host が有効なホスト名またはインターネットアドレスで port が整数のポート番号 ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。 /dev/udp/host/port host が有効なホスト名またはインターネットアドレスで port が整数のポート番号 ならば、 bash は対応するソケットに対して UDP 接続のオープンを試みます。 インターネットアドレスで接続できるんだーは、これみてなんとか使い方わかったんだけど https://suztomo.hatenadiary.org/entry/20080430/1209574954 /dev/fd/fd これってどうやって使えばいいの? 2> /dev/fd/1 2> /dev/stdout 2>&1 等価だろう。大体は 2>&1 だろうけど、2>&1 じゃなく上の方がとかは out=/dev/null # or /dev/1(/dev/fd/stdout) or /path/to/file, etc 2> $out とかしたいとかかな。0/1/2以外は exec で自分で(FIFOとか)割り当てたのとか /dev/fd/100 とかできるんじゃないかと思って もしかして/dev/fd/fdを使って新しいファイルディスクリプタを作れないのか? $ a=$(printf '\0\n') -bash: 警告: command substitution: ignored null byte in input っていうエラーが出るんだけどさ、これだとでない printf '\0\n' | read a なんでreadだとこのエラーはださないんだろう? 誰か理由わかる? >726 それは「警告:コマンド置換:入力のヌルバイトを無視しました」を取り除きます という内容なので全くの無関係です なぜこんな簡単な質問が理解できないのか、疑問に思います。 質問は明らかにこれです。 > なんでreadだとこのエラーはださないんだろう? readはコマンド置換じゃないから。 なんでこんな単純なことが理解出来ないのか、理解に苦しむ すごいな。本当に質問を理解できてなかったよ。 なぜコマンド置換ではない場合は、エラーを出さないことにしたのか? という質問だろ >なぜコマンド置換ではない場合は、エラーを出さないことにしたのか? 昔は出ていたんですか? ふう・・・昔はどうだったかなんて>>726 を読めばわかるだろ 話にならない だったら質問がおかしいだけでは? ほんと話にならないw 言ったな?なら質問のどこがおかしいか指摘できないなら お前が間違ってることになる。はいどこがおかしいか言ってみて まあまたいつものやつだろうな。他人の話を聞かないで 自分の思い込みで発言して、指摘されたら逆切れ ソース読んでも意図はわからんだろうな 元々あったが無効に(#if 0)になってたのが有効に(#if 1)なったていうだけっぽい、ソース上だけでは なぜこんな簡単な文章を最後まで読まずに無関係だと決めつけるのか、疑問に思います。 >>738 やっぱ意図はわからんか >>739 意図はわからんだろうなと言ってる人がいますが、 それで意図の話とどう関係するんですか? > なんでreadだとこのエラーはださないんだろう? >なぜコマンド置換ではない場合は、エラーを出さないことにしたのか? ある意味認識が逆。でなくて、単に、 コマンド置換とこだけ(そもそもコード上でもあった)メッセージを出すようなった というのだろう そういう認識を持っていた(本当に持っていたかは知らんけどw)ら、お前に対して言っているのも間違いではない 単なるちょっとした行き違いとしろよ。お前の質問文がズレてるのもあるしそれなのにお前から挑発してるしw、何で コマンド置換とこだけ(そもそもコード上でもあった)メッセージを出すようなった のかはちょっと調べた範囲ではわからなさそうだからな=そのせいでバグとされて対応に追われてるのがわんさかあるのに、何でbash 4.4(?)からそうなったのか言及されてるのはなさげ パイプは、エラーメッセージを出したらダメ。 後ろにつながらない 出ていても、標準出力には出せない。 結果を、後ろに標準出力で渡すから 標準エラーか、エラーログに出さないといけない >>742 > コマンド置換とこだけ(そもそもコード上でもあった)メッセージを出すようなった どっちでもいいわw なんでコマンド置換「だけ」だしたのか?その意図がわかる? 言っとくけど質問は「だけ」だからな 「だした」理由なんかわかってる なぜコマンド置換のとこ「だけ」なのか >>743 標準出力にエラーを出すなんて発想は最初からなかった 標準エラー出力に出すに決まってるよ >>745 お前は人の文の意図さえ全く読めないのか てか、また自分の非/ミスは全く認めないその文からは... そんな「知ってた」はずなら、質問は的確だっただろうに、そのごまかしからもやはり... だったら、終了だな。すでに>>742 って書いてるからな お前がやはりいつものやつだったらいつもの通り読めないんだろうけどw >>748 > なんでreadだとこのエラーはださないんだろう? > 誰か理由わかる? この「質問」に最初に答えたレスはどれですか? どっちか判断つかなかったのは>>735 があるからなw いつものやつ本人だったら本当によくいうよだよ、ガイキチ じゃないんだったら、自分の>>735 をよく噛みしめるんだな、>>745 がまさしくお前のいう>>735 だろうにww > すでに>>742 って書いてるからな >>725 の質問の後、>>726-741 の間で質問を理解してないと言われて ようやく気づいて>>742 で答えたってことですよね? 散々指摘されてようやく >>742 で、readでこのエラーはださなかった意図は (俺には)わかりません。だからなぁ >>742 より > コマンド置換とこだけ(そもそもコード上でもあった)メッセージを出すようなった > のかはちょっと調べた範囲ではわからなさそうだからな >>749 >コマンド置換とこだけ(そもそもコード上でもあった)メッセージを出すようなった >そういう認識を持っていた(本当に持っていたかは知らんけどw)ら >>726 もそれに当たるだろうし、以下の>>729 なども返しとしてはそんなに間違っていないなw てか、そのズレてる質問、間違った質問をまだ繰り返すのだな??w >>751 ,752 やはり、いつものお前か?ああ、やっぱりお前か。ガイキチ確定かよ(?)w > >>726 もそれに当たるだろうし、以下の>>729 なども返しとしてはそんなに間違っていないなw 大間違いじゃん。 >>726 の答え 質問 AとBが候補として考えられるのに、Bだけやった「意図」は? 答え Bだけやりました >>729 の答え 質問 AとBが候補として考えられるのに、Bだけやった「意図」は? 答え AはBじゃないから 「意図」を全く答えてない 0点だろw 散々指摘も何も、俺は>>738 からだからな。単に>736のレスに興味持ってそれに対してからの お前の疑問は別に否定してないのになあwどっちの言い分もまあわかるっていう感じなw なんかまた妄想のストーリー描いているようだけど、トンチンカンなレススンア >>754 すでに書いたろ。やはり読めないようだけど お前の欲しいレスだけくれなんてお前の都合なんて、レスを書くやつに強制しても無駄だぞ?お前自体してないんだからww > すでに書いたろ。 それはさんざん質問を理解してないと言われた後な >>754 で書いたけど >>726 も>>729 も的外れだってことは否定しないよな? そういうことだよ。否定しないくせに否定するなとw >>755 って書いてるのに未だにw また明らかに自分のミスを誤魔化すためだけのレスだな。しょうもない だから「質問を理解してない」って話題はここなわけ 728 自分:デフォルトの名無しさん[sage] 投稿日:2021/02/01(月) 03:00:33.65 ID:45FIRZtx [2/2] なぜこんな簡単な質問が理解できないのか、疑問に思います。 質問は明らかにこれです。 > なんでreadだとこのエラーはださないんだろう? 729 名前:デフォルトの名無しさん[sage] 投稿日:2021/02/01(月) 03:25:24.42 ID:srTHfdLe [1/4] readはコマンド置換じゃないから。 なんでこんな単純なことが理解出来ないのか、理解に苦しむ お前が出てきたのは後からじゃん。 後から来て質問と無関係の話をしてるやつを擁護してくるなと その本人が本当にはどう思っていたかは知らんが>>753 に書いた通り。そんなお前の都合の良い方だけに与しない 別に間違っているとは思えなく読める。読めない/誤魔化したいだけのお前にはわからんだろうが また、>>750 って書いてるのに、まだ続けるのか。さすがだな...w また誤魔化すだけの話題変えるしなwwガイキチの粘着質は尽きないな なんつーか、質問がはっきりしてるのにその質問を無視して アホを擁護するとか、まあいつもの流れだよなぁw 質問に答えるだけでいいんやで? それ以外の話はお前とは関係ないやろ? 質問に答えてあとは黙ってればいいだろ? 本当にお前がしたいのは、質問と関係ない話をして 日頃の鬱憤でも晴らしたいんか? どっちの言い分もまあわかるっていう感じなだからな。また質問がズレてるとおも言ってるしな(それが元凶だろうという意味だぞw) 全然人のを読めないのな どういうオチなのか知らんがよく>>750 なんて書けたなあっていうだけのオチだなw >>763 よくいうよwww まあ素晴らしいオチとしておくよ。別に笑いを誘ったわけじゃないんだろうけどww 書いてるだろうに...わからんのか。かやはりお前は読めないやつだな...つくづく呆れるw 書いてる言ったからには、その書いてるレスを引用する必要がある そうすればお前の主張する「書いてる」が間違いだとわかるだろう お前は偉そうなくせに教えてくれくんだなあ...つくづくそう思う そんなヤツはどう扱われる/見られるなんて普通知っているもんだが、さすがだなw 誤魔化そうとすればするほどドツボなのも、さすがすぎてすげえよw それがお前がどうしてもレスしたかった事なんだよな?w >>730 にこう書いてあるねぇ >なぜコマンド置換ではない場合は、エラーを出さないことにしたのか? コマンド置換じゃないから。>>729 で書いた時点で話が終わってるはずなんだが。 ごめんなさい言えばいいだけなのに、20近いレスで 言い訳ばかり書いてるような頭じゃ理解できないんだろうな >>773 なんでコマンド置換じゃないときはエラーを出さないようにしたの? コマンド置換だしたからだろ? どちらもnullがあったらかってに除去するという処理をしていたのに なぜかコマンド置換の場合だけエラーを出すようにした それはなぜか?その理由が>>729 に書いてあると言ったよね? >>776 readはコマンド置換じゃないから。 って書いてあるじゃないか。 ignored null byte処理が実装されたのは、 コマンド置換: 2.05-alpha (この時点ですでにメッセージを出力する文もあることはある) read: 4.3 (メッセージを出力する文はまだない) コマンド置換でメッセージ出力するようにしたのは 4.4-betaからで、readでメッセージを出力するのは時期尚早なんだろうw readとコマンド置換が同じじゃなくてはというようなことを言い張ってるが、bashの中の人は別に同じとは思ってないんだろう 他に構文解析かな??のとこでも同じように ignored null byte を出力する文はあることはあるしな(言い張ってるゼロイチ論ではこっちもじゃないのか?) >まあまたいつものやつだろうな。他人の話を聞かないで >自分の思い込みで発言して、指摘されたら逆切れ どの口いやどの頭でこんなことほざいたんだか。いやあの頭だからか >>778 コマンド置換ではないreadは出さない「理由」はなんですか? が質問ですよ? readで出さない理由はわからないけど readはコマンド置換じゃないから出しませんでした。 だと「理由はわからない」が答えになります。OK? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる