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

■ このスレッドは過去ログ倉庫に格納されています
2020/03/23(月) 01:12:30.31ID:TYte82vJ
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
2020/05/21(木) 18:38:04.04ID:C3uZcQQo
ああ、(最後の)コマンドをexecしてんのか。納得した
2020/05/21(木) 19:15:46.38ID:C3uZcQQo
ああ、bashもps(というかコマンド一つだけならか?)だけならps自身だったexecしてた
2020/05/22(金) 10:18:39.53ID:TfVZs9xf
???
2020/05/22(金) 16:42:02.19ID:ZQuJuyf5
えーと、良かったね。「なんでやねんっ」で終わるよりは。
2020/05/22(金) 17:19:36.41ID:VBkbngi+
マウントとりの変形
2020/05/22(金) 20:59:32.61ID:ZQuJuyf5
何のことだ? 自分で調べて納得したなら間違いなく良いことだし、本来そうあるべきだろう。
2020/05/23(土) 07:51:59.95ID:0T8MjFiT
頓珍漢な擁護してて草
2020/05/23(土) 11:11:44.65ID:Ify9JmqW
>>359
> ちなみに「真面目なパース」の例を挙げてほしい。
1. ps する
2. 一行目を読み取る
3. PIDが1列目、COMMANDが○列目ってわかる
4. 二行目移行を読み取っていく
5. PIDが一致したら、同じ行の○列目を参照する
6. それが起動してるシェルだ

なお、普通にシェルでプログラミングしろ
シェル芸でこれをやろうとするなよ

この程度の処理プログラミングとして考えれば
ほんの数行で終わる簡単な処理なんだが
シェル芸でやろうとして逆に難しくするやつがいる
シェル使ってるやつは、プログラミングができないやつが多い
2020/05/23(土) 15:58:02.30ID:ch2ICEVw
「シェルを使う」という表現に一体どんな意味を込めているのやら...
2020/05/23(土) 17:56:41.50ID:hM7sXxSn
>>369
この程度のシェルいプログラミングもできないで
シェルが得意と勘違いしてる人がいるなぁって話
2020/05/23(土) 18:04:41.89ID:31g10QWp
コードのコの字も出てないのに。少しはコードがあっての話でしか無いな
2020/05/24(日) 14:47:54.65ID:Y1ZXEm/L
age
2020/05/24(日) 15:32:04.04ID:0WjVzP+p
入れてみてわかるシェルの良さ
2020/05/24(日) 15:48:48.76ID:FTfvJDOJ
何入れてるの?
2020/05/24(日) 16:42:21.69ID:LIiHhrYu
fishです(AA略)
2020/05/24(日) 16:46:49.93ID:FTfvJDOJ
fishはPOSIXシェルじゃないから駄目だね
377デフォルトの名無しさん
垢版 |
2020/05/24(日) 20:51:41.67ID:vB1Q/4mw
>>368
途中に時間が入っていると面倒なんだな
2020/05/24(日) 22:40:02.98ID:oexHBYog
Nushellがじわじわと来てるらしいよ
https://www.nushell.sh/
2020/05/25(月) 04:14:56.98ID:sIgPYriA
>>377
時間を気にする必要でもあんの?
2020/05/25(月) 08:11:38.36ID:heJMc7oc
>>368
「一行目に桁を表わす文字列があって,それがPIDとCOMMANDを含む」
↑これは
>>355 の挙げた
「 ps -o comm= -p $$ 」
↑これより可搬性あるって言えるの?

どちらもPOSIXでは規定されてるけど,どのOSでも使えるとは限らないし,
もっと言うとps -o comm= -p $$が使えないOSならpsの出力もPOSIXで定められた書式じゃなさそう。
2020/05/26(火) 10:37:11.76ID:DUXfe990
busyboxな環境(tiny core linux)でバックグラウンドプロセスの終了待機を行いたいんですが
psコマンドにPIDを指定する-pオプションがないので途方にくれています。
バックグラウンドプロセスは自分で起動するのでプロセスのPIDは取れてます。
psコマンドの一覧からPIDでgrepすると関係ないのも引っかかる可能性があるため困ってます。
他の手段て何かないでしょうか。
382デフォルトの名無しさん
垢版 |
2020/05/26(火) 10:48:37.13ID:5zsa2F3Z
>>380
POSIXで定められてない書式に対応すればいいだけの話

>>381
だからpsの出力をパースすればいいだけw
383デフォルトの名無しさん
垢版 |
2020/05/26(火) 11:01:33.46ID:5zsa2F3Z
>>381
どーでもいいけど、なんでバックグラウンドプロセスの終了待機でpsコマンドなんか使うの?
384デフォルトの名無しさん
垢版 |
2020/05/26(火) 11:10:30.99ID:5zsa2F3Z
シェル芸界隈の人間って、psをgrepで〜とか重い方法しか知らないよねw
2020/05/26(火) 13:11:20.00ID:EtaD8bXQ
rubyのspawnで 起動したプロセスを、終了待ちしたり、強制終了したり、親プロセスと一緒に殺す
https://takuya-1st.hatenablog.jp/entry/2016/04/07/040451

Ruby で、子プロセス起動をして、終了待ちをする。
終了待ちするには Process.wait( pid ) か、Process.waitall を使う

i = spawn(" sleep 10 " )
Process.wait i
2020/05/26(火) 16:37:31.19ID:s8Kl2PhF
>>384
シェル芸人に親でも殺されたんか?
まあおちつけよ。
2020/05/26(火) 18:30:47.45ID:DUXfe990
ps | awk '{print $1}' | grep -w $PID
grepで-wオプションが使えることが判ったのでこれで取れました
388デフォルトの名無しさん
垢版 |
2020/05/26(火) 18:52:54.27ID:5zsa2F3Z
>>387
なぁ、プロセスがいるかどうかだろ?
kill -0 "$PID" でいいやん?
389デフォルトの名無しさん
垢版 |
2020/05/26(火) 18:53:49.06ID:5zsa2F3Z
それに自分で起動したプロセスを待つだけ(何もしなくていい)なら
wait "$PID" でもいいよね?
2020/05/26(火) 20:23:33.32ID:DUXfe990
>>388
kill -0 $PIDでいけました。ありがとうございます
待機中は他の処理が走るのでポーリングで待つ必要がありました
2020/05/28(木) 12:28:14.58ID:n9bIhKS2
上の方でOil Shellについて語っていた人がいたから誰か使ってるかもしれないと思って聞くけど
export -fを使おうとすると 'export' doesn't accept -f because it's dangerous.
ってエラーになるんだけどdangerousなのってどういう場合?
また一般的にexport -fは危険だから使うな派って存在するの?
2020/05/28(木) 18:03:48.14ID:RKI8PBxM
>>391
そういう派閥があるのか知らんけど,
exportしないに越したことはないと思う。
2020/05/29(金) 00:50:25.00ID:ECv3RSEQ
>>392
それはどういう理由でしょうか?
2020/05/29(金) 11:48:42.39ID:cDEYRYlQ
シェル変数、環境変数、関数は重要なものが多い
システムの動作、セキュリティなどに重要な影響を与えるものが多い
不用意に操作すると深刻な問題が起きる可能性が高い

こんなところでしょうか
2020/05/29(金) 13:13:25.07ID:5WC69G2H
つまりシェル変数、環境変数、関数を使うなってこと?
2020/05/29(金) 17:26:04.52ID:dZOo8Hm0
よく知らない人は使わないに越したことはない
というところかなあ
よく知らない人が使うと
重要なものを上書きしてしまうことがあるし
2020/05/29(金) 17:36:28.66ID:PKgR6prj
重要なものを上書きしてしまうというのは
どういう例でしょうか?
2020/05/29(金) 19:48:52.09ID:jz7GhSHA
そりゃまあ,素人は出刃包丁なんて使わんほうがいいわな。
職人が使ったらすごく良い道具であろうとも。
2020/05/29(金) 20:22:22.27ID:Jvc7lzH+
出刃包丁の話はしてません
2020/05/29(金) 21:34:05.33ID:dZOo8Hm0
>>397
signal とか?
2020/05/29(金) 21:48:30.89ID:Jvc7lzH+
>>400
今の話に何の関係があるの?
2020/05/31(日) 15:21:54.45ID:sIM3dDR8
>>399
えぇ……と,比喩っていう概念がこの世界にはあってね,
つまり物事を説明するときに例えを用いるんだわ。
まぁ例えば会社で品質管理の監査を受けてるときに
比喩を使って説明するのはよくないかも知れんが,
こんな場末の掲示板で一々真面目に受け答えする方がオカシイって話ですよ。
2020/05/31(日) 15:27:43.93ID:JRHRMyge
>>402
比喩は物事を説明するときに使いましょう。
物事を批判するときに使うのは意味が全くありません

なぜなら"別のもの"に例えるのが比喩だからです。
"別のもの"を批判しても意味はありません。
2020/05/31(日) 17:59:31.00ID:sIM3dDR8
あぁ,あの書き方で「批判してる」って捉えちゃうのか。
あいにく,読み取り能力のない人間にまでモノを教える程暇じゃないんでね。
2020/05/31(日) 20:56:34.13ID:9ZicJfwX
質問されたからその都度答えていても
おかしな受け取られ方すると、やる気なくすよねぇ
406デフォルトの名無しさん
垢版 |
2020/06/03(水) 11:21:10.07ID:i+Bz2w1U
シェルの勉強中です。
引数にフルパスでファイル名を入れています。
シェル の動きとして引数がフルパスでなかった場合、エラーにしたいのですが、フルパスの判定はどうしたらいいでしょうか。
自分なりに考えたのは、
A=locate $1
if [ A = $1 ]
みたいな感じでlocateの実行結果と引数を比較して、完全一致しなかったら、フルパスじゃないのでエラーとしていました。
ただこの場合、例えばsyslogを指定した場合、locateにsyslogのバックアップ(syslog_0603みたいな)も引っかかってしまって上手く動作しませんでした
2020/06/03(水) 11:39:11.67ID:DK1HUsdg
最初の文字が / かどうか
2020/06/03(水) 12:18:14.74ID:gWKP5Lqg
case $path in /*) echo フルパウス; esac
409デフォルトの名無しさん
垢版 |
2020/06/03(水) 15:17:52.52ID:i+Bz2w1U
>>407
その手がありましたか。ありがとうございます
2020/06/05(金) 09:46:48.62ID:kQNq3lIP
wgetなどを使ったシェルスクリプトを作ってファイルをダウンロードしています
該当のサイトは認証が必要でログイン処理もwgetでやっているのですが
パスワードをスクリプトなりコマンドラインとして書くのを躊躇します
(cookieを使っているので1回ログインすると数ヶ月ログインする必要はありません)
なので今はログイン処理だけは別にしてreadで入力させるようにしているのですが
パスワードを暗号化して見えなくすることは出来ないでしょうか?
暗号化してるパスワードって使いまわされるんじゃ?って心配はありますが
とりあえず今回はその問題はスルーしたいと思います
2020/06/05(金) 15:09:48.09ID:wkE1tuCg
wgetで指定したURIがセキュアなら、
パスワードもそれに乗せて送られるから、
一応経路上では暗号化されているのでは?
2020/06/05(金) 15:44:51.41ID:vEUs2R05
>>410
WindowsならCredential Manager、MacならKeychainを使う
それぞれcmdkeyとsecurityというコマンドでCLIからアクセス可能
2020/06/05(金) 15:45:22.79ID:vEUs2R05
linuxは知らん
2020/06/05(金) 17:08:15.88ID:MNdAWp8s
Linuxについて,古い情報だけど。
https://dayflower.hatena!!!!!blog.com/entry/20081205/1228464510
この中でも触れられている通り,/proc/以下を叩かれたらおしまい。
多分これはmacOSでもWindowsでも似たりよったりな挙動だと思う
(パスワードを受け取るプロセスとWeb資源にアクセスするプロセスが
全然違う体系で動いてる以上,そこの間で暗証番号を遣り取りする際は
平文がそれに準ずる形で渡さざる得ないから)
2020/06/05(金) 17:24:24.91ID:/s+vLyih
>>414
それ関係ない話ですよね
2020/06/05(金) 19:06:10.01ID:52A66Mr1
そういうのはopenssl使ってるけどセキュリティーについては自信ない。
2020/06/05(金) 20:16:25.15ID:m3WbiNf2
/proc を叩かれたくなかったらコンテナ(dockerとか)使えば分離できる
/proc/*/cmdline も見れないからコマンドラインにパスワードを書くこと
に躊躇は要らない、ってのはどう?

要はそこじゃなくて TPM2.0 使って暗号化ファイルシステムマウント
しないとダメなんだろうけどさ
418デフォルトの名無しさん
垢版 |
2020/06/06(土) 01:48:18.94ID:4D637/KL
>>410
https://www.gnu.org/software/wget/manual/wget.html#index-http-password
To prevent the passwords from being seen, use the ‘--use-askpass’ or store them in .wgetrc or .netrc, and make sure to protect those files from other users with chmod.
2020/06/06(土) 03:05:03.28ID:7YMZq5d4
漏れは自分のPC 内で、apt-get する、Ruby スクリプトに、パスワードも書いてる。
他には、yahoo へログインするスクリプトにも、パスワードを書いてる

#!/usr/bin/env ruby

# 全パッケージの更新

# sudo のパスワードを自動入力する
# echo <your_password> | sudo -S <your_command>

puts `echo パスワード | sudo -S apt-get update`

puts `sudo apt-get upgrade -yV`
2020/06/06(土) 05:11:44.07ID:fEYYKFMK
root取り放題
2020/06/06(土) 08:55:47.99ID:BnF/2e3e
モヤる気持ちはわかる
2020/06/06(土) 10:25:47.70ID:X82aLPfs
まあ,パスワードとかそういう機密情報周りは難しいよね(無難な結論)

ともかくこのスレの原則に反するけど,ほんとうに機密性を重視したかったら,
「シェルで色んなコマンドを組み合わせて実現する」よりも
「一つの強固な環境で全ての機能を構築して,そこで実現する」っていう方針の方が良い気がする。
気がするだけで根拠とかは一切ないw
2020/06/08(月) 22:18:24.29ID:NLc7dq7/
foo 3>&1
3を変数にするにはどうすればいいの?

foo "$FD">&1

エラーになる
2020/06/08(月) 23:35:37.35ID:UPXG9UaF
>>423
eval "foo ${FD}>&1"
2020/06/09(火) 01:07:13.62ID:Sn2l65YM
3>&1みたいなFDの切り替えってどんな時に使うの?
FDとリダイレクトの意味は分かってるしエラー出力も使えてるけどこの使いこなすのはさっぱり
2020/06/09(火) 08:46:32.64ID:a8EVQfut
ちまちまリダイレクトするのが面倒くさい時かな?
exec 3>&1 > script.log 2>&1
echo "Phase 1 start" >&3 # 端末に出力
goo ... # 標準出力/エラー出力は script.log に自動的にリダイレクト
hoo ...
echo "Phase 2 start" >&3 # 端末に出力
...

この場合は各フェーズを関数化して、関数呼び出しに対して
都度 script.log へリダイレクトするべきだが

ただ、exec 以外で > の左に指定する数字が 1,2 以外になるパターン
( foo 3>&1 )は知らねえ
ファイルディスクリプタ 3 番に対して open せずにいきなり書き込む
のは抵抗があるわ
2020/06/09(火) 08:51:44.16ID:MxhGccu+
上のようなことをしてる関数がfooとかかな。3がfifoとかなんかで
2020/06/09(火) 11:53:36.51ID:UgSyYe/8
>425
標準エラー出力を変数に入れるときに使う
2020/06/09(火) 20:36:13.51ID:JL8YwnMO
>>427
あー,FIFOか。自分ではほぼ使わない(専ら標準入出力とパイプ)だから思い付かんかったけど,たしかにFIFOなら3とかに繋ぐのはありそう。
430デフォルトの名無しさん
垢版 |
2020/06/11(木) 14:08:25.44ID:IxigL/zf
ret=$(printf '\n\n\n\n\n')

if [ "$ret" = "" ]; then
echo true
fi

これってなにげに罠だと思うけど
なんで誰も疑問視しないの?
2020/06/11(木) 14:17:42.98ID:ibS6rTlb
規格による正当な動作だから
432デフォルトの名無しさん
垢版 |
2020/06/11(木) 14:24:11.61ID:IxigL/zf
その正当な動作がおかしいだろって話
仕様バグ
433デフォルトの名無しさん
垢版 |
2020/06/11(木) 14:25:39.14ID:IxigL/zf
つーかさ、誰もハマらないの?
echo で最期に改行がついていても -n で改行を無くしても
同じになるっておかしいと思わないの?
2020/06/11(木) 14:29:59.67ID:ibS6rTlb
コマンド置換で最後の改行続きに意味があるというのは少ないんだろう
それで意味ない改行を消すのはめんどくさいというのならば、理にかなってる
大事ならコマンド置換のコマンドで最後にスペースでも強制的につければいいだろう

仕様考え今までそれを使ってる準じてshell作ってる他諸々はお前よりは賢いことは確かだから、お前が仕様バグと言っても鼻で笑われるだけだろうw
2020/06/11(木) 14:32:01.77ID:ibS6rTlb
>>433
そういう仕様だから。明確に書いてあるから
仕様を読んですらいないのが明らかだな
436デフォルトの名無しさん
垢版 |
2020/06/11(木) 14:41:06.98ID:92eNOFs2
仕様を読み込んで全部把握してから
言語を使うやつなんていねーだろ
2020/06/11(木) 14:50:35.57ID:ibS6rTlb
おかしいと思ったら調べるのは普通だわな
自分が絶対正しいマンは知らんけど
438デフォルトの名無しさん
垢版 |
2020/06/11(木) 15:13:40.27ID:92eNOFs2
>>437
それでなんでそういう仕様なのか、お前は調べたのか?
2020/06/11(木) 15:35:16.88ID:VbX/tETo
仕様は、読んで(どういう意図かを読んで)理解するものだぞ?
お前は仕様を理解するために仕様を説明してるとこを読むのが普通なのか?
440デフォルトの名無しさん
垢版 |
2020/06/11(木) 15:39:01.44ID:92eNOFs2
>>439
だからどういう意図でそういう仕様になってるのかって聞いてるんだが
お前は仕様だったら、そうなってる理由とか何も考えないのか?
2020/06/11(木) 15:45:20.60ID:VbX/tETo
最後の改行(の続きに)は意味がない
と普通に読めるだろ。文(の意図)を読めなさすぎ
2020/06/11(木) 15:48:46.65ID:VbX/tETo
>仕様を読み込んで全部把握してから
という 仕様を読む読まない から、あっさり、
>なんでそういう仕様なのか
読んでどうというようにすり替えてるし、いつもの文を読めない読まない自己都合で言葉を吐くだけのやつか
443デフォルトの名無しさん
垢版 |
2020/06/11(木) 15:49:29.97ID:92eNOFs2
最後の改行に意味がないという理屈なら
catコマンドとかも最後の改行は消えるべきでは?
2020/06/11(木) 15:51:14.69ID:VbX/tETo
物事は01ではできてないと理解しような
似たようなので違うとか普通にあるだろうに
しかし、いつものだなw
445デフォルトの名無しさん
垢版 |
2020/06/11(木) 16:24:52.88ID:92eNOFs2
0か1ではないという当たり前ことを言うだけで
理由については一切何も考えてないってことがよく分かるなw
2020/06/11(木) 16:50:05.12ID:VbX/tETo
>0か1ではないという当たり前こと
らしいけど>>443って言うんだな
理由ww 場合による=01ではないだろに。ホントに文が読めない書けないみたいな感じ
てか、そのレスから明らかすぎるほど明らかにいつものだったな
2020/06/11(木) 16:58:04.41ID:VbX/tETo
まとめ
仕様を読んでない
(最初から)仕様読むのが当たり前か
疑問に思ったら仕様を読むのは当たり前
仕様読んで意図がわかるのか
〜という意図だと読めばわかるだろ
AとBが違う
01じゃないんだから、違うのも普通にある
理由については一切何も考えてない
www
いつものむちゃくちゃ、ああ言えばこう言うというナゼか執着心だけが強いお人でした

Fin~
448デフォルトの名無しさん
垢版 |
2020/06/11(木) 16:59:11.72ID:92eNOFs2
>>446
> 理由ww 場合による
その「場合」がどんなときかと聞いてるんだろ
2020/06/11(木) 17:00:17.93ID:VbX/tETo
お前のママじゃないんだから、なんでなんでにいつまでも答えるわけねえだろ、いい加減
ママに聞きなさい。じゃあね
450デフォルトの名無しさん
垢版 |
2020/06/11(木) 17:03:50.41ID:92eNOFs2
な?結局、ここにそれを書けと言っても
書いてあるはず。それを見ろ。というだけで答えられないわけさ
2020/06/11(木) 17:05:12.16ID:VbX/tETo
>ここにそれを書けと言っても
何様なんだかな... お子様かw
452デフォルトの名無しさん
垢版 |
2020/06/11(木) 17:06:49.63ID:92eNOFs2
ほらまた論点とは別の話をし始めてる。な、そういうとこだよ
2020/06/11(木) 17:08:27.87ID:VbX/tETo
オマいうwwwww
ホント、ツッコミしやすすぎて...すげえな。キリがないから、じゃ、ほんとに
454デフォルトの名無しさん
垢版 |
2020/06/11(木) 17:38:44.92ID:92eNOFs2
シェルの話をしてるか、人の話をしているかで
だいたい区別できるよな
2020/06/14(日) 01:56:01.34ID:eRp+24Cv
マジか・・・、set -vって関数の中身は一行ごと表示してくれないのか・・・
2020/06/14(日) 10:56:11.88ID:rnZVTcdX
一時期,set -vとかを駆使してシェルスクリプトの自己文書化に拘ってた時期があった。
あまりに無毛だったんで止めたけどw
2020/06/14(日) 11:05:27.03ID:Wt6fQqct
パイパンかw
2020/06/14(日) 11:35:23.18ID:v+4IVp6H
>>457
頭ではなく下の方にしたのは優しさか
2020/06/14(日) 13:38:52.36ID:eRp+24Cv
>>456
自己文書化ってどんなの?
2020/06/14(日) 13:57:38.38ID:nNGIeJAo
プリンターに髪をsetするんだろう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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