X



シェルスクリプト総合 その37
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
垢版 |
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/
0851デフォルトの名無しさん
垢版 |
2022/10/04(火) 21:21:17.34ID:GpOlx84l
クォートがダブルクォーテーションとは限らないしそもそもクォートされてるとも限らない
0852デフォルトの名無しさん
垢版 |
2022/10/04(火) 23:27:34.84ID:CNGS9dK7
シェル芸では、CSV をAWK で書くけど、

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

だから問題では、それらは存在しない事になっていて、現実的ではない。
シェル芸は、あくまでもパズル。頭の体操
0854デフォルトの名無しさん
垢版 |
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 &'
0855デフォルトの名無しさん
垢版 |
2022/10/08(土) 07:32:17.40ID:sJ7nSBE8
さすがに一行すぎるwww
0856デフォルトの名無しさん
垢版 |
2022/10/08(土) 08:58:04.16ID:ZJ2MUJ2n
シュル芸って一行ならなんでもいいのけ?
1000行ぐらいのシェルスクリプトだって
セミコロンでつなげば一行になると思うが?
0857デフォルトの名無しさん
垢版 |
2022/10/08(土) 17:52:45.45ID:sJ7nSBE8
ネタをネタとわからない人は・・・
0858デフォルトの名無しさん
垢版 |
2022/10/09(日) 10:39:58.10ID:CEIVYWT/
./自作便利コマンド.rb

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



./OSS便利コマンド

だって、これはシェル芸やろ?w
0859デフォルトの名無しさん
垢版 |
2022/10/09(日) 15:35:04.77ID:pTe7tmBB
見たやつにへぇーボタンを押させるかどうかよ すべってたり寒かったらスルーされるだけ
0860デフォルトの名無しさん
垢版 |
2022/10/09(日) 16:31:25.65ID:j4hTJmxG
すでに定義が貼られてるのにこれは?これは?って聞いてるのバカすぎるだろ
0861デフォルトの名無しさん
垢版 |
2022/10/09(日) 17:24:33.51ID:CEIVYWT/
>>860
定義に自作コマンドを使ってはならないなんて書いてないぞ
だから使っていいよねって話
0863デフォルトの名無しさん
垢版 |
2022/10/09(日) 17:52:14.19ID:CEIVYWT/
>>862
最初からそういえばいいだろ?
なんで最初から「いいよ」って返信しなかったの?
0866デフォルトの名無しさん
垢版 |
2022/10/09(日) 18:59:37.92ID:oIDn8Gmd
もめてんのか?
おっちゃんが仲裁してやろうか?
0868デフォルトの名無しさん
垢版 |
2022/10/10(月) 08:55:39.46ID:ASWlLsU8
道理にかなってるとかじゃなくて面白いかどうかなのに、
アスペにはわからない模様
0872デフォルトの名無しさん
垢版 |
2022/10/15(土) 20:43:57.71ID:aC7xlUxJ
POSIXに準拠したtarを作ればいいじゃん
0873デフォルトの名無しさん
垢版 |
2022/10/16(日) 00:36:11.22ID:EpE6LQff
POSIX準拠とかこだわってどうするんだろう?
絶対に完全オフライン環境でも使えなければならない理由があるなら別だが、そうでなければ無いものはダウンロードすればいいだけなのに
0874デフォルトの名無しさん
垢版 |
2022/10/16(日) 01:44:06.87ID:AdicRi1j
>>873
おろかものめ。Pythonやライブラリを使うとソフトウェアの持続性が短くなる
シェルスクリプトはメンテンスフリーだ。古いOSから最新OSにまで対応できる
ファイルをコピーするだけでいいからインストールが簡単だ

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

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

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

シェルスクリプトの可搬性が低いとか言ってるやつは
どのOSでも動く書き方を知らんだけだ
POSIXがあるのだからシェルスクリプトの可搬性は高い
0881デフォルトの名無しさん
垢版 |
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 準拠のスクリプトを素人プログラマーが下手に
修正してエンバグするほうが余程リスクが高いわ。
0882デフォルトの名無しさん
垢版 |
2022/10/17(月) 23:58:11.53ID:HOU4mi8w
リスクを恐れてノーベルプライズを獲れるだろうか。
0883デフォルトの名無しさん
垢版 |
2022/10/18(火) 15:29:29.95ID:4FAzKYYu
2045年に特異点、政府のムーンショット計画が2050年だからそこまで動けばいいや
0884デフォルトの名無しさん
垢版 |
2022/10/19(水) 19:49:59.67ID:xl7PC10Z
いま作ってるシェルが糞コード過ぎて恥ずかしいからさっさとこの現場から離任したいわ
0885デフォルトの名無しさん
垢版 |
2022/10/19(水) 20:23:40.42ID:if0dD1Eh
へー、シェル作ってるんだw
そりゃクソな現場にふさわしいクソな人材だねぇ
0886デフォルトの名無しさん
垢版 |
2022/10/21(金) 23:00:45.82ID:TEKOXySm
>>426が書いてるように、
bashですらスクリプトファイルの逐次read中にスクリプト実行までやるのは不思議だわ
0888デフォルトの名無しさん
垢版 |
2022/10/22(土) 01:01:08.46ID:w0vCAaPV
実行時にコード生成してそれを実行するなら
runtime_code_generator |bash
で済むしなあ

入出力を<>(rw)で開いて0&>1でウロボロス実行方式を閃いた
何でもいいから非同期バッファ(cat &とか)挟まないと自分が書きにやって来る(書いてるから来ない)のを待たされてデッドロックしそうだが
0891デフォルトの名無しさん
垢版 |
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
0893デフォルトの名無しさん
垢版 |
2022/10/31(月) 23:10:15.52ID:Sg749A95
"c:\test\e01"
の文字列をkshで書く際に
"c:\\test\\e01"
とすると"c:\test□01"と化けてしまうのですが、
どう記載したら良いでしょうか。
0894デフォルトの名無しさん
垢版 |
2022/10/31(月) 23:54:05.96ID:8d/Em0+h
そもそもコマンドは何?勝手にc風エスケープ受け付けるコマンドと仮定するけど

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

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

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

という前提はok?
0896デフォルトの名無しさん
垢版 |
2022/11/05(土) 13:54:01.79ID:tvTqkbo5
"#!"機能の有無の検出って、シェルでどう書くんだっけ?
0899デフォルトの名無しさん
垢版 |
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

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

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

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

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

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

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

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

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

自分で言うのもアレだけど、>>903にSVR改修、パスサーチ、言語毎の#!機構用ワークアラウンドに対するワークアラウンド…
を加えていけば、一体どんなモンスターになるやら
0915デフォルトの名無しさん
垢版 |
2022/11/05(土) 17:48:14.73ID:/GinkP0r
変な工夫を凝らして変死するのが最も厄介

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

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

でも、これ自体はmetaconfigが自動生成したやつだしな…
0917896
垢版 |
2022/11/05(土) 22:42:53.63ID:/vhGZAk/
>>899
-P Convention………lisperの『味』だぜ……
0919896
垢版 |
2022/11/06(日) 16:23:58.52ID:6IpVpf3a
UNIX板のシェルスクリプトスレの方がいいのだろうか…

>>908
レトロゲームをやりこむのに近い行為なのかもです
0922デフォルトの名無しさん
垢版 |
2022/11/10(木) 16:24:36.94ID:klH1mu/P
UNIX板は過疎板
0925デフォルトの名無しさん
垢版 |
2022/11/10(木) 19:50:54.97ID:eyva6wLj
>>924
あとサーバー系もUNIXは終わってるよね
ハードウェアを作っているところが
ドライバを非公開にして、ハードウェアを
販売したいってところでしか使われてない
0928デフォルトの名無しさん
垢版 |
2022/11/11(金) 12:25:02.65ID:dkXTOyUr
そのページはWebサーバ限定で、しかもUNIXは80.3%使用されてるって書いてあるけど…

仮にlinuxとBSDを抜いたとしても、
0.803×0.533=約40%は使われてる計算
0932デフォルトの名無しさん
垢版 |
2022/11/11(金) 22:25:10.60ID:aBiT4hkd
どっちもどっち
unknownはlinux含むunix
linuxを除くunixがそこに何%含まれてるかは分からない
だからunixのシェアが0.1%とも40%ととも言えない
0934デフォルトの名無しさん
垢版 |
2022/11/11(金) 23:15:32.87ID:yV2t16iO
基盤なunixは変わらず生き続ける
linuxは傍流でしかない、仕様策定上は。bashismで見られるようにw
linux使ってるだけのlinux中だろな。中学生な
0935デフォルトの名無しさん
垢版 |
2022/11/12(土) 00:47:02.31ID:Cj/ueztB
>>934
分かった分かった。

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

このように言えってことだろ
分かってるって
0937デフォルトの名無しさん
垢版 |
2022/11/12(土) 19:15:00.71ID:2bWZf5Rs
あるディレクトリの下にサブディレクトリがいくつかあって、それぞれのサブディレクトリの中にはファイルがいくつかずつある
このサブディレクトリ群内のファイルを対象に作成日時が新しいものから順に任意の個数を選んでサブディレクトリ名を含んだパス名を出力する場合どう書く?
0942デフォルトの名無しさん
垢版 |
2022/12/15(木) 20:10:29.53ID:xAICKfjX
bashの実行中上書き動作ってどういう時に役立つの?
0944デフォルトの名無しさん
垢版 |
2022/12/15(木) 21:57:10.51ID:RzHoZPr/
超Geekぐらいだろな、役立つように使おうとするのは
機能としてではなく限られたメモリ上でどうするかでそうなったんじゃね
>>943
バイナリの正当な(?)実行ファイルもそうなのか?
あり得ないけど=今時のUnix系OSはそうはならない
0945デフォルトの名無しさん
垢版 |
2022/12/15(木) 22:14:44.89ID:a9LNvh7S
UNIX/Linuxにはアドバイザリロックしかないんだから
実行中にファイルは書き換えられる
バイナリ実行ファイルは、スクリプト言語とは違って
最初にメモリに全部読み込むってだけ
0946デフォルトの名無しさん
垢版 |
2022/12/15(木) 23:02:40.00ID:DSr8QAEc
そもそも、シェルやしな。
インタラクティブが前提なら必要なとこまでしか読んどらんやろから、自然とそうなるんちゃうか。
0947デフォルトの名無しさん
垢版 |
2022/12/15(木) 23:11:24.42ID:a9LNvh7S
インタプリタっていうのは元々そういうもんだと思うけどね
一行ごとに解釈するものなんだから、必要ないところまで読み込む必要がない

最近のスクリプト言語は最初にファイル全体を解釈して
内部的にバイナリにしているような気がするけど
それもファイル単位で動的にファイルを読み込むこともあるし
0948デフォルトの名無しさん
垢版 |
2022/12/15(木) 23:16:12.82ID:5ZR90K1l
昨年末にHP(が作成したスクリプト)が京大のスパコンデータを吹き飛ばした事故があったけど、あれも原因は「実行中のシェルスクリプト書き換え」だったはず
0949デフォルトの名無しさん
垢版 |
2022/12/15(木) 23:19:14.14ID:a9LNvh7S
普通にバックアップ処理実行中に
プログラムアップデートするなって話だな
0950デフォルトの名無しさん
垢版 |
2022/12/16(金) 09:17:10.65ID:OmUfbGxN
>>947
opengroupはシェルスクリプトのコンパイルとか静的解析とか、なにやら不穏な事を考えているよう
One justification for ignoring the contents of IFS upon entry to the script, beyond security considerations, is to assist possible future shell compilers. Allowing IFS to be imported from the environment prevents many optimizations that might otherwise be performed via dataflow analysis of the script itself.
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

寡聞だが珍妙な事やってるシェルなんて知らないし、シェルスクリプトなんてロートルなのがむしろ魅力なのにな

ちなみに俺はexitの後に>>"$0"でデバッグ中のログ取りしてる、別にログファイル作るのめんどいしバッファ再読み込みでエディタにすぐフィードバックが得られる

他のビルトインの項を見ても珍妙な展望(?)が見られて面白い、誰が望むんだこれ
It is anticipated that a future implementation could take advantage of this and provide something like:

outofloop: for i in a b c d e
do
for j in 0 1 2 3 4 5 6 7 8 9
do
if test -r "${i}${j}"
then break outofloop
fi
done
done

and that this might be standardized after implementation experience is achieved.

実装に先走って舵取りまでやりたいのかこいつら、傲慢もいいとこ
0951デフォルトの名無しさん
垢版 |
2022/12/16(金) 09:26:55.18ID:OmUfbGxN
exitやexecの先まで読まれるとtclやperlのように頭だけシェルスクリプトとして読まれて、読まれない部分にコードを記述するインタプリタや、到達しない部分をデータ置き場として使ってるスクリプトが困るような

まあ展望されている実装が十分賢くて、そこでシンタックスエラー出さないなら問題無いんだけど
レス数が950を超えています。1000を超えると書き込みができなくなります。

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