シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その28 http://mevius.5ch.net/test/read.cgi/tech/1532397676/ 他人のレスを読めないのに妄想だけは いつものことか 「求めていない」と明言していない以上、 「求めていない」なんてお前が断定するなってことだよ。 >>668 なんだろ、C Standard Libraryにそういうのがなくて各々独自実装とかかな? POSIXで明確に文字(コード)として、これこれと規定してなくて独自判断実装とかか dashはプログラムでロケール(LC_CTYPE)の設定をしてない手抜きとかか。も考えられるね。どうであろうとデフォ= Cという >>651 > 正しく動くASCII判定のをどうぞ どうぞじゃなくて、それをやってみせる大チャンスだったのでは? そうすることに意義があると思うならね。 虚栄心の塊を助けるような真似はしたくはないな俺だったら 「助ける」って表現おかしくね? だって誰も「助けてくれ」なんて言ってないじゃん。 既に質問者の「助けて」には親切な奴が答えてくれている途中だった。 正しく動くプログラムに勝手にケチ付けた挙句、なんの案も出さずに「間違ってる」だけしか言ってないよね。 それな。 こっちは「こんな感じで作れますよー」って言ってるだけ あとは簡単なので質問者でもできるだろう (できないなら何かしらのレスをするだろう) そこにいちいち、それは完璧に動かないって言うだけ。言うだけ厨w >>645 >Ruby厨「時間は0〜24の整数のみ! 時間と時刻が混ざってるようだな こういう奴が仕様作成すると大変なことになる シェルスクリプトのスレは以下に統合しました。 今後シェルスクリプトの話題はこちらで くだらねえ質問はここに書き込め! Part 236 https://mao.5ch.net/test/read.cgi/linux/1556462911/ 某知恵袋で見かけた「ID非公開」さんの質問。 > Linuxのシェルスクリプトで質問です。 > リダイレクトの0は標準入力、1は標準出力、2は標準エラー出力。 > 0、1、2の他にも、3以上の番号もあるそうです。 > これら、3以上の番号を使った例を教えてください。 カテゴリマスター sle********さんの回答 > ファイルをオープンすれば3から順に使われるのだけど。 > 0,1,2の3つしか呼び出すプログラムには伝わらないのでできないのじゃないかな。 シェルスクリプトの話だということすら理解できてないなら回答するなよ。 シェルスクリプト リダイレクト exec でググれよとか思ったけど、「ID非公開」という時点で相手にする価値が無いしなあ… まあ確かにその説明は間違ってるけど 態々Yahoo知恵袋の回答を5chに持って来てまで叩くことあるかね……。 そう言えば以前 flock コマンドを使ってここに書かれているような排他ロックを掛けるのを書いたことがある。 http://fj.hatenablog.jp/entry/2016/03/12/223319 で、リダイレクトはこの例のように 200 とか使ったのだが、しかし、これが使われていたらまともに動かないのではないかと思う。 かといって現在使われていないファイルデスクリプタを探す方法があるのかというと、Linux なら /proc/$$/fd/ 以下を見れば 良いんだろうが多分OSごとにやり方が違っていると思う。ということで開きファイルでスクリプタを探す方法は bash にあるんだ ろうか? (bash でなくても良いが)。それとも探さずともシステムコールの open() 等のように空きを探し出して使ってくれる みたいな書き方はできるんだろうか? >>680 そこは「くだらねえ質問」だろ シェルスクリプトの事も書き込んでもよいけど、 シェルスクリプト専用のスレではない! Ruby のTempfile みたいな、一時ファイルでも作れば? >>684 ,685 空いているではなく、開いているまたは開いていないならわかりそうだが : >&200 しかし、なんで012以外をも直値にしたんだろうね プログラム板にキチガイ降臨中!botに一晩も反応する異常さ 一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。 https://mevius.5ch.net/test/read.cgi/tech/1559872586/ 142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO >>141 名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、 片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか? 一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。 shebangの書き方について教えてください。 #!/bin/sh # Next line is comment in Tcl, but not in sh... \ exec tclsh "$0" ${1+"$@"} ( 出典: https://rosettacode.org/wiki/Multiline_shebang ) コメント解釈の違いを利用して複数行に云々は分かります。 ただ気になった箇所が... ${1+"$@"} これは一体どういう意味合いが込められてるのでしょうか? Tcl 以外にも Perl とかでも同様の箇所があります。 引数 $1 が unsetなら null そうでなければ "$1" "$2" "$3" . . . って事ですよね。 それって、ただ "$@" と書くのと違いが分かりません。 ちなみに公式推奨は man tclsh8.5 までは "$@" man tclsh8.6 からは ${1+"$@"} になっています。ただし説明文はそのままでした。 良い解説があったので解決しました。 https://www.in-ulm.de/ ~mascheck/various/bourne_args/ スクリプトに引数を与えない場合、 一部の古いシステムでは "$@" の解釈が nothing (何もない) ではなく "" (空文字)になってしまうからだそうです。 参考までに言っておくと、>>691 のリンク先にも書いてあるが、 古いzshは ${1+"$@"} は期待したとおりに動かない 完璧な解決方法は、例 eval exec tclsh "\"$0\"" ${1+'"$@"'} なるほど、勝手にアンクォートするようなドジっ子まで考慮しますか.... お約束 ・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。 つまりシェルスクリプトのシバンは#!/bin/shです。 他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。 macOS及び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なので注意。 (t)cshでのシェルスクリプトは*まったく推奨しません*。 (参考URL: http://www.speech-lab.org/ ~hiroki/csh-whynot.euc) ・POSIX (Portable Operating System Interface) に準拠しましょう。 有用なリンクはhttps://en.wikipedia.org/wiki/POSIX 末節などを参照。 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます) ・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。 Heirloom sh: http://heirloom.sourceforge.net/sh.html Dash shell: http://gondor.apana.org.au/ ~herbert/dash/ ・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。 「並び換え (sort(1))」「検索 (grep(1))」等々。 Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html など)を見ましょう。 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。 ・ワイルドカードは正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな bashしか使ったことないけど下手に汎用性を意識してshで書くと裏目に出るってことか 某原理主義者涙目だなそりゃ 以前(といっても10年以上前)は汎用性を考えて、 ブレース展開とかを使わずに書くようなこともしてたけど、 今はもうbashベッタリな書き方をするようになったわ。 それで困ったことはなかったし。 >>700 理由はわかるが残念な選択だな 遅いし互換性は低いし 2倍遅いくらい? システムコールでのシステム内滞在(?)の方は4倍弱かかってんのね。なんらかのシステムコールの呼び出し回数が多いのか >>705 もし理由わかったら教えてくれない? bashもだけどzshもなんでdashにくらべてあんなに遅いんだろうか kshが速いのは特定条件下でサブシェルを回避してるからってわかってるんだが シェルスクリプトというより対話シェルの話題なんだけど Kshを「業務上 仕方無く(AIX案件とか)」とかではなく使ってる人っています? 今までBashを対話シェルに使ってきたけどKshもかなり便利そうだし何より高速らしいので興味はある 公式サイト(http://www.kornshell.com/ )もあってドキュメントも充実してそうだから使ってみたくはあるんだけど 実際に令和にもなってKshを常用してる人がいるのか知りたい。 bashですら「業務上 仕方無く(Linux案件とか)」、だなあ AIXで生活できるような金持ちっているのかねw 私は業務上の制限がないので、自分の意志で bash を使っているけどね 不便を感じたことは一度もない お題はkshで生活してる人は?なのにbashで不便がないとか言われても可哀想だ for でループすると遅いから、while を使えばよい シェルスクリプトで遅いと感じるのなら それはシェルスクリプト向きではないということだ シェルスクリプトしかできないんだろう。選択肢がそれ唯一という 辛くなったら違う言語にも手を伸す機会が訪れた と捉えましょう テキストファイルごにょごにょするときはシェルスクリプト一択 なんか寧ろ 「シェルスクリプトが得意とする作業なのに シェルスクリプトを知らないせいでC#やRubyやPythonやらに固執する」 っていう例を数多く見掛けるな。特にWeb上のブログとか。 >>716 中でawk使って複雑な事をしたりしてw perl使うぐらいになったらもう全部perlにするかという気分にはなるな。 sed, awk, perl でほとんどの場合は事足りるね awk使うならsedいらんやろ perl使うならawkいらんやろ 最近は ruby も使ってるな だからって ruby 以外全部いらんとか言わないけどなw シェルスクリプトと言いながら、ほとんどをawk使って実装しているのを見ると お前大したことないなって思ってしまう。 awk は、CSV が使えないだろ それと、空白で、列を区切っている際、文字列内に空白があると、どうなるのか? 誤動作するのか? やっぱり、Ruby が楽 まあ適材適所ですよねー 自分用なら好きにすればいいけど、 仕事で超絶技巧を駆使したスクリプトを残されても困りますし。 GNU awk なら組込み変数 FPAT(Field PATtern) を使う方法が あるけど、 echo 'aaa "bbb ccc" ddd' | gawk -v FPAT='([^ ]+)|(\"[^\"]+\")' '{print $2}' まぁ使わないわな 素のwindowsで正規表現パターンの置換コマンドを使おうとする場合、 一番手軽なのはBusyBoxのsedかねぇ。 他のPCで実行する必要があるときいつも悩むわ。 いずれにしてもPython・Ruby・Perlを中途半端に知ってるせいで シェルスクリプトでやればクソ程 単純な作業を ファイル操作関数なんかをこねくりまわしてるのを見ると いやPython・Ruby・Perlなんかよりシェルスクリプトのほうがよほど 学習が簡単で仕様も短いんだからそれを使えよw とは思うな >>727 PowerShellだろ。コマンド入力と出力の例: PS C:\> "The quick brown fox jumped over the lazy dog." -replace "([^ .]{4,})", "[`$1]" The [quick] [brown] fox [jumped] [over] the [lazy] dog. シェルスクリプトでは、コマンドが別途必要ということからくる互換性を考えると、 各種スプリクト言語(公式バイナリ添付の標準モジュール)という選択にも理由があるわな。 単純なテキストのハンドリング程度なら、必要なコマンドがないなんてことはないから問題ないだろうけど。 >>731 コマンド VS 標準モジュールのコードを見比べてみるとわかるが、 ほとんどの場合、コマンドを使ったほうがシンプルである。 ぼくなんてほかのひとに仕事取られないように超絶技巧スクリプト作ってるぜ? こうしてメンテ不能なものが増えていく そういうのは個人の趣味でやってくれ sed 's/ /_/g' の空白を強調するために sed 's{ }{_}g' と書いたら通らなかったので perl -pe 's{ }{_}g' にした 「コマンドを別途用意する必要がある」からシェルスクリプトは不利っておかしくね? じゃあ他のほとんどの言語でもファイルを扱うには「OSに依存したライブラリを呼ぶ必要がある」からファイルを扱うのに互換性は損われるかもしれないよね。 その点,POSIXという古くて強大な規格があるシェルスクリプトは,少なくともファイルの標準的な扱いにおいてはかなり有利だと思うわ。 ちなみにそのPOSIXが,最低限用意しなくてはいけないコマンドを規定してるから↓ http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html ここにあるコマンドは(あまりに古すぎるuu*関連とSCCS関連を除けば)ほぼどのシステムでも利用可能で,インターフェースも統一されてる。 だからPOSIXに準拠していれば,互換性の問題はかなりの部分が解消される筈。 もちろん細かい部分で非互換な挙動はあるだろうけど,それはシェルスクリプトに限った話じゃないと思う。 C言語ソースの方がはるかにポータビリティが高いし対応できる人材も豊富だよな。 書くのとリビルドするのが面倒だからスクリプトを使うだけで。 >>739 OSクロス環境への配慮を言い出したら、シェルスクリプトだって同じでしょう。 Windows上のWSLやCygwinなんかで、*nixと同じシェルスクリプトがそのまま実行できるというわけではないし。 あなたの言うように、上の方にもあるような、シェル同士での非互換性も見られるからねぇ。 それに、そもそも自分は、シェルスクリプトが不利だ、と言ってるわけではなく、 条件によっては各種言語のほうが選択肢になりうると言ってるだけだよ。 それこそ標準モジュールだけでできることって、結構あるからね。 まぁ、一つに絞れるなら、どれだけありがたいことか。 C言語がいまでも生き残っているのは、まさに最大公約数的な立場にあるからなんだろうな。 でも既存のコマンドの組み合わせでできるのに わざわざrubyとか使って書くやつがいるよね むしろそっちのほうが多いよね >>741 うん。 「C言語が最大公約数」という主張には多いに賛同するわ。 C言語には機種依存する部分を、C言語から排除してるから 言い換えるとC言語だけでは機種依存するするようなことは何も出来ない。 これをシェルスクリプトに置き換えると、機種依存する部分を外部コマンドに 置き換えてるから、シェルスクリプトは機種依存しないってこと まだgrepとsedとawkの基本が使えるようになった程度だけど確かに万能感あるわ perlも覚えるべきなんだろうがこいつは正規表現でしか出番ないわ 正規表現まで方言あると勘弁してください >>744 ん?それは全ての汎用言語に言えることでは? >機種依存 Perlはプログラム言語だよ Perlの気に入らないところは標準モジュールが 誰かが作ったライブラリを標準添付してるだけって所 だからPerlのバージョンを変えなくても標準モジュールの バージョンが変わってしまったり、Perlのバージョンを変えると 標準添付されているモジュールが変わったりと標準が安定していない >>746 言えない。Pythonなんかごちゃごちゃと ライブラリが標準添付されてる シェルスクリプトでファイル走査して、 ディレクトリなら再起しつつ、 普通のファイルならperlでファイル開いてなんか処理する。 見たいな使い方するな。 シェルスクリプトはファイル走査が簡単、 perl等はファイルの中の処理が簡単ってイメージ。 シェルスクリプトでごりごり書いたら出力結果でるまで数十秒でるようになったんで python で書き直したら1秒かからなかった、とかもあるしなぁ。 ヘビーなスクリプトファイル向けの、sed/awk/grep がビルトインになってるスクリプト向け bash が欲しいわ。 >>753 それの遅い原因はわかっていて、ループの中でコマンドを呼び出しているから yashは浮動小数点数が使えるから、簡単にコマンド呼び出しをなくせるし シェルスクリプト用の浮動小数点数ライブラリがあればもっと高速化できる もちろん他の言語よりかは遅くなるが、逆に言えば少数を使わない処理は シェルスクリプトでも十分速い そこまでシェルスクリプトに拘るのはなんでだろ。まあスレ的にはいいけど 別に拘ってないよ。 前にも言ったけど、寧ろシェルスクリプトを「使わない」ことに必死な人物の方が多く見受けられる そういう人々はPythonやRubyやらは便利で何でもできると思ってるようだが 実のところその殆どの機能はシェルスクリプトで十分まかなえる しかもUnix系OS(これは世界で最も広く使われているOSの一つ)には既定でPythonやRubyはないがPOSIX環境ならある、というようなものもかなりある。 それが拘っているというのだよ、別にいいじゃん他人の好き好みなら たんなるグルー言語としてしか使わないのがいても当たり前、グルー言語の発祥元がシェル=シェルスクリプトなんだし 無理して、技巧的にならざるを得ないシェルスクリプトでやりたくないと思うのがいても普通だろうと思うけど その最後のもそんな窮屈な環境を持ち出さなければ、持論が弱いもしくはやはりこだわりたいだけだなと思うだけだな。世間一般的にそんな環境ってどれだけあるんだか こだわるってのはシェルスクリプトでやるのが難しいのをシェルスクリプトでやることであって シェルスクリプトでやるのが簡単なことを、わざわざ他の言語で長いコード書いてやるのは 単にシェルスクリプトが使えないだけ それで?誰のこと言っているの?スレにではないどこぞのブログとかの? そんなことことで言って、なんなの?まさか、シェルスクリプト使える俺ってわけじゃないんでしょ? >>758 使うとか使わないとか、どちらかに「必死」とか考えちゃうほうがおかしくないか? 本人が使いやすいと思う使い方を、とやかくいうことでもないでしょ。 Windowsで普段PythonやRubyを使ってる人(それなりの利用者がいる)が、 たまたま別の*nixの環境を使うことになった場合、 慣れないシェルスクリプトを使うことより使い慣れた各種言語を使うことだって選択肢としてあり得る。 たとえ、自己満足でそれを選択したとしても、それはそれで否定されるようなことじゃないよね。 × 自己満足でそれを選択したとしても、 ○ シェルスクリプトが使えない能力不足で選択しても だろ? だから、どちらでもいいと言ってるんだけど、わからんかなぁ。 わざわざそんな変な訂正するくらいシェルスクリプトを使えるのがよほど自慢らしい 話にはならないな、このスレ見てるのはシェルスクリプトが使える人だろうというのに >>762 もちろんそう。 でもシェルスクリプトを使うのに「拘る」 という言い方がちょっと気になってね。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる