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

■ このスレッドは過去ログ倉庫に格納されています
2020/11/24(火) 21:37:20.06ID:mbTiTj6s
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

前スレ: シェルスクリプト総合 その34
https://mevius.5ch.net/test/read.cgi/tech/1597990675/
2020/12/28(月) 11:39:49.80ID:vFQ3C+Zv
話の流れ読めないやつだな
2020/12/28(月) 17:59:02.72ID:X0zJWoaM
>>598
+1
2020/12/31(木) 17:15:57.75ID:6l44qxZH
#!/bin/sh

aiuo() {
curl --silent "https://example"; | jq -r ".aaa.bbb" 2> /dev/null
}

hoge=""
hoge=${aiuo}
echo "hoge = ${hoge}"

ターミナルでaiuoの中を一行でやるとjqの結果が表示されるけど、
shファイルを作ってやるとjqの結果が表示されずにhoge =しか表示されないのはどこが間違えてますか?
2020/12/31(木) 17:51:39.44ID:tdaLm2s5
括弧が間違ってるんじゃない?
2020/12/31(木) 18:01:15.85ID:FYWkeHq1
間違ってるな
604デフォルトの名無しさん
垢版 |
2020/12/31(木) 19:11:51.62ID:+40/WJTs
awkがシェルスクリプトじゃないのは事実なんだよな

POSIX原理主義はシェルスクリプト以外も使っていいと言いつつ
結局「シェルスクリプトでやる」と主張してるだろっていうツッコミはあるが

シェルスクリプト以外も使っていいからこそ
awkという「シェルスクリプトではない言語」を使っているんだろ?w

だから最初に言った言葉である「awkはシェルスクリプトではない」という事実は変わってない
awkメインのコー ドは「シェルスクリプト」ではなく「awkスクリプト」と呼ぶべきで
POSIX原理主義は「(原則として)シェルスクリプトで実装する」と主張するんじゃなくて
「awkを使って実装する」と主張するべきだってことなんだよ

ちなみにな、POSIX原理主義はシェルスクリプト以外も使っていいのであれば
RubyやJavaなども使っていいということになる
こちらも「シェルスクリプト以外も使っていいが原則としてシェルスクリプトでやる」という主張と矛盾している
605デフォルトの名無しさん
垢版 |
2020/12/31(木) 19:14:03.59ID:+40/WJTs
少し訂正

× awkメインのコー ドは「シェルスクリプト」ではなく「awkスクリプト」と呼ぶべきで
○ 埋め込みawkメインのコー ドは「シェルスクリプト」ではなく「awkスクリプト」と呼ぶべきで

Pythonのコー ドをワンライナーでシェルスクリプトに埋め込むのと同じ
ワンライナー程度ならまだシェルスクリプトがメインと言えるだろうが
何十行も全体の半分以上も埋め込むなやw
606デフォルトの名無しさん
垢版 |
2020/12/31(木) 20:11:12.41ID:jey11SVr
>>601
hoge=$(aiuo)かhoge=`aiuo`にすれば?
2020/12/31(木) 20:20:46.04ID:6l44qxZH
>>602, 603, 606
どうもありがとうございました
()、{}、`の使い分け画像よく分ってないです
2020/12/31(木) 20:57:23.81ID:2bA0HVQw
( hoge; hage ) コマンドのグループ化(サブシェル内でコマンド実行)
{ hoge; hage; } コマンドのグループ化(サブシェルなしでコマンド実行)

ret=$( hoge; hage ) 標準出力の結果を変数に入れる(サブシェル内でコマンド実行)
ret=`hoge; hage` 上記と同等。POSIXに準拠してない古いシェル用の書き方。ネストできないので30年前から非推奨。
ret=${ hoge; hage; } こんなものはない
2020/12/31(木) 21:11:15.00ID:6l44qxZH
>>608
どうもありがとうございました
2021/01/01(金) 00:39:28.26ID:wSR0l3d3
>>608
`<command>`ってネストできないんだっけ。
ネストしにくいだけで可能ではあるんじゃなかったか。
2021/01/01(金) 00:47:58.70ID:hjo1vK/7
もうどうでもいいよw
``は30年前から非推奨
四則演算にexprを使うのも30年前から非推奨
$(...) と $((...)) を使うのが30年前から続くPOSIX準拠のトレンド
これを普及させることが今年の目標なw
612デフォルトの名無しさん
垢版 |
2021/01/01(金) 01:28:03.16ID:7BFOsP2G
>>610
シングルクウォートでできないっけ
2021/01/01(金) 01:52:19.59ID:2/H3yQW9
>>612
バックスラッシュかな。バックスラッシュでできるよう
`level1\`level2\\\`level3\\\\\\\`level4\\\\\\\`\\\`\\\`level3\\\`\``
のような
なんか笑うw
614デフォルトの名無しさん
垢版 |
2021/01/01(金) 01:57:51.57ID:7BFOsP2G
>>613
これは分かりにくいな…
2021/01/01(金) 02:15:20.98ID:2/H3yQW9
\ はどういう増加率やねんと思った(level4は一つずつ増やしての手動)ら、2^(level-1)-1
だった
まあ、そんなにネストするやつは居ないだろうで実質level3ぐらいが実用的な範囲か
(もしくはそんなにネストすんなという暗黙的戒めか?w)
でも、遊びでlevel6とかするとやっぱり笑うw

>>614
うん。でも、見方変えるとなんかでかいからペアがわかりやすく...もねえかw
2021/01/01(金) 02:55:03.01ID:hjo1vK/7
>>613
つまようじ大好き症候群やめろ
2021/01/01(金) 03:00:52.40ID:hjo1vK/7
さすがにPOSIXを厳守してるので``つかいます。expr使います。
とか言ってるエセPOSIX信者は消えたかね?

あと`#`とかいうハックするやつは○ね
サブシェル起動で遅くなるだろが
2021/01/01(金) 03:08:12.13ID:2/H3yQW9
いつものやつとしか思えないw
自分が間違ったのを異常に誤魔化すような(いつものw)異常なレスだなと見えるぞ
2021/01/02(土) 20:28:18.95ID:YRmKf+cs
read -u の -u ってなんの略?
2021/01/02(土) 21:19:28.61ID:5m3zQZhj
unko
2021/01/02(土) 21:32:04.01ID:1KyEUTu5
ussodaroomae
2021/01/03(日) 22:01:05.48ID:sJkgD0sU
>>619
brian に聞いたら used だって言ってた
2021/01/04(月) 05:07:20.98ID:2pj20ySx
unitみたいだね
2021/01/04(月) 05:36:45.90ID:vYYyBooK
universe
2021/01/04(月) 12:53:18.02ID:gQq4oDMw
aaa="testtt" #フォルダ名
date_dir=$(mkdir -p $aaa/`date '+%Y%m%d'`) #testttフォルダの中に20210104の作りたい

wget https://example.com/example.txt -P $date_dir

これをやるとフォルダは作られるけどtxtの保存先がカレントディレクトリになるのはどうしてですか?
2021/01/04(月) 13:13:55.07ID:VbZo6FxW
>>625
“$date_dir”の中身を確認してみ

原因を知ることも大事だけど
それを調べる方法を知ることのほうがもっと大事
2021/01/04(月) 15:14:38.15ID:gQq4oDMw
>>626
echo $date_dir だとなんにも表示されないです
間違えてますねきっと
628デフォルトの名無しさん
垢版 |
2021/01/04(月) 15:43:15.17ID:UbvRjqjo
mkdir -p $aaa/`date '+%Y%m%d'`の標準出力見てごらん
2021/01/04(月) 17:34:40.13ID:yec7Hk1C
mkdir が、戻り値を返すか?

An exit status of zero indicates success,
and a nonzero value indicates failure.

echo $?
だろ
2021/01/04(月) 20:03:34.81ID:qovFEaH+
これがアスペか
2021/01/05(火) 00:39:17.17ID:DDTn90b5
みたいだな。キチも少し入ってそうな
2021/01/05(火) 03:43:22.28ID:psakH13p
いや、単にバカなだけでは...
2021/01/05(火) 10:50:42.48ID:yLm33Pt/
POSIXじゃないからダメ。
2021/01/05(火) 10:55:00.15ID:aNkjNIb3
>>633
俺のふりをするな
2021/01/05(火) 12:08:48.70ID:zD1ciQHW
Ruby では、あるディレクトリ直下のディレクトリだけをソートして、
", "(カンマと空白)でつなげて、1行の文字列にしたものは、

ruby -e 'puts Dir.glob( "*" ).select{ |file| File.directory? file }.sort.join( ", " )'

出力
app, bin, config, db

これをシェルスクリプトでは、どう作るの?
これらを使うの?

ls -d */
find . -maxdepth 1 -type d
2021/01/05(火) 15:59:04.73ID:2z9IJIZ8
スレのテンプレにRubyの話を控える(というかほぼ無くす)よう追記しない?
2021/01/05(火) 16:54:38.25ID:G+6noEPp
>>636
またマウントとれない話題はやめろってか

ダサいなぁ
答えられないならスルーすればいいだけだろ
2021/01/05(火) 17:19:13.55ID:2z9IJIZ8
>>637
えぇ……スレチを指摘するのってダサいんだ。
知らんかったなあw
2021/01/05(火) 17:48:43.98ID:psakH13p
半分シェルスクリプトの質問なんだからスレチでもなくない?
ワイはだるいから答えませんが...
2021/01/05(火) 17:55:47.46ID:DKe92MJE
>>635
ruby -e 'puts Dir.glob( "*" ).select{ |file| File.directory? file }.sort.join( ", " )'

find * -maxdepth 0 -type d -printf "%f, " | sed 's/, $/\n/'

27文字差
2021/01/05(火) 18:05:14.30ID:F/xhjvIl
へー、-printf ねえ...
2021/01/05(火) 18:07:31.79ID:aNkjNIb3
シェルスクリプトが苦手な人が
難しくなったら他言語で書き直したほうがいいってよく言ってるけど
同じ処理を他言語で書き直すとたいていシェルスクリプトより長くなるんだよなw
2021/01/05(火) 18:45:22.40ID:PtcuBhf4
場合によるだろう
いつもの隙あればマウント取りたがりかw1行目から明らかに
>>633は誰かが遊んだのかと思ったら自らなのか。キチってるなw
2021/01/05(火) 18:55:32.13ID:PtcuBhf4
>>643
>>633
>>634
すまん、>>633 w

だけじゃなんななので
あの find はそれでいいの??ダメだったら長くなりそうな気がしないでもない
2021/01/05(火) 19:06:42.36ID:jvx2si/E
ルビキチもポジキチも元気いいなここは
仕事ないのか?
2021/01/05(火) 19:09:44.19ID:PtcuBhf4
ルビキチはしばらく見ないなw
ルビキチに悪影響されての ID:2z9IJIZ8 の流れがちょっとアレだったな
2021/01/05(火) 19:20:26.75ID:DKe92MJE
>>635
find * -type d -prune | paste -sd, | sed 's/,/, /g'
2021/01/05(火) 20:34:41.59ID:Wb+d8sf0
>>642
いろいろと恥ずかしいレスだなw
難しくなったらww
長くなるんだよwww
2021/01/05(火) 21:40:03.20ID:hjkGjz+Y
>>640
findをわざわざ使わなくても、ls -1でイケるやろ。
どうせsedで加工するなら。
2021/01/06(水) 11:24:52.43ID:8PExJP/x
>>635
\ls -md */ | sed 's:/::g'
651デフォルトの名無しさん
垢版 |
2021/01/06(水) 12:16:54.19ID:mYe0Yhh2
>>650
こんなオプションあったんだな
2021/01/06(水) 12:42:11.33ID:m96KWhfY
>>650
コンソールの幅?に依存してまうな。
-w 0も必要。
2021/01/06(水) 18:32:25.02ID:BIuq+YWk
POSIX 注意報発令
2021/01/06(水) 20:25:24.32ID:Y7FOu5Ta
POSIXじゃないからダメです
2021/01/06(水) 20:47:11.09ID:HZIFnr+X
つーか俺は誰かと違ってPOSIXじゃないからだめなんて言ってないんだけどな

POSIXシェルではどうやればいいかって話をしてるだけで、ウェブアプリとか
シェルスクリプトには向かない作業にRubyやPythonなどの他の言語を使うのは当たり前
もちろんawkも使って構わないが、ただしそれはawk言語であってシェルスクリプトではないとは言うけどなw

何十年も動かしたいプログラムに、何十年も変化しない言語を使うのはまだ理解できるが
そもそも何十年も動かしたいという顧客の要求がなく、むしろ新しい機能の追加や修正を
行い続けるようなものに開発しづらいシェルスクリプトを使うのは馬鹿げてる
2021/01/06(水) 21:16:29.90ID:D/BvDb1X
っていうか,
「PythonやRubyはPOSIX Cで作られてるからPOSIX!」
っていう理論,いや1億歩譲ってそれを認めたとして,
このスレのタイトルを1億回読み直してほしいw

つまり結局,このスレで「POSIXが〜」と限定した場合に言及すべき範囲は
POSIXが(唯一)定めているShell Command Languageおよび(Shell) Utilitiyなんだよな。
2021/01/06(水) 22:10:20.61ID:hZlCYb+O
> 「PythonやRubyはPOSIX Cで作られてるからPOSIX!」

そんな主張してないぞ

POSIX原理主義がPOSIXシェルスクリプトをメインに開発する!
→でも○○無理じゃん
→シェルスクリプトで書くのは必須じゃない。交換可能可能性があれば使ってもOK!
→(交換可能可能性とか後付作っただろ・・・)
その理屈だと、C言語は交換可能性があるからOKだとして、
C言語で誰かがが作った(例えばユニケージの)独自コマンドは交換可能性がないからNGですよね?
そしてPythonやRubyもJythonやJRubyといった交換可能性があるからPOSIXじゃなくてもOKですね

こういう話ね
2021/01/07(木) 00:13:36.72ID:X7rGsxbJ
>>652
COLUMNS=32767 ls ...
でも良さげ?
2021/01/11(月) 01:02:14.08ID:Nxf8SjHi
それで標準ライブラリは極力使わないって話にどうしてなるのか
意味不明なのは変わらないな
2021/01/11(月) 01:04:15.45ID:Nxf8SjHi
誤爆
2021/01/11(月) 12:59:18.59ID:MB0taG6M
どんな環境でも動くものを作れるここの先輩方は
LinuxだけでなくMacも込で動くように作られますか?
2021/01/11(月) 14:08:49.23ID:4YPmzemp
LinuxでもMacでも動かしたくなるようなもので
普通に作れるようなものであれば作ってるよ

普通に作れないものっていうのは
例えば、systemdを使うものとかファイアウォール設定を変えるとか
Linuxの環境じゃないと意味がないようなもののことね
2021/01/11(月) 20:09:51.00ID:1GKY+oky
>>661
ポジキチではないけど,
MacはUNIX v7に準拠してるし,
Linuxは正式に準拠してはいないけどほぼPOSIXに従ってるから,
POSIXの範囲でシェルスクリプトを書いておけば
MacでもLinuxでも動く。

まあそれに「意味があるのか」というのは別の話。
(Goプログラマが「Goで書けどこでも動く!」とか言ってるのと
似たようなもん)
2021/01/11(月) 20:36:44.96ID:3OvUQiSB
ここに書き込む人は大概Linux前提でGNUのツールが前提になってるから
MacにもGNUのツールをどんどん入れれば大丈夫と言う考え方はある
逆に言えばGNU原理主義なのかもしれんがw
2021/01/11(月) 20:36:59.01ID:k6EkwuyV
どれだけ意味があるかって、複数のOS使ってるなら意味有るでしょ?
2021/01/11(月) 20:39:06.55ID:k6EkwuyV
>>664
それはそうなんだけど、Macの場合、結局、フリーソフト使って実現なんだよね
ああ、GNUがフリーソフトだろっていう話じゃなくて
macOSが公式に対応してるわけじゃないって意味ね。
macOSが公式に対応してないからOSのアップデートで動かなかったりする
2021/01/11(月) 21:18:03.54ID:iHOPiDVy
>>666
アポーがグズなことなんか知らん。
だいたいひとまわりくらい古いやろ。
2021/01/11(月) 22:14:22.97ID:TgqHKx3G
>>664
macosってコードベース的には90%くらいfreebsdのはずだが、gnuは徹底排除抹殺思想のfreebsdとしてどんな気持ちなんだろ…
もちろんライセンス的にクリアしてるんだろうが

まあmacは持ってないんだが(シェル含め)スクリプト写経用に人からコピーさせてもらった、まんじゃろ、とか言ってた頃?
blobじゃないファイルのコメントにfreebsd記載率9割
2021/01/11(月) 22:19:33.52ID:TgqHKx3G
というかbsd使いは規格とか気にしてない人が多そう(尖った人という偏見)
そもそもコミュニティが小さいので気にするまでもないってのもある
規格を異様に気にするのは、環境が千差万別なlinuxユーザでしょ
2021/01/12(火) 02:54:46.84ID:hnOFIrYF
>macosってコードベース的には90%くらいfreebsdのはず
>まあmacは持ってないんだが
他も無知ゆえの妄想ばかりだな
mac持ってなくても調べればわかるのを調べもしないでのでタチが悪い無知
2021/01/12(火) 03:08:52.49ID:TSfQlcFo
usrとかbinとかgrep(と-v)してみりゃそうだって分かるだろ、バイナリ部分は公開してない以上分からんとしか言えん
2021/01/12(火) 03:23:26.83ID:hnOFIrYF
「コードベース」とか範囲が広すぎだろう。バイナリ部分ってなんやねん
単にコマンド(大体はPOSIXにあるコマンド)って話なのか?
2021/01/12(火) 04:20:31.55ID:4wlpPo5A
>>672
えっ。
わからんの?
マジで言ってんの?

さすが信者。w
2021/01/12(火) 05:28:57.54ID:hnOFIrYF
お前の独特の言語言葉なんて知らんわ
usr bin にあるバイナリを調べろと言ってるのか。ちょっとは自分で調べてあんなこと言ってるのかと思ったら、全くなのな
てことは単にコマンドのことを言ってるだけか。コードベースwとか独特の言葉を使うなよ

それなりにオープンソースで公開されてるんだから少しは調べようとしろよ、語るwなら
妄想で語るだけのに さすが信者 とか言われたくないわw
675デフォルトの名無しさん
垢版 |
2021/01/12(火) 06:11:57.28ID:eUCbLjlC
勝手に
les, bus - ATM LAN Emulation service demons
というのが入っているけど、何これ
2021/01/12(火) 23:03:02.65ID:ESpMy2tV
>>675
Virus🦠
2021/01/14(木) 09:56:27.47ID:s2FPIYdL
なんか面白いテクニックが某所で紹介されてるな

#!/usr/bin/echo This script is supposed to be sourced like this: .

まあ、macだと/bin/echoだったりするわけだが
2021/01/14(木) 12:42:21.34ID:tanA3fVT
a="A" b="B" みたいな文字列を渡したら
a変数にA、b変数のBみたいに代入する方法ないかな?
ただし脆弱性が怖いんで、 a="$(cmd)" みたいなものは
そのままa変数に$(cmd)という文字列が入る

そしてスペースとかダブルクォート入れたかったら
a='A " A' とか a="A \" A" とかできるようにしたい
2021/01/14(木) 13:23:35.55ID:bf8JVc72
ムチャ言ってんな。w
2021/01/14(木) 14:17:26.70ID:83515Abn
>>677
まあ「面白い」というだけで
#!/bin/sh

echo 'This...'
とすればいいだけだがなw
2021/01/14(木) 14:19:03.84ID:83515Abn
ちなみに発言は↓ここ
https://github.com/koalaman/shellcheck/issues/2110

当人の発言によれば,
#!/bin/echoという「シバン」にすることに特に意味はないようなので

「単独で実行されたとき」を判定できればシバンじゃなくてもいい。
それはps(1)コマンドを使った「普通の」方法で達成可能。

まあ「普通」が嫌なんだろうなw
2021/01/14(木) 14:24:12.88ID:bf8JVc72
>>680
それだとsourceしたときにechoされちゃうやろ。
683デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:11:50.55ID:fZvBFJEs
どう面白いの?
2021/01/14(木) 15:12:47.48ID:tanA3fVT
>>681
psを使った方法は名前を変えられるとだめってレスきとるでw
シンボリックリンクとかな
ちなみにさっき名前にバージョン番号がついたバイナリを落とした所w
2021/01/14(木) 16:23:35.27ID:83515Abn
「ファイル名を変える」より「/usr/bin/echoがない」ことの方が致命的だと思うんだけどな。
まあ当人がそう思わないんなら(もしかして認識さえしてない?),俺はもう何も言わない。
2021/01/14(木) 16:36:57.62ID:tanA3fVT
/usr/bin/echoがないならエラーで落ちるだろ

実行しようとした時に、実行させないのが
目的なんだから、目的は達成できてる
2021/01/14(木) 18:00:29.32ID:83515Abn
>>683
いや,正直「奇抜(そして実装依存)」というだけで,
実用できると思っている理由が分からない。
2021/01/14(木) 20:28:27.29ID:bf8JVc72
>>687
そもそも「実用」するようなもんじゃない。
しょせんヘマ避けなので、実装依存なんか問題にならないことは>>686も言ったとおり。

きみ、アホなの?
2021/01/15(金) 01:15:51.82ID:YhT5m5Ec
実用できない癖に実用性は求めるのか…
じゃあファイル名に依存しててもいいじゃん……
2021/01/15(金) 07:41:49.61ID:uPQddvH2
実用っていうのは、echoするって意味だろ

ぱっとみてechoできなければ意味ないじゃんって
勘違いしたんだろうけど、echoするのが目的じゃないんだから実用性はある

なんのためにあるのか少しは考えたら?
2021/01/15(金) 07:57:49.36ID:XkGM5v4E
エコースクリプトという新ジャンルを思い付いたけど大してする事なかった
2021/01/15(金) 07:58:08.43ID:79YZFf86
ヘマ避けならそもそも実行権限つけなきゃいいだけじゃね……
2021/01/18(月) 18:04:21.25ID:Ge+kcekj
シェルスクリプトをググらず書けるようになったやっぱ言語は覚えた方がいいのか
perlとか正規表現の指定しか知らんしまだsedやawkの方が出番あるわ
2021/01/18(月) 18:36:52.77ID:ZtDZqP0p
まあ書けないよりは書けたほうがいいのは確かだが、
シェルスクリプトの場合、すでにある便利なコマンドを組み合わせるには
最速の方法なので、その言語を覚えていたとしても使えるようになったほうが良いと思うよ

シェルスクリプトの変わりにプログラム言語を使うと
コードが冗長になって、やりたい作業をささっとこなせない
コマンドの再発明をすることになる
2021/01/18(月) 20:37:19.00ID:daUvLGrG
>>693
sedはともかく、awkは忘れて、Perlに乗り換えたほうがいいんでは。

つーか、ワイはawkを使えん!w
2021/01/18(月) 21:36:36.94ID:ZtDZqP0p
Perlは互換性がなー、と言いたいところだけど
その互換性って主にライブラリの話
awkにはライブラリがない。

じゃあライブラリ無しで比べてみよう
ライブラリがないawkと
ライブラリを使わないPerl

どちらが機能が上で互換性があるだろうか?
おそらくPerlの方が機能が上で互換性も有るだろうな
Perlがawkに劣るのは標準で入ってない環境に当たる可能性が少し高いってことぐらい
2021/01/18(月) 23:52:13.21ID:AsdWc5Bm
ifはfi
caseはesac
など、何で最後の単語が逆になってるんでしょうか?
2021/01/19(火) 00:26:51.55ID:kVTxVY5X
parlはawkやsed風に書けるけどあくまで似せてるだけで細部では違うから戸惑ったぞ
awkとperlでは添字がずれるし
sedの/foo/!や/foo/,/bar/はperlじゃできないからな
2021/01/19(火) 00:46:49.98ID:CdqMY/2C
awkはテキスト処理に特化した言語だろ
そもそも土俵が違う
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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