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

レス数が900を超えています。1000を超えると表示できなくなるよ。
2021/10/05(火) 22:49:30.91ID:KsbWuyFp
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。

前スレ: シェルスクリプト総合 その36
https://mevius.5ch.net/test/read.cgi/tech/1614212414/

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】11
https://mao.5ch.net/test/read.cgi/linux/1627507889/
・Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/
・シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/
・zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/
・過去UNIXで使われていた ksh というシェルについて
https://mevius.5ch.net/test/read.cgi/unix/1582358403/
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
・おまえら! shell は何を使っているんですか?
https://mevius.5ch.net/test/read.cgi/unix/1012330865/
2022/10/04(火) 03:10:11.52ID:F9I3VOct
俺が作ったcsvパーサーなら、ファイルを適切なところにコピーするだけで動く
rubyのインストールは難しい。誰にでもできるような作業じゃない
2022/10/04(火) 03:13:47.12ID:F9I3VOct
俺が作ったcsvパーサーはコメント除いて200行ちょっとしかない
たった200行書くだけでrubyは不要になる
200書く方がインストールよりも簡単だ
2022/10/04(火) 03:50:56.15ID:PkeNAHz9
押しが強いのばかりだな。なんでお前らそんなのきもいのか
846デフォルトの名無しさん
垢版 |
2022/10/04(火) 06:08:41.35ID:d4cMYyPK
何かワロタw
2022/10/04(火) 15:15:12.62ID:M2uNOhVe
とはいえCSVの扱い方っていうのはまあまあのバカ発見器だと思う
848デフォルトの名無しさん
垢版 |
2022/10/04(火) 15:36:06.28ID:VPNCWU/y
というと?
2022/10/04(火) 16:05:16.77ID:d0x64lde
Rubyのインストールが難しいとか言ってるやつの書いたCSVパーサーww

使ってるやつ絶対アホ
2022/10/04(火) 16:14:37.74ID:LlVt6c8r
ダブルクォーテーション内のコンマ改行、エスケープ文字、空白、空行、末尾コンマ、行ごとの列数ブレの扱いや、エンコード、読み込みバッファの使い方とかかしら
2022/10/04(火) 21:21:17.34ID:GpOlx84l
クォートがダブルクォーテーションとは限らないしそもそもクォートされてるとも限らない
2022/10/04(火) 23:27:34.84ID:CNGS9dK7
シェル芸では、CSV をAWK で書くけど、

ダブルクォーテーション内に、
ダブルクォーテーション、行区切り文字の改行、列区切り文字のカンマがあるとバグる

だから問題では、それらは存在しない事になっていて、現実的ではない。
シェル芸は、あくまでもパズル。頭の体操
2022/10/05(水) 01:52:54.69ID:SF0K7+3w
>>852
シェルスクリプトで書いた
200行のawkスクリプトを使えば
シェル芸出来る
2022/10/07(金) 21:40:47.14ID:/7BkWz35
おまえらこういうのがシェルゲイだよ
/bin/sh -c 'while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-32));date;tput rc;done &'
855デフォルトの名無しさん
垢版 |
2022/10/08(土) 07:32:17.40ID:sJ7nSBE8
さすがに一行すぎるwww
2022/10/08(土) 08:58:04.16ID:ZJ2MUJ2n
シュル芸って一行ならなんでもいいのけ?
1000行ぐらいのシェルスクリプトだって
セミコロンでつなげば一行になると思うが?
857デフォルトの名無しさん
垢版 |
2022/10/08(土) 17:52:45.45ID:sJ7nSBE8
ネタをネタとわからない人は・・・
2022/10/09(日) 10:39:58.10ID:CEIVYWT/
./自作便利コマンド.rb

こういうのもシェル芸になるのかな?w



./OSS便利コマンド

だって、これはシェル芸やろ?w
2022/10/09(日) 15:35:04.77ID:pTe7tmBB
見たやつにへぇーボタンを押させるかどうかよ すべってたり寒かったらスルーされるだけ
2022/10/09(日) 16:31:25.65ID:j4hTJmxG
すでに定義が貼られてるのにこれは?これは?って聞いてるのバカすぎるだろ
861デフォルトの名無しさん
垢版 |
2022/10/09(日) 17:24:33.51ID:CEIVYWT/
>>860
定義に自作コマンドを使ってはならないなんて書いてないぞ
だから使っていいよねって話
2022/10/09(日) 17:38:55.72ID:j4hTJmxG
>>861
うん、いいよ。だからいちいち聞かなくておk
863デフォルトの名無しさん
垢版 |
2022/10/09(日) 17:52:14.19ID:CEIVYWT/
>>862
最初からそういえばいいだろ?
なんで最初から「いいよ」って返信しなかったの?
2022/10/09(日) 18:05:06.86ID:0M9/zkAJ
聞く前から答えが分かってるからだろ馬鹿w
2022/10/09(日) 18:22:07.86ID:CEIVYWT/
>>864
だからその答えを言えばいいだけだろwww
866デフォルトの名無しさん
垢版 |
2022/10/09(日) 18:59:37.92ID:oIDn8Gmd
もめてんのか?
おっちゃんが仲裁してやろうか?
2022/10/09(日) 19:29:32.64ID:CEIVYWT/
>>866
どんな面白いことを言うのか
評価してやるからやってみ
868デフォルトの名無しさん
垢版 |
2022/10/10(月) 08:55:39.46ID:ASWlLsU8
道理にかなってるとかじゃなくて面白いかどうかなのに、
アスペにはわからない模様
2022/10/10(月) 09:26:26.12ID:87F2gLmT
>>868
それお前の感想ですよねw
2022/10/12(水) 21:53:12.49ID:MhrQ6ttv
tarの書き方で歳が分かる
2022/10/12(水) 22:20:40.52ID:HU6qoXxl
tarはPOSIXに準拠してないので使わない
872デフォルトの名無しさん
垢版 |
2022/10/15(土) 20:43:57.71ID:aC7xlUxJ
POSIXに準拠したtarを作ればいいじゃん
2022/10/16(日) 00:36:11.22ID:EpE6LQff
POSIX準拠とかこだわってどうするんだろう?
絶対に完全オフライン環境でも使えなければならない理由があるなら別だが、そうでなければ無いものはダウンロードすればいいだけなのに
2022/10/16(日) 01:44:06.87ID:AdicRi1j
>>873
おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
シェルスクリプトはメンテンスフリーだ。古いOSから最新OSにまで対応できる
ファイルをコピーするだけでいいからインストールが簡単だ

POSIXは1988年に規格化されてからほとんど変わらない
POSIXに準拠していないものは移植性が低い
POSIXに準拠していればLinuxでもMacでもいつでもどこでも動く製品を開発可能だ
これはシェルスクリプト以外では不可能だ
POSIXだけが25年経ってもメンテナンスせずに動き続けるソフトウェアを作れるのだ
2022/10/16(日) 02:26:07.88ID:JzUhNpEc
まあブーブーいうなよ あんたもどうせそのPOSIXが標準化に失敗したtarを使ってるんだろう?
876デフォルトの名無しさん
垢版 |
2022/10/16(日) 22:42:44.89ID:ZGQtChBm
少なくとも、macOSはPOSIX準拠ってことになってるけど使えない機能あるけどな。
2022/10/17(月) 12:18:15.97ID:lr6vgl7q
>>874
> おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
> シェルスクリプトはメンテンスフリーだ。

セキュリティホールあきっぱなしの /bin/sh 実装でもスクリプトが実行できるガバガバ運用ってだけでしょ。
メンテナンスせずに動き続けるって事こそが危険だから Python は下位バージョン切り捨ててるわけで。
2022/10/17(月) 20:48:54.25ID:gqwh4i+l
本当に何十年も使われることが想定されるものを作っているならいいけど、なんとなく「寿命長い方がいいよね」程度の理由でPOSIXに拘って結局暫くすれば使われなくなるなら結果的にかなり生産性悪い作業でしかない
879デフォルトの名無しさん
垢版 |
2022/10/17(月) 21:48:02.26ID:kiowcDiZ
>>877 >>878
そうやって今まで使っていたアプリケーションが
OSをアップデートしたらいきなり動かなくなって
長い間システム停止して大損害が発生するわけだ
その責任をお前らは取れるのか?

シェルスクリプトで作っていれば何十年後でも動くし
ファイルコピーだけで別の環境で動く。何も修正する必要はない

シェルスクリプトの可搬性が低いとか言ってるやつは
どのOSでも動く書き方を知らんだけだ
POSIXがあるのだからシェルスクリプトの可搬性は高い
2022/10/17(月) 23:36:35.68ID:ih01gahk
そんなことなら、Perl5が必要充分以上やな。
2022/10/17(月) 23:40:16.19ID:lr6vgl7q
>>879
OS アップデートで動かなくなる状況の場合はカーネル/libcがらみで dash も影響受ける。
OS じゃなくて言語・インタプリタのアップデートの場合も過去の失敗から java やら python は複数
バージョンインストールするようになってる。 /usr/bin/python3.6 とか入ってるだろ?

/bin/sh が POSIX 非互換なのか dash なのか bash なのかは非決定的なのにいつまでもシェバン
に /bin/sh って書く方がおかしい。

メンテナンス性の悪い POSIX 互換で書くよりシェバンに /bin/bash って書いてメンテナンス性良い/
簡潔なスクリプトを書くべき。 難読な POSIX 準拠のスクリプトを素人プログラマーが下手に
修正してエンバグするほうが余程リスクが高いわ。
882デフォルトの名無しさん
垢版 |
2022/10/17(月) 23:58:11.53ID:HOU4mi8w
リスクを恐れてノーベルプライズを獲れるだろうか。
2022/10/18(火) 15:29:29.95ID:4FAzKYYu
2045年に特異点、政府のムーンショット計画が2050年だからそこまで動けばいいや
884デフォルトの名無しさん
垢版 |
2022/10/19(水) 19:49:59.67ID:xl7PC10Z
いま作ってるシェルが糞コード過ぎて恥ずかしいからさっさとこの現場から離任したいわ
2022/10/19(水) 20:23:40.42ID:if0dD1Eh
へー、シェル作ってるんだw
そりゃクソな現場にふさわしいクソな人材だねぇ
886デフォルトの名無しさん
垢版 |
2022/10/21(金) 23:00:45.82ID:TEKOXySm
>>426が書いてるように、
bashですらスクリプトファイルの逐次read中にスクリプト実行までやるのは不思議だわ
2022/10/22(土) 00:38:46.67ID:w0vCAaPV
>>"$0"ができて嬉しいこと?
2022/10/22(土) 01:01:08.46ID:w0vCAaPV
実行時にコード生成してそれを実行するなら
runtime_code_generator |bash
で済むしなあ

入出力を<>(rw)で開いて0&>1でウロボロス実行方式を閃いた
何でもいいから非同期バッファ(cat &とか)挟まないと自分が書きにやって来る(書いてるから来ない)のを待たされてデッドロックしそうだが
2022/10/22(土) 01:01:42.39ID:w0vCAaPV
よし、要らんな
2022/10/22(土) 01:20:59.11ID:ZKLK2IoP
echo 成功を祈るだべぇ >|"$0"
2022/10/24(月) 09:33:19.96ID:P2J4rO7b
パスワード生成
cat /dev/random | tr -dc '[:alnum:]' | fold -w 16 | grep '[[:digit:]]' | grep '[[:upper:]]' | grep '[[:lower:]]' | head -n 1
2022/10/24(月) 13:21:29.09ID:LufpLpQ3
>>891
そんなアホみたいなことしてないでmkpasswd使え
893デフォルトの名無しさん
垢版 |
2022/10/31(月) 23:10:15.52ID:Sg749A95
"c:\test\e01"
の文字列をkshで書く際に
"c:\\test\\e01"
とすると"c:\test□01"と化けてしまうのですが、
どう記載したら良いでしょうか。
2022/10/31(月) 23:54:05.96ID:8d/Em0+h
そもそもコマンドは何?勝手にc風エスケープ受け付けるコマンドと仮定するけど

\tにはちゃんと\効いてるのに、よりマイナーな\eをesc文字と解釈するのが気持ち悪いな

とりあえず'(シングルクオート)でそのまま囲めば?
2022/11/01(火) 00:00:32.67ID:XWm3usXf
初歩的過ぎ、あるいはkshでは違ったらごめんだけど

"\\"はコマンド関係無しにシェルが\と解釈する
後はコマンドが解釈する

という前提はok?
896デフォルトの名無しさん
垢版 |
2022/11/05(土) 13:54:01.79ID:tvTqkbo5
"#!"機能の有無の検出って、シェルでどう書くんだっけ?
2022/11/05(土) 13:57:55.08ID:0q4aURph
"#!"機能の有無ってなんだよ?
2022/11/05(土) 13:58:30.81ID:0q4aURph
#!/usr/bin/perl の場合を例にして言ってみて
2022/11/05(土) 14:14:53.38ID:0pCmU1l8
>>896
実際に呼んでみれば?

echo '#! /usr/bin/echo true' >hash-bang-p
chmod u+x hash-bang-p

if ./hash-bang-p |col1; then
# assume implicit invocation available.
else
# don't rely on the mechanism,
# explicitly specify interpreter.
fi

的な感じで
2022/11/05(土) 14:20:51.30ID:0pCmU1l8
ごめんcol1じゃダメそうだわ
機構が有効なら./hash-bang-pは文字列を返して、そうでなければ返さない(例:sh ./hash-bang-p)
事に注意してよしなに
901896
垢版 |
2022/11/05(土) 14:29:19.32ID:l9nmx+fu
>>897
SVR2とかは>>898みたいに書いても、単にコメントとして処理されてたんです
(この例だとperlは実行されない)

>>899
やぱし呼んでみるしかないか…
2022/11/05(土) 14:33:42.19ID:0q4aURph
SVR2なんか今時使うの?
もうとっくの昔にサポート切れで脆弱性とかあるのでは?
2022/11/05(土) 14:43:53.71ID:0pCmU1l8
>>901
#!機構で呼んでくれないけど、#!指定のインタプリタを呼びたいケース
例えば実装スクリプト言語が不明/システムにより異なる場合等
とりあえずパースすれば?

`echo "$(head -1 unknown-script)" |tr -d '!'#`

的な感じで
汚ないというのは、まあ容赦してくれ
2022/11/05(土) 14:45:39.00ID:0pCmU1l8
伝統的にスクリプト実装だけど、効率のためバイナリに置き換えられてる場合も多々あるので、fileの結果を見た方がいいかも
2022/11/05(土) 14:52:27.83ID:0pCmU1l8
分かりにくいと思うので補足>>903

例えばunknown-scriptが先の./hash-bang-pなら
中のコマンド置換は文字列
/usr/bin/echo true
を返す

外のコマンド置換でこれがコマンドとして実行され
true
が返る(はず)
2022/11/05(土) 14:55:56.67ID:0q4aURph
System V Release 2は1984年4月にリリースされたって書いてあるんだが
38年前かー。ファミコンのパックマンの発売年じゃん。
初代スーパーマリオの一年前のUNIX
そんなの使ってるなんてなんか可哀想w
2022/11/05(土) 14:58:08.92ID:0q4aURph
>>903
SVR2ならBourne Shellだからそれ動かないんじゃね?
908896
垢版 |
2022/11/05(土) 14:58:35.52ID:W/fi7cAS
>>902
そういやperl4のConfigureって判別してたよなって思い出して、
っぃ…
2022/11/05(土) 15:10:30.65ID:0q4aURph
>>908
そんな古代のOS対応するだけ無駄、さっさと切り捨てろ
昭和じゃねー。もう平成だぞ。
2022/11/05(土) 15:15:49.65ID:CaYWlfee
単に$?を見るのはダメだったの?
本質はOSがshebangをサポートしてるかどうかの判定だから、やってみて戻り値見る行為以外ないんじゃないかな
>>903みたいのはzshが内部でexecve()の失敗後にやってるけど、判定が主題ならそのconfigureのやりかたを見てみたいな
2022/11/05(土) 15:18:31.87ID:0pCmU1l8
>>907
そうか、というか仮に動いても正しく動く保証は全く無いな…
長さ制限を除いても、#!機構のパースは一般にシェル言語と全く関係がないので(特に引数やクオート)

例えばlinuxの#!機構は引数は一つまでなので
#! /usr/bin/env -Scommand\_arg1\_arg2
みたいなものが書かれる
perl等も(独自の)似たようなワークアラウンド機構を持ってたはず

そのままシェル言語として通用する文字列が得られるのは
#! /path/to/command alnumonly
くらいな気がする
2022/11/05(土) 15:24:38.61ID:0q4aURph
その頃のUNIXだったら/bin/shじゃなくて/usr/bin/shとかも
考慮しないといけないのでは?
2022/11/05(土) 15:40:46.08ID:EHQev3W6
>>912
そこまでワークアラウンドを積み重ねるくらいなら、もう潔く決め打ちで"分かりやすく"失敗して、ユーザーに適宜直してもらうべきだな

自分で言うのもアレだけど、>>903にSVR改修、パスサーチ、言語毎の#!機構用ワークアラウンドに対するワークアラウンド…
を加えていけば、一体どんなモンスターになるやら
2022/11/05(土) 15:43:33.14ID:0q4aURph
>>913
うん、で今は#!に対応してないUNIXなんてないんだから
やる意味ないよねって結論になる。
2022/11/05(土) 17:48:14.73ID:/GinkP0r
変な工夫を凝らして変死するのが最も厄介

>>899
必要かどうかはさておき少しだけ読みやすく
(hash-bang-p)
#!/usr/bin/true
false # or exit 1

if ./hash-bang-p; then
...
916896
垢版 |
2022/11/05(土) 21:40:31.60ID:/vhGZAk/
>>910
perl5のConfigure出てきた
github.com/Perl/perl5/blob/blead/Configure
これのsharpbangって変数のあたり

でも、これ自体はmetaconfigが自動生成したやつだしな…
917896
垢版 |
2022/11/05(土) 22:42:53.63ID:/vhGZAk/
>>899
-P Convention………lisperの『味』だぜ……
2022/11/05(土) 22:51:42.45ID:CaYWlfee
metaconfigのソース見ると実際にスクリプトを実行して戻り値で判定してるね
919896
垢版 |
2022/11/06(日) 16:23:58.52ID:6IpVpf3a
UNIX板のシェルスクリプトスレの方がいいのだろうか…

>>908
レトロゲームをやりこむのに近い行為なのかもです
2022/11/06(日) 16:29:03.77ID:JyiC8cnE
レトロゲーム本体がないのにどうやって動作確認するの?
2022/11/08(火) 22:58:25.15ID:6COcByZR
UNIX板って機能してるのかな
見ておいでよ
922デフォルトの名無しさん
垢版 |
2022/11/10(木) 16:24:36.94ID:klH1mu/P
UNIX板は過疎板
2022/11/10(木) 16:54:57.94ID:eyva6wLj
macOSはUNIXだけど専用板あるし
UNIXなんてもう使われてない
BSDももうおしまい
2022/11/10(木) 18:44:31.43ID:Tf4g3bvk
ユーザにとってはな
2022/11/10(木) 19:50:54.97ID:eyva6wLj
>>924
あとサーバー系もUNIXは終わってるよね
ハードウェアを作っているところが
ドライバを非公開にして、ハードウェアを
販売したいってところでしか使われてない
2022/11/11(金) 02:08:38.50ID:/ObTgJox
一般ユーザにとってはな
無知晒すのもいい加減にしろよ
2022/11/11(金) 02:58:35.00ID:M0nB3cbT
残念ながらUNIXのシェアは0.1パーセントとかなのよね
https://w3techs.com/technologies/details/os-unix
2022/11/11(金) 12:25:02.65ID:dkXTOyUr
そのページはWebサーバ限定で、しかもUNIXは80.3%使用されてるって書いてあるけど…

仮にlinuxとBSDを抜いたとしても、
0.803×0.533=約40%は使われてる計算
2022/11/11(金) 15:42:15.81ID:KNn1/gM5
>>928
unknownだろそれ
アホなのか?
2022/11/11(金) 17:55:17.80ID:35BXJdBb
>>929
アホはお前だろ。英語一文字も読めないのかよ
2022/11/11(金) 19:48:26.89ID:KNn1/gM5
どこの英語一文字の話をしているのか言ってみ
932デフォルトの名無しさん
垢版 |
2022/11/11(金) 22:25:10.60ID:aBiT4hkd
どっちもどっち
unknownはlinux含むunix
linuxを除くunixがそこに何%含まれてるかは分からない
だからunixのシェアが0.1%とも40%ととも言えない
2022/11/11(金) 23:07:06.98ID:KNn1/gM5
どっちかわからんなら
分かってるのと同じ割合を割り当てろよ
2022/11/11(金) 23:15:32.87ID:yV2t16iO
基盤なunixは変わらず生き続ける
linuxは傍流でしかない、仕様策定上は。bashismで見られるようにw
linux使ってるだけのlinux中だろな。中学生な
2022/11/12(土) 00:47:02.31ID:Cj/ueztB
>>934
分かった分かった。

Linuxは生き残る
死ぬのはBSD UnixとSystemV Unix

このように言えってことだろ
分かってるって
2022/11/12(土) 13:16:01.01ID:ndWlPBfM
頭悪い反発
2022/11/12(土) 19:15:00.71ID:2bWZf5Rs
あるディレクトリの下にサブディレクトリがいくつかあって、それぞれのサブディレクトリの中にはファイルがいくつかずつある
このサブディレクトリ群内のファイルを対象に作成日時が新しいものから順に任意の個数を選んでサブディレクトリ名を含んだパス名を出力する場合どう書く?
2022/11/12(土) 19:49:20.63ID:Cj/ueztB
どう書く?どう書く?ど~う~書く?
君ならどう書く~?
2022/11/12(土) 20:04:50.63ID:Zr4m37Yp
Perlで書く。
適材適所。
2022/11/12(土) 21:33:57.14ID:Cj/ueztB
適材適所ならシェルスクリプトの方が適してるでしょ?
2022/11/12(土) 23:40:47.58ID:2bWZf5Rs
自己解決した findのprintfオプションとsortとsedで出来た ども
942デフォルトの名無しさん
垢版 |
2022/12/15(木) 20:10:29.53ID:xAICKfjX
bashの実行中上書き動作ってどういう時に役立つの?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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