X



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

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

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

シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
0176デフォルトの名無しさん
垢版 |
2020/04/17(金) 19:56:23.51ID:UJSQQO8I
え,関数って一行で定義するときは
foo() echo hello;
みたいに波括弧で括る必要ないの?
知らんかった。
0177デフォルトの名無しさん
垢版 |
2020/04/17(金) 19:58:37.78ID:9nBzfuh2
>>175
リンク先見ろ、Grouping Commands って書いてあるだろ

compound-command は
 () や {} でグループ化してもいいし、しなくてもいい
 単一のコマンドも compound-command
 というか、単一のコマンドが compound-command であり
 複数のコマンドをまとめる時に Grouping Commands を使う
0179デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:01:55.41ID:9nBzfuh2
>>176
あとグループ化するのに使うのは {} または () なので

foo() { echo hello; } の代わりに
foo() (echo hello) と書いても良い

こっちはbashやyashも対応している。
ただし当然のことながらサブシェルで実行される。
0180デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:05:05.86ID:9nBzfuh2
fname ( ) compound-command [io-redirect ...]
の最後からわかるように

foo() { echo hello; } >/dev/null や
foo() (echo hello) >/dev/null とも書ける

もちろん複数行でこのように書いてもいい
関数が出すエラーを全て捨てる場合とかに使える

foo() {
 echo hello
} 2>/dev/null
0181デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:07:41.32ID:nls2b0po
>>177
> 単一のコマンドも compound-command
> というか、単一のコマンドが compound-command であり

それ初耳だわ
どこに書いてある?
0182デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:13:43.55ID:9nBzfuh2
>>181
なんのために Grouping Commands と別に説明してある思ってる?

Grouping Commands を作るための {} または () が必須じゃないから、
「compound-commands の定義は {} または () で始まる」と*書かれてない*んだよ
0183デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:56:24.03ID:xgpGiYXu
2.9.4 Compound Commands
The shell has several programming constructs that are "compound commands", which provide control flow for commands.

Each of these compound commands has a reserved word or control operator at the beginning, and a corresponding terminator reserved word or operator at the end

でその後Compound Commandsとして上げられてるが以下の6つ
- Grouping Commands
- The for Loop
- Case Conditional Construct
- The if Conditional Construct
- The while Loop
- The until Loop

echo helloは開始・終了を示す予約語もなければ、上の6つのどれにも当てはまらないからCompound Commandではない
0185デフォルトの名無しさん
垢版 |
2020/04/17(金) 21:06:47.56ID:9nBzfuh2
>>183
Compound Commands はその6つって言いたいの?

なら以下の関数定義はPOSIX 準拠ってことだね

foo() for i in a b c; do echo $i; done
foo() case a in a) echo a; esac
foo() if [ a ]; then echo a; fi
foo() while [ $# -gt 0 ]; do echo $1; shift; done
0186デフォルトの名無しさん
垢版 |
2020/04/17(金) 22:32:27.89ID:UJSQQO8I
<<. dash
foo() echo hello
foo
.
hello

たしかにDashだと問題なく定義できるな……。
こんなこと始めて知ったわ。実地で使うかどうかは置いといてw
0189デフォルトの名無しさん
垢版 |
2020/04/18(土) 00:28:42.97ID:6r7FvQ+k
>>169
type { }やると分かるけど{}はシェルの予約語
{}に意味があるから{ この空白も閉じる前の;}もいる
for i inをforiinにできないようなもんで
()はtypeで何も出てこないけどね
0190デフォルトの名無しさん
垢版 |
2020/04/18(土) 13:41:33.88ID:6HUqz/fc
set -eの挙動について教えて下さい!

これを実行したら何も表示されずに終了されました
set -e
foo() {
false
echo foo
}
foo
echo $?

その理由はわかります

質問はfooの中身を一切変えずにset -eの状態で
fooを画面に表示させずに $? (= 1) を
取得する方法はあるのでしょうか?
0191デフォルトの名無しさん
垢版 |
2020/04/18(土) 13:58:58.99ID:iaqzJhUO
{ と [ は記号でなく「コマンド」

$ ls -l



$ ls-l

とスペースを入れないと動かなくなる
これと一緒
0193デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:16:36.81ID:6HUqz/fc
>>192
> ! ret=foo
なんですか、これ!?って思ったらfoo関数呼び出してないじゃないですかぁ

> if ret=$(foo); then
なるほど、これで取得できるんですねって思って
やったんですけど truthy foo 0 ってでました
0194デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:53:00.73ID:8o9dGOG1
>>190
パイプライン (1 つの 単純なコマンド からなるものでもよい)、 括弧で囲まれた サブシェル のコマンド、 ブレース (前述の シェルの文法 を参照) で囲まれたコマンドのリストの一部として
実行されたコマンドの 1 つ が 0 でないステータスで終了した場合、即座に終了します

だから。falseの時点でどうであれメインシェルプロセスがそこで終了、echo fooなんて実行しない、もちろん呼び出し元にも戻らない
>>192は上記に続く文に沿ってのじゃないかなあ。だが、if false; then ... とかの話で、違うだろうな文的にも。わざとなのかわからんけどw

そういう動作を望んで set -e してるのにそういう動作すんなって無理じゃね
0195デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:07:44.49ID:8o9dGOG1
bash 限定なら、
export -f foo
bash -c 'foo' && echo $? || echo $?
で、一応動くようではあるな(ちゃんとfooでのステータス値も返る)
0196デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:44:44.40ID:8o9dGOG1
>>195
bash -c 'set -e;foo' && echo $? || echo $?
だった。set -e は別に継承されるわけないと後で気づいた

で、>>192のネタ確認してみたらできそうなのね。$()なんて出力結果求めるのにしか使ったことないのでこれでいいのか??と頭ウニだけど

if $(set -e && foo); then echo $?; else echo $?; fi

なんかbash限定でもなく動いてるな(w)
0197デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:58:24.37ID:8o9dGOG1
あぁ、$() は正常時はやっぱりダメか。そりゃそうだな(スッキリしたw)
ret=$(foo) のような、なんか工夫すればできそうな気もしないでもないが。そういうことなのね、失礼>>192
0199デフォルトの名無しさん
垢版 |
2020/04/18(土) 19:01:48.64ID:8o9dGOG1
出力結果をスクリプトで扱うために欲しいわけじゃないから
$() だと関数も外部コマンドのように別(のメイン)プロセスとして呼べる=bash固有のでなくて使えそうだなあという、ニコイチではなくどっちかの話
0201デフォルトの名無しさん
垢版 |
2020/04/18(土) 23:55:48.35ID:L3zGDU5z
$ $(echo hoge)
hoge: command not found
まあ、当然そうだわな
$ $(exit 12)
$ echo $?
12
へー、コマンドねえぞとお怒りにはならんのか。空行とみなして無かったこと(?)になるのか
echo ' 'とかスペースタブだけ(?)なら許してくれる、: と違いステータスも変わらない

てことで、標準出力に何も出さなければいいのねで、

exec 9>&1
$(set -e; foo >&9) && echo $? || echo $?

でbash以外でも動くことは動く ($() 内ってCommandsでもいいのね)
$()内での set -e はない方がスッキリだが必要ないシェルもあるもあるが必要とするシェルがある
0202デフォルトの名無しさん
垢版 |
2020/04/19(日) 00:14:03.50ID:u21QryuH
例えば、Ruby のバージョンマネージャー・rbenv の、rbenv-installer の冒頭部分は、

#!/bin/bash

# コマンドの終了コードが、0以外なら強制終了する
set -e

homebrew=

# -p : タイプが「file(実行ファイル)」の時のみ実行ファイルの絶対パスを出力する
# (それ以外のタイプの場合は何も出力しない)

type -p brew >/dev/null && homebrew=1
0203デフォルトの名無しさん
垢版 |
2020/04/21(火) 09:06:14.84ID:h1bS6DJt
コマンドってファイルに書くのと実行形式を~/binに置くのとどっちがいいの
関数とエイリアスの違いは分かったけど使い分けできてないな
0204デフォルトの名無しさん
垢版 |
2020/04/21(火) 10:50:42.27ID:FcWzzI7X
/dev/urandomっていうデバイスファイルが,
ほんとにただのファイルとか実は同じ値ばっかり出力するデバイスファイルとか
じゃないってことを保証する方法ってある?
0205デフォルトの名無しさん
垢版 |
2020/04/21(火) 13:16:25.79ID:bkXsrA+q
>>203
いろんなところで使いたいコマンドは ~/bin に置いておいて
パスを通しておく。限定的な使い方をするコマンドはそのディレクトリに
置いておくのかな。私はそうしている。
0206デフォルトの名無しさん
垢版 |
2020/04/21(火) 15:24:10.19ID:Lx1iEb8v
>>204
ないよ。
作ろうと思えば/dev/urandomを独自実装のデバイスファイルに置き換えられるんだから。
それっぽい値を返すデバイスファイルを作ろうと思えば作れる
例えばWSL1はWindowsでLinuxカーネルをエミュレートしてるんだから
/dev/urandom とかMSの独自実装のデバイスでしょ?
0207デフォルトの名無しさん
垢版 |
2020/04/21(火) 15:27:13.15ID:Lx1iEb8v
>>203
コマンドをファイルに書くって関数のこと?
CLIから呼び出す汎用的なものは~/binで
スクリプト内部で使うだけなら関数にするだけじゃないの?
そしてエイリアスはインタラクティブシェルで使うもの
bashがデフォルトでスクリプトでは無効になってるのはそういう事
0208デフォルトの名無しさん
垢版 |
2020/04/21(火) 16:17:24.29ID:fQ5b9H0O
>スクリプト内部で使うだけなら関数にするだけ
と思い込んでたら、>>56みたいになるぞw
>bashがデフォルトでスクリプトでは無効になってるのはそういう事
まあ、4からか?そういう方がいいだろうと思い変えたのだろうが、--posixでは有効なんだけどな
0209デフォルトの名無しさん
垢版 |
2020/04/21(火) 16:29:23.76ID:Lx1iEb8v
>>56は、rbenvはインタラクティブシェルで使うために
alias使ってるんでしょ?

> まあ、4からか?
ずっと前からやろ?
0213デフォルトの名無しさん
垢版 |
2020/04/21(火) 16:59:29.51ID:fQ5b9H0O
>>209
>alias使ってるんでしょ?
ああ...これもか...
色々想像するのは勝手だが、なんか色々勝手な想像ばかりで全く調べてないなって感じだぞ
0214デフォルトの名無しさん
垢版 |
2020/04/21(火) 17:43:01.90ID:fQ5b9H0O
>>209,211
ああ、すまん
実行できないのは最初からだし、存在さえもしないのは3以降からだな(2では存在はするが実行時エラー)
>まあ、4からか?そういう方がいいだろうと思い変えたのだろうが
の部分は間違い勘違い、すまん
0215デフォルトの名無しさん
垢版 |
2020/04/21(火) 18:23:13.41ID:Lx1iEb8v
>>213
調べるとか何のこと?
スクリプト内部でだけ使うなら関数って言ってるだけなんだけど?
021656
垢版 |
2020/04/21(火) 20:51:03.40ID:HADG6GDb
anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える。
~/.bashrc に、下の2行を追加するだけで、各言語ごとに追加しないでも良い

export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"

結局、この追加した、eval で、rbenv という関数を読み込んでいたという落ちw
021756
垢版 |
2020/04/21(火) 20:57:08.31ID:HADG6GDb
>>165
に書いてます

シェル関数は、その関数が定義されたファイルを読み込んでいれば使えるけど、
読み込んでいなければ使えない
0218デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:30:49.10ID:fQ5b9H0O
>>215
想像でそれも自分の言ったことに都合が良いだけで言うなってことだよ
すぐ下のレスに状態を本人が書いてるだろに
0219デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:50:22.71ID:Lx1iEb8v
rbenvはaliasをインタラクティブシェルで使ってない

だからといって、
「aliasはインタラクティブシェルで使うもの」を
否定してることにはならんのだが・
0220デフォルトの名無しさん
垢版 |
2020/04/21(火) 22:16:38.40ID:fQ5b9H0O
何言ってるの?
>>スクリプト内部で使うだけなら関数にするだけ
>と思い込んでたら、>>56みたいになるぞw
から、想像だけで「alias使ってるんでしょ?」て間違ったこと「いきなり」言い始めたんんだけど。それが関数なんてすぐ下に書いてあるのに、見も/調べもせずに「いきなり」

「スクリプト内部で使う[だけ]なら[関数]」だから、見も/調べもせずに「alias使ってるんでしょ?」なんて間違いを平気で言ったんでしょ?

aliasはインタラクティブシェルで使うものは別件で、そこは関数のことだろに


aliasはインタラクティブシェルで使うものは特に否定はしてないが、POSIXでそう決めてるわけではない。>>210を自分でちゃんと読めば>>210はなんの補強にもなってないのに誤った抽出ってこと
0221デフォルトの名無しさん
垢版 |
2020/04/21(火) 22:19:02.65ID:Lx1iEb8v
「スクリプト内部で使うだけなら関数にするだけ」は
否定しないんだね
0222デフォルトの名無しさん
垢版 |
2020/04/21(火) 22:21:12.97ID:fQ5b9H0O
読めなさすぎだろう。なんでそうなる??
スクリプト内部で使う[だけ]じゃない[関数]がって例の話なのに
ダメだな読めなさすぎ、今までのでも
0227デフォルトの名無しさん
垢版 |
2020/04/22(水) 18:17:22.60ID:hVJ7sunP
質問禁止という意味じゃない。質問もありだし質問のをネタにしたのもあり
質問箱スレならQ/A以外は雑音にしかならんという意味
0228デフォルトの名無しさん
垢版 |
2020/04/23(木) 02:03:46.11ID:SDkT6EOl
cronの書式を読み取りたいんですがなぜかファイル名が読み取られてしまいます。なぜでしょうか?
0229デフォルトの名無しさん
垢版 |
2020/04/23(木) 22:30:55.15ID:LOz3K8jb
どうやったらそんな挙動になるんだ?
ちょっとどんなコマンド打ったか書いてみて。
0230デフォルトの名無しさん
垢版 |
2020/04/23(木) 23:01:10.88ID:UKSnHl0c
>>228
クォートしてないからでしょ
$ ls
crontab
$ echo * * * * * user-name command to be executed
crontab crontab crontab crontab crontab user-name command to be executed
$ echo "* * * * * user-name command to be executed"
* * * * * user-name command to be executed
0231デフォルトの名無しさん
垢版 |
2020/04/24(金) 00:57:40.18ID:QUI7MWka
>>229
setを使ってスペース区切りで分割したらファイル名になりました

>>230
そこから各フィールドごとに分割するのはどうしたらいいでしょうか?
0235デフォルトの名無しさん
垢版 |
2020/04/24(金) 03:11:08.96ID:F2FblhOM
cat /etc/crontab | grep -v '^[ \t]*#' | while read m h D M W u c; do [ "$c" != '' ] && echo "$M/$D $W $h:$m ($u) $c"; done
でいいのかな??

しかし、>>228から * のGLOB展開とわかるなんてすげえなw>>230
0236デフォルトの名無しさん
垢版 |
2020/04/25(土) 23:21:25.07ID:dkVnBOhV
他スレで -z とか見て思い出したんだけどさ
[ -z "$str" ] とか [ -n "$str" ] って必要なの?
[ "$str" ] とか [ ! "$str" ] でいいと思うんだけど?

[ "$op" "$str" ] みたいに演算子を変数に入れられるから
機能そのものが不要だとはは思わないけど
通常は [ "$str" ] や [ ! "$str" ] で良くない?
他の言語だとこっちだからわかりやすいし
0237デフォルトの名無しさん
垢版 |
2020/04/25(土) 23:31:42.54ID:gS2ps0hn
他の言語だったらそういうのはBooleanでしか使わないという文化な人々も居る
[ -z "$str" ] や [ -n "$str" ] よりも [ "$str" = "" ] とか [ "$str" != "" ] の方が見る機会が多かったな
0238デフォルトの名無しさん
垢版 |
2020/04/25(土) 23:59:47.04ID:Ey2ZfVC3
>>236
先頭にマイナス記号が入らないことが保証されるのならいいのでは?
0239デフォルトの名無しさん
垢版 |
2020/04/26(日) 00:16:24.29ID:D7tlSM02
>>238
関係ないでしょ? その場合こう展開される
[ "-z" ] または [ "-n" ] これはどちらも文字列があるから0

[ ] で囲まれた中身が1個の場合は決してオペレータとして扱わないのだから
どんな文字が来たとしても問題ない。空文字以外は0となる
ついでにいうと [ ] の中身が0個の場合は常に非0

そもそも [ ] (test)のドキュメントに
STRING は -n STRING と等価と書かれている
仕様通り
0240デフォルトの名無しさん
垢版 |
2020/04/26(日) 03:16:05.39ID:cVjuSaki
>>239
他の条件とand/orされる場合は?
0241デフォルトの名無しさん
垢版 |
2020/04/26(日) 03:17:32.99ID:D7tlSM02
>>240
-a と -o に関しては、shellcheckさんが禁止しております
[ 略 -a 略 ] は使いません。必要なら [ 略 ] && [ 略 ] こうします
0242デフォルトの名無しさん
垢版 |
2020/04/26(日) 03:29:33.94ID:cVjuSaki
>>241
そういう独自ルールを適用するならそれで良いんじゃねえか?
ただ独自ルールだからそれとセットで説明する必要がある。
0243デフォルトの名無しさん
垢版 |
2020/04/26(日) 04:31:48.38ID:D7tlSM02
>>242
ん?でもさ -a とか -o 使っても問題ないんじゃね?
[ str -a ] みたいなのってありえないんだからさ[ -a -a ] もないでしょ?
[ -a -a -a ] だと 最初と最後が文字だって一意に識別できるよね?

訂正する
> 他の条件とand/orされる場合は?

他の条件とand/orされる場合 かつ 混乱するようなパターンってありえるの?
0244デフォルトの名無しさん
垢版 |
2020/04/26(日) 04:38:33.47ID:cVjuSaki
>>243
シェルというかtestコマンドってそんなに賢く自動判別してくれるの?
これからそういうシェルまたはtestコマンド作るって話?
だったら作ればいいんじゃね?そうすればそれはそういうものですって言えるしそれでokだ。
0245デフォルトの名無しさん
垢版 |
2020/04/26(日) 04:48:09.65ID:D7tlSM02
なんでシェルをディスってるの?
これからも何も「testは賢く判断するから問題ないよね」って聞いてるだけなのに
0246デフォルトの名無しさん
垢版 |
2020/04/26(日) 04:53:55.28ID:D7tlSM02
>>244
こういえば良いのか?
POSIXで決まっている仕様どおりの正しい動きです。
これから作る必要など全くありません。
0247デフォルトの名無しさん
垢版 |
2020/04/26(日) 04:56:34.45ID:cVjuSaki
あ、そう。じゃあそれでいいんじゃね?
0250デフォルトの名無しさん
垢版 |
2020/04/26(日) 15:26:53.79ID:D7tlSM02
質問者 (POSIX準拠の仕様)これ問題ある?
回答者 問題あるに決まってるだろ。あれとかこれとかどうなんだ?

質問者 それらは問題ないよね?
回答者 お前の流儀を押し付けるな!

なんだこのながれ
0251デフォルトの名無しさん
垢版 |
2020/04/26(日) 15:35:41.02ID:UR76YMSe
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
0252デフォルトの名無しさん
垢版 |
2020/04/26(日) 15:55:10.56ID:D7tlSM02
まともなレスじゃなくて、個人たたきに変わったからな
POSIXの仕様にたいして俺流儀とかアホかと
0254デフォルトの名無しさん
垢版 |
2020/04/28(火) 06:27:22.31ID:6K6MgdzD
ハクション大魔王2020は面白いな。
0255デフォルトの名無しさん
垢版 |
2020/04/28(火) 08:02:31.62ID:w59d7UdO
俺流儀に見えたってことはそういうことでは
虚栄心だけじゃ何も学べないよねぇ
0258デフォルトの名無しさん
垢版 |
2020/04/28(火) 15:22:47.80ID:7mVXavmj
宗教だろ…(直球)
0265デフォルトの名無しさん
垢版 |
2020/04/29(水) 20:20:23.45ID:sus1L+2H
ち、やっぱり set -uしたときにecho ${A+x} ってしたら
fatal: Undefined variableで落ちるじゃねーか
変数が定義されているかのチェックすら出来ねぇ
0267デフォルトの名無しさん
垢版 |
2020/04/29(水) 22:37:55.93ID:sus1L+2H
>>266
立て逃げしていいならするけどさ、やり取りが面倒なんだよ
この程度ででるぐらいなら他にも問題たくさんありそうだしstar多いんだろ?誰かが頑張ってくれ
それかすでにあるんじゃねーの?OilShellがどこまで本気なのか知らんが、
まがりなりにもPOSIX準拠を名乗りたいのなら絶対には対応していないといけない
基本機能だからな。(変数定義確認方法のFAQレベルだぞこれは)
俺にとっては数あるシェルの一つでしかないし別件で忙しい
0268デフォルトの名無しさん
垢版 |
2020/04/30(木) 01:05:28.49ID:vtgsH/Bs
POSIX互換を謳う俺々シェルの利点って何なの
わざわざ作るってことは今のPOSIXは不備あるのか
0270デフォルトの名無しさん
垢版 |
2020/04/30(木) 08:09:08.08ID:04alJDEx
作るだろ?不満があったから新しいものを作る
ただし移行パスがなければ移行しないのでその方法を提供する
よくある話だ
0273デフォルトの名無しさん
垢版 |
2020/04/30(木) 14:31:36.43ID:gdZAiUWY
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
0274デフォルトの名無しさん
垢版 |
2020/04/30(木) 14:31:36.48ID:gdZAiUWY
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

PS 連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
■ このスレッドは過去ログ倉庫に格納されています