シェルスクリプト総合 その35
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
前スレ: シェルスクリプト総合 その34
https://mevius.5ch.net/test/read.cgi/tech/1597990675/ ・特記なき場合、POSIX準拠シェルが既定です(古きBourneシェルはほぼ絶滅しました)
POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
参考 https://unix.stackexchange.com/questions/145522/
特定のシェルの専用機能に依存する場合は明示しましょう(特にPOSIX準拠シェルではないfish, (t)csh等)
・デフォルトシェルのシバンはBourneシェル時代からの伝統で#!/bin/shを使用します。ただしその実体はOSによって様々です
Debian系 … dash CentOS系 … bash Alpine … ash(busybox) Android … mksh
FreeBSD … ash Solaris,OpenBSD … ksh
macOS … bash(Single UNIX Specification準拠のために一部動作が異なる)
・ログインシェルは/bin/shでない場合があります。例 macOS … zsh
・シェルスクリプトは可搬性を持たせるために可能な限りPOSIXに準拠しましょう
仕様 http://pubs.opengroup.org/onlinepubs/9699919799/
参考 https://en.wikipedia.org/wiki/POSIX
・bash依存はなるべく避けましょう。自覚なきbashism。シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
#!/bin/shを使うならシェル依存は厳禁です。bash依存するなら#!/bin/bashです
・BourneシェルはPOSIX標準化前に主にUNIXで使われていたシェルで多くの亜種が存在します
Bourneシェル≒Version 7 UNIXのshに一番近いのはOpenSolaris由来のHeirloom Bourne Shell、次点でSchily Bourne Shellのoboshです
Heirloom Bourne Shell: sh http://heirloom.sourceforge.net/sh.html
Schily Bourne Shell: obosh http://schilytools.sourceforge.net/bosh.html
歴史的資料 https://www.in-ulm.de/~mascheck/
・csh/tcshでのシェルスクリプトは*まったく推奨しません*
参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc
・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう
aproposやman -kでそれらしい単語による簡単な検索もできます
・ワイルドカード・パターンは正規表現ではありません。正規表現の話題はスレ違い(正規表現スレへ)
・シェル芸はシェルスクリプトとは異なります
・シェルスクリプトのことをシェルってゆうな しかし>>3の関連スレが,1スレ消費した後にまだリンク張り替えなくて良いあたり,
全然書き込まれていないんだな。
人気がないのかあるいは,安定していて一斉に文句が書き込まれるような問題も無いのか……。 fishとかxosh?だとかPOSIXじゃないから
うんいいね。でおしまい
あんなのでスクリプト書くやつはいない 別にfishが使い続けられてそれが便利ならそのスクリプトがどういう文法だろうがどうでもよくないか? >>8
シェルはインタラクティブだけじゃなくてシェルスクリプトとしても使われてる
例えば/bin以下でこんなのがシェルスクリプトで実装されてる
/bin/bzdiff: POSIX shell script, ASCII text executable
/bin/bzexe: POSIX shell script, ASCII text executable
/bin/bzgrep: POSIX shell script, ASCII text executable
/bin/bzmore: POSIX shell script, ASCII text executable
/bin/egrep: POSIX shell script, ASCII text executable
/bin/fgrep: POSIX shell script, ASCII text executable
/bin/gunzip: POSIX shell script, ASCII text executable
/bin/gzexe: POSIX shell script, ASCII text executable
/bin/which: POSIX shell script, ASCII text executable
/bin/zcat: POSIX shell script, ASCII text executable
/bin/zdiff: POSIX shell script, ASCII text executable
/bin/zgrep: POSIX shell script, ASCII text executable
/bin/zless: POSIX shell script, ASCII text executable
/bin/zmore: POSIX shell script, ASCII text executable
なのでPOSIXシェルがシステムから取り除かれることはない
そしてfishはシステムにとって使えず必須ではないのでインストールされない
という状況がこれからも続く
悪くはないが代替として使えない だから、別にfishでスクリプトを書いてもいいけど
統一された企画も何もないんだから、
少なくともこのスレで話す話題じゃねーよなって言う話
それこそ、Pythonも、
逐次的に入力を解釈して利用者に入力を促進する状態がある
と言う点ではシェルの一緒だけど、
じゃあここで話すの話題かっていう。 最新のfishは使うけど音声入力は使いません!
wwww fishのスクリプトがどういう文法だろうが
使わないのでどうでもいいという話
>>5
> fishはどうなの?
どうでもいい。興味ない。 シカトすればすぐに終わるだろうに、なぜか自ら話を伸ばすw いつから統一された規格とやらが要件になったの?
いいけどそれなら総合の看板下ろしてPOSIX専用掲げてよ紛らわしい shに似ても似つかないスクリプトはスレ違いなのはたしか。
POSIXはある程度どうでもよいとして。
ただスレ違いを前提として、別のシェルをすこしくらい話題にするのはいいのでは。
そんなに活発なスレでもないし。 昔話だが、まだいろんなUNIXワークステーションが使われていた頃、あるOS用に
書いたスクリプトが別のOSで微妙に動かなかったりして、面倒だった。
そうするとやっぱPOSIXかあと思ったりした。
今なんかどこでもたいていbashが入ってるしな。てゆうかたいがいLinuxだし。
そしてCPUがたいがいインテルに... まARMのクロスコンパイルはするけど。 あれ、ディレクトリ構造というのもPOSIXで規定されてるんだっけ?
違うOSで動かすときはそういうのも問題になったな。
そうやってGNUのconfigureなんかも複雑化していったという。 手元に有用なfishスクリプトがあってそれを使いたいならfishをインストールすればいいだけじゃね?
なぜデフォルトインストールされたシェルだけの縛りゲーしてるの パーミッションだけの話なら、$HOMEのどこかにいれとけ。
/usr/bin以下でないとダメなわけでもないやろ。 >>27
だからインストールできない
linux-vdso.so.1 (0x00007fffeddc6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f211d340000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f211d110000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f211cef0000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f211cce0000)
libpcre2-32.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-32.so.0 (0x00007f211ca60000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f211c6d0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f211c2c0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f211da00000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f211bf20000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f211bd00000) >>19
「POSIXにこだわらないシェルスクリプト総合スレ」を立てたほうが健全かもな
しばらくスレ見てればわかるけど要は俺がマウント取れない話題はするなってことなんだよね
全くもってくだらない 感想は同意。マウント取るためのネタとしてするなとも言っているのもありそうだな テンプレに、明示してたらほかのシェルでも可、とあるんだからここでええやろ。
POSIXバカは無視で。 awkやsedの話でもなんかすぐ「そんな複雑なことやるな!」って否定しだすしな。
awk,sedは独立したプログラム言語とはいえシェルスクリプトの一部と言えるんだから,
fishと同じでここで扱っても良い話題。 そんな事するなとは言ってないな
シェルスクリプトではないというだけの話だ
独立したプログラム言語でシェルスクリプトではない >>28
ライブラリもホームに置けば。一工夫いると思うけど。 >>33
たしかにそうではあるが、ふつうのsedくらいまではこのスレの射程やろ。
「総合」だし。
だが、awkは外れてると思う。w POSIX信者ウゼー
FishでもAWKでもシェルスクリプト一と言えるだろうが。
そりゃ突き詰めて見れば,「PowerShellを扱わないんであればFishシェルも扱わない」
「Pythonを扱わないんであればAWKも扱わない」という理屈は分からなくもないけど,
どうしてそう強情に0か1かでしか物事を捉えられんのかね……。 awkがシェルスクリプトじゃないというのはPOSIXとは関係ない
awkを呼び出すコードは当然シェルスクリプトだが
awkはシェルではないので、awkの文法に関することは
シェルスクリプトではないというだけのことだ。
そしてfishはシェルなのだから、当然シェルスクリプトだ
ただしPOSIXではないシェルスクリプトであるが 例えばシェルスクリプトで$_ってどういう意味ですか?
って聞かれても困るだろ?このコードで
cat test.txt | ruby -e 'while gets; print $_; end' >>39
「cat」ってなぜ猫なんですか?
とか聞かれても困るけどな。w そういうことだな。それはawkの文法だよ。
だからawkスレで聞いてねで終わる >>38
じゃあPowerShellやcmdの話題も扱っていい筈よね。
ここUnix板じゃねーし,
仮にUnixシェル専用だという暗黙の了解があるにしても
PowerShellはLinuxの上で動くし。
……とまあ,際限なくチャチャを入れることができる
ガバガバ理論なんで,別にAWK程度なら
このスレで扱っても構わないでしょう。
柔軟に生きよう。 >>43
専用スレがあるのだからそっちに行ったほうがいい ご覧の通り何を言っても無駄
無駄に突っかかってくるやつ相手にしてもSAN値下がるだけなので
「POSIXにこだわらないシェルスクリプト総合スレ」を立てたほうが建設的だよ
POSIXに強くこだわりたいときにこのスレ使えばいい POSIXシェルスクリプト専用だろ?
何が総合だ。看板に偽りあり! >>43
Awkを入れたらPerlも入るぞ?
Perlが入ったらPythonも入るぞ?
Pythonが入ったらRubyも入るぞ?
と際限がなくなりそうだけどなあ。 >>50
POSIXそのものなのか?準拠は?拡張は?と、それはそれでややこしい。w
こまけえことは気にすんな!でええがな。
POSIXバカは無視で。 >>47
これ人が集まらないようわざと分かりにくいタイトルにしてるだろ
どんだけ陰険なん >>51
すぐそうやって極論に持って行く。
「AWK程度なら」の意味分かってんの? >>54
極論じゃないやろ。
むしろおまえこそ自分の言葉の意味がわかってんのかと。 awkの話もシェルスクリプトといことでいいですよね?
awkで作られた3Dシューティングゲーム「awkaster」が凄い
https://www.softantenna.com/wp/software/awkaster/
このコードを説明してください 別にawk程度ならこのスレで扱っても構わないでしょう?w >>57
>このコードを説明してください
いくら払うの?
まずはそこからだ >>53
確かにこれはひどい悪意を感じるので
立て直したほうがよい >>39
PowerShell でもそうだけど、$_ は、前段のパイプから渡ってくるもの。
1行ずつ渡ってくるのを、そのまま表示している
1-liner では、よく使う だいたい,「分かりやすいタイトル」にしたところで人が集まるような話題じゃねーしなw
Fishだけ知っててBash知らない,みたいな人間なんて超希少だろうし,
大半の人間はFishの前にBashを知っていて,
シェルスクリプトとして書く場合はBashを使う。
だから「Fishでこんな処理を書きたいんだけど」という疑問の前に
Bashを使うんだわ,残念ながら。
まあBashを使うことが良いこと≠ゥ,というのはまた別の話な。
勘違いしてつっかかってくる奴がいそうなんで,念の為言っておくが。 PowerShellやコマンドプロンプトはシェルスクリプトがなかった
Windowsの世界で使わざるを得ないものだから、それでスクリプト書くことはあるけど
fishとか書かないよね
書けるやつはbashかPOSIX準拠で書くし
書けないやつはPythonとかの言語を使う
bash書くのだるいからfishでとかやるやつがいない
fishとかプロンプトからの入力に使うだけでしょ
使ってる人もデフォルトの補完便利だねぐらいにしか思ってない fishのスクリプトの具体的なことは未だに全く書かれていない、どう書いたらいいとかさえも
最初に言い出したやつさえ使ってないだろうw いつまで引っ張ってるんだか AWS のCodeDeploy には、sudo yum install ruby
と書いてあるから、Ruby製
CloudFormation では、Ruby製のChef, Cookpad製のItamae, Kumogata2 を使える
バックエンドの環境構築運用では、
複雑なものは、シェルスクリプトよりも、Rubyで書く >>68
もうこれに尽きるな。
Fishシェルのことを扱う別のスレを建てるんじゃなくて,
POSIXシェルのシェルとしての機能(for文, set命令とか)のみを
扱う専門スレを建てればいい。
「総合」とある以上,ここでは前者を含んだ話題を扱うべきだ。 dateコマンドで「今日の10時」などではなく「次に来る10時」を求める方法をご存知の方教えてください! date?おいやめろ。またPOSIXの話になるじゃねーか! 文字列での表示は出来るけど、
プログラミング的な時間オブジェクトの比較とかは、出来ないかも
Ruby などのプログラミング言語なら、時間オブジェクトで比較できる
date --iso-8601=hours --date='15:00 today'
2020-12-01T15+09:00
date --iso-8601=hours --date='15:00 next day'
2020-12-02T15+09:00 現在・今日・明日の文字列で、文字列として比較できるかも知れない
date --iso-8601=seconds
2020-12-01T12:44:54+09:00
date --iso-8601=seconds --date='15:00 today'
2020-12-01T15:00:00+09:00
date --iso-8601=seconds --date='15:00 next day'
2020-12-02T15:00:00+09:00 >>74
今日が現在よりも前なら、明日
それ以外は、今日 bash 限定で。
zsh では、[ $today \< $now ] が動かないとか、どこかのサイトに書いてあったので
#!/bin/bash
# 現在・今日・明日の文字列
now=`date --iso-8601=seconds`
today=`date --iso-8601=seconds --date='14:00 today'`
tomorrow=`date --iso-8601=seconds --date='14:00 tomorrow'`
# echo $now # 2020-12-01T14:41:29+09:00
# echo $today # 2020-12-01T14:00:00+09:00
# echo $tomorrow # 2020-12-02T14:00:00+09:00
# 今日が現在よりも前なら、明日。
# それ以外は、今日
if [ $today \< $now ]; then
echo '明日'
echo $tomorrow # 2020-12-02T14:00:00+09:00
else
echo '今日'
echo $today
fi >>71
YYYY MM DD HH フォーマットを返すようにしてdateを呼び出す
if [ HH < 10 ]; then
echo YYYY MM DD 10 00 00
else
echo YYYY MM DD+1 10 00 00
fi
あとよろ
DDが月末だったら問題あるから気をつけな >>77
10時を過ぎても11時までなら今日の10時が返されるんじゃ? 思ったんだがシェルスクリプトって日付の計算ができないんだな
そういうライブラリってないのか? シェルスクリプトで数字の計算は普通にできるやろ?
rubyとかpythonとか便利ライブラリ盛りだくさんな温室で
育ってきたやつは知らんだろうけど
C言語だって日付の計算はできないんだぞ
ライブラリを作るか使うかしてやっと実現できること
ライブラリを誰かが用意してくれなきゃプログラミングができないとか
技術力もほんと落ちたもんだわw >>71
tz=JST-9; [ $(date +%H) -ge 10 ] && tz=JST-23;echo $(TZ=$tz date +%D) 10:00 >>83
tz=JST-9; [ $(date +%H) -ge 10 ] && tz=JST-33;echo $(TZ=$tz date +%D) 10:00
だな。ぼーっとしてた >>84
これでいいわな。核心部分は%Hと10の比較だけ。 >>82
> シェルスクリプトで数字の計算は普通にできるやろ?
外部コマンド呼ばないとできないよね。あ$(())とかのこと? でも伝統的には...
> ライブラリを誰かが用意してくれなきゃプログラミングができないとか
日付の処理とかいろいろ落とし穴が多いから。
今はプログラムも複雑になったし... 料理に例えると、大昔は火を起こすところから
できないと駄目だったろうが今はそんなこと要求されないw GNUやBSDのdateの拡張部分、つうてもある値(文字列な日付も含む)を日付に変換っていう部分を使えば普通に日付の計算は(簡単に)できるだろう
日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通。落とし穴を避けるためにも(他の言語でも)
年月日で計算する必要のあるのは、落とし穴なんて関係ない単純な場合なだけだろう。何年何ヶ月 とか ある程度適当でいい場合とか >>86
> 外部コマンド呼ばないとできないよね。あ$(())とかのこと? でも伝統的には...
伝統?いつまでも古代のBourne shellなんか使ってるなよ
今は令和の時代だぞ?1988年(ksh88)はもう30年以上前だ。
そんな昔のシェルをお前は今も使ってるのか?
いい加減POSIX準拠シェルに乗り換えろ >>71です
みなさんありがとうございます助かりました! >>87
> 日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通。
date +%s はPOSIX準拠ではない 別にPOSIXに従ってなくても,元の質問が解決すればそれでいいと思うんだが。
ちなみにPOSIXに準拠した場合でもUNIX時刻は算出できる。 しかもThe Open Groupが直々にコードを書いてくれてるっていうw POSIXバカはスルーで!
興味がある人のみ反応すれば。 POSIXバカと呼び名通りにすぐにバカっぷりを体現してくれる呼び名に偽りはないなw >>76
を改良した。
2020-12-02T14:00:00 のような文字列で比較している
#!/bin/bash
time='14:00' # 求める時間
# 現在・今日・明日の文字列。年月日-時分秒。2020-12-02T14:00:00
now=`date +%Y-%m-%dT%H:%M:%S`
today=`date +%Y-%m-%dT%H:%M:%S --date="$time today"`
tomorrow=`date +%Y-%m-%dT%H:%M:%S --date="$time tomorrow"`
# 今日が現在よりも前なら、明日。
# それ以外は、今日
if [ $today \< $now ]; then
echo '明日'
echo $tomorrow #
else
echo '今日'
echo $today
fi now=$(date +%Y%m%d %H%M%S)
date=${now# *
20201202 181521
4294967296 ■ このスレッドは過去ログ倉庫に格納されています