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

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

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

シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
339デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:05:04.34ID:41YM3k+D
>>336
自分で書いといてアホなこと言ってんのかこいつはwww
あーほあーほ
340デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:07:18.47ID:41YM3k+D
>>332

> 特に >>302 の内容が決定的に撤回困難にしている
> これは君が示した文書で、君を苦しめているのは君自身
> ちがうか?

意味不。 >>302の内容は

SHELL
This variable shall represent a pathname of the user's preferred command language interpreter.
この変数は、ユーザーの優先コマンド言語インタープリターのパス名を表します。

と書いてある通り、ユーザーの優先、つまりログインシェルのこと
それ以外のどういう意味があるんだよ?zshでログインしてbash起動したら
bashがユーザーの優先になるんだ!ってお前は言いたいんか?
341デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:09:21.26ID:41YM3k+D
> dashのソース中にはチラ見ではちょっとそういうのを設定しているとこは見えないけどって話。どこでやってんのかなあって話
SHELL環境変数は基本的に外部から渡される環境変数なんだから、そんなものなくても当たり前
bashは空だった場合に自分で設定しているようだが、それは空だった場合の話で
入っていればなにもしないということ
2020/05/19(火) 23:14:34.20ID:3kLN/2rB
>>341
負けず嫌いというか、誤りを認めたくないのは、アイツと同じだなw
お前がbashがといいだしたんだろうがっ。まあ、だいたい合意形成できてるからもういいや
343デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:16:01.88ID:41YM3k+D
手元の動作と周りの情報が全部違っていたら、自分の手元が間違ってるって考えないもんかねw
なんで俺の手元で再現させる?再現してないからそれは違うって言ってるに決まってるだろ
常識として「自分の手元だけで発生してる」は信用ならんから
ソースとして外部の情報を参照しろって言ってるのに、こいつは手元しか見ていない
2020/05/19(火) 23:21:55.33ID:3kLN/2rB
>>340
優先の より 好みの の方がしっくりこなくね?w
ログインシェルはもろ好みだから個々そういう設定にできるんだし

>>343
なんかイライラしてんのか?ちょっとイミフだな。まあいいたいことはなんとなくわかるけどw
345デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:22:13.23ID:41YM3k+D
はい。誰でも簡単に再現できます(笑)
bashを起動したところでSHELLは再設定などされません
(dashはSHELLが空の場合は自分で設定などしないんだな)

$ docker run -it debian dash
# echo $SHELL

# export SHELL=abc
# echo $SHELL
abc
# bash
root@58fdfabe096c:/# $SHELL
abc
346デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:22:42.25ID:41YM3k+D
>>344
> 優先の より 好みの の方がしっくりこなくね?w
google先生に楯突くな!
2020/05/19(火) 23:24:47.87ID:3kLN/2rB
>>346
ww
348デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:25:40.73ID:41YM3k+D
debian 7がbash 4.2.37だな
docker run -it debian:7 dash でやればいい。結果は同じだが
349デフォルトの名無しさん
垢版 |
2020/05/19(火) 23:29:44.81ID:41YM3k+D
いい加減理解したかね?俺なんか数年前に

「あぁ!?SHELLは現在のシェルじゃねーのかよ!
現在のシェルのパスはどうやって調べればいいんだよ!」

で苦労してんだから間違いなわけねーっつーの
2020/05/20(水) 00:20:43.81ID:91fxSgSA
Windows10, WSL, Ubuntu 18.04 で、やったら、

echo $SHELL
/bin/bash

>>336
/etc/@passwd に、デフォルトシェルが設定してある

ユーザー名:x:1000:1000:,,,:/home/ユーザー名:/bin/bash
2020/05/20(水) 00:24:36.85ID:9QbBPRXg
こいつは一体誰と戦ってるんだ・・・
352デフォルトの名無しさん
垢版 |
2020/05/20(水) 00:44:53.45ID:InboTxWs
>>350
話の流れが読めてない
そこからzshとか他のシェルに変えても$SHELLは/bin/bashのままだって話をしてる
2020/05/20(水) 01:16:06.12ID:2U5TD7Rg
WSLは変態だから、bash.exe で(WSLを)起動すると、chsh/passwd直接などでログインシェルを他のにしても無視されて、bashがログインシェル(?)になる。当然、SHELLは/bin/bash
ログインシェルをzshに変えた、bash.exeで起動した、(bashが起動してるしSHELLはすでに/bin/bashだけど、)、コマンドラインでbashを起動した。SHELLが/bin/bashになってる変わった!
とかか?w

WSLでもubuntu.exeで起動したらまともに起動するっぽいし、他の正規のUnix/Linuxと同じ動作にしかならんな
2020/05/20(水) 10:06:46.91ID:9mY3JetI
>>334
thx
2020/05/20(水) 10:09:40.38ID:9mY3JetI
結局,現在使ってるシェルを確かめる最も可搬で確実な方法って
ps -o comm= -p $$
↑これかな。
2020/05/20(水) 10:31:11.68ID:InboTxWs
>>355
最も可搬な方法でも完璧ではないよ
それが使えないpsコマンドもたくさんある
2020/05/20(水) 13:58:16.99ID:9mY3JetI
そりゃ完璧ではないだろうけど。
でもまぁ,「最も」可搬な方法ではあるのよね。
2020/05/20(水) 14:29:26.47ID:InboTxWs
真面目に出力をパースすれば最も可搬になる
2020/05/21(木) 18:22:14.34ID:eGAQdhfO
そうかなぁ。
その出力がシステムの間で共通していないから,出力を指定するオプションを付ける必要があるんだけど,
そのオプションにすら可搬性がない,っていう状況だと認識してる。

>>358
ちなみに「真面目なパース」の例を挙げてほしい。
2020/05/21(木) 18:33:46.87ID:C3uZcQQo
dash,ksh,zshでの、-c でだと、
ps -p $$ は ps 自身になってるんだけど、なんでやねんっと思わなくもない
-c だから別にいいだろうけど
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
それでなんでそういう仕様なのか、お前は調べたのか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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