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

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

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

シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
2020/04/08(水) 09:52:21.83ID:/PQASvbd
意訳:俺の好みじゃない。Windowsがいちばん
2020/04/08(水) 09:58:42.93ID:gjFvYWAv
ただWindowsを使ってて知ってることが多いってだけだな
単にそれで基準がWindows
それ以上手がかかってもダメだし手がかけられないとダメ、
Windowsで知ったことの範囲でWindowsの手順でできなきゃダメってだけ
2020/04/08(水) 10:46:28.90ID:kH2GeAXz
Linuxと言うかオープンソース界隈でいやなのは
先駆者が先輩面したり初心者を馬鹿にして
さも自分がすごいんだと言いたげなところかなあ
これと対極をなすのがスマホとかなんだけど
知り合いの若いのにアプリの使い方聞いてみ?
親切に教えてくれるぞ

要するに俺はLinuxを知ってる!
オープンソースを知ってる!
でも誰も褒めてくれないから
新参者がきたら牢名主のように
小言を言い続けてやると思ってそうなところ
2020/04/08(水) 10:47:16.11ID:kH2GeAXz
まあ手に入れた数少ないスキルだからしゃーないか
2020/04/08(水) 12:06:02.73ID:+6aWDKKq
俺にLinuxや他のOSSを教えてくれた人はそんな人じゃなかったな。
懇切丁寧に教育してくれた。

寧ろ大学やらでWindowsやExcelの使い方を指導してた教員のほうが態度が酷かった。

まぁ,どういう人に恵まれるかで,その「教えた対象」の評価すら変わるってのは,ちょっと非論理的だけど,
かく言う俺も,多分上で話した教員のせいで,Microsoft製品を色眼鏡で見てしまうきらいがある。
2020/04/08(水) 13:15:43.23ID:oh4YVJIM
>>88
> ただWindowsを使ってて知ってることが多いってだけだな

だから営業部隊の話につながる。
使ってもらうにはどうしたらいいか?答えは宣伝だよ。
パソコン屋に置いてもらうネットやテレビで宣伝する。

いずれも金がかかる方法だ。だからオープンソースいう
選択をした時点で積んでいるんだよ。自分で自ら王手されに行った。
いや王手がだめって言ってるんじゃないよ。
相手(利用者)にとってはいい捕虜だから
2020/04/08(水) 13:57:03.92ID:247C/Fba
Linuxが普及してない世界線でシェルスクリプト書いてるやつもおるんやなw
2020/04/08(水) 14:19:48.18ID:5a3Kp3Hv
>>93
世界=俺の知っている世界、または
世界=俺の見たい世界
って奴がたまにいるからね
2020/04/08(水) 15:36:59.25ID:WKxansXY
変な位置で改行するやつ多いな
みんな同じ環境で見てると思ってるんだろうな
2020/04/08(水) 15:57:31.62ID:oh4YVJIM
同じ環境で見てるとは思ってないが、
最低横80文字(笑)ぐらいで見てると思ってる
スマホぐらいだろ?そのスマホで長い文字が読みづらいなら
それはサイトの仕様が悪いだけ
97デフォルトの名無しさん
垢版 |
2020/04/08(水) 16:04:41.38ID:snKRM3SL
マックをLinuxに加えれば結構シェアが取れていると思うぞ。
2020/04/08(水) 16:10:53.92ID:oh4YVJIM
MacでLinux用バイナリがそのまま動かないなら、Linuxとは認められません
2020/04/08(水) 16:18:00.91ID:kuvoBLk0
なにを主張したいのか
なにを否定したいのか
シェルスクリプトと全然関係ないことには変わりなさそう
2020/04/08(水) 16:28:47.40ID:WKxansXY
サーバーOSシェアはLinuxがダントツだからな
WSLの環境作るのも楽になったしWindowsは単なるコンテナになった
2020/04/08(水) 17:31:57.45ID:1eDcIZ82
普通にwin上でbashです
2020/04/08(水) 17:35:44.13ID:oh4YVJIM
> Windowsは単なるコンテナになった

これは「すごいこと」という意味だよね?
Linuxも単なるコンテナになることが出来る。
コンテナになれるというのはモダンなOSの必須条件
2020/04/08(水) 18:41:56.01ID:q66UKRIK
無理やりなレス。自覚は無さそうだが
2020/04/08(水) 18:45:47.99ID:oh4YVJIM
単なるコンテナになったの意味がわからんだけだよw
クラウドで散々仮想マシンでLinuxが動いてるのに、
Windowsは仮想マシンで動かせばいいとか皮肉の意味で言うやつもいるし。

使いたいものだからこそ、仮想マシンやコンテナで使うわけで
むしろ逆に、Windowsさえ使えれば、ホストはなんでもいいということなんだが
2020/04/08(水) 18:54:28.79ID:WKxansXY
でっていう
2020/04/08(水) 19:17:03.62ID:+6aWDKKq
なんか事実とか関係なく,
「議論に勝てばいいや」の精神でレスしてる奴がいるな。

いや,もはや議論と呼ぶにも烏滸がましい,口喧嘩か。

いいかげんスレチな話題は収めようぜ?
2020/04/08(水) 19:29:33.52ID:oh4YVJIM
>>106
では言い出しっぺからどうぞ
2020/04/08(水) 19:32:17.43ID:+3Ip4bre
        ∧∧  ミ _ ドスッ
        (   ,,)┌─┴┴─┐
       /   つ.  終  了 │
     〜′ /´ └─┬┬─┘
      ∪ ∪      ││ _ε3
               ゛゛'゛'゛
2020/04/10(金) 00:47:25.53ID:na8GHWZ/
Apple「全部こちらが用意したものだけ使ってろ改造すんな」
Microsoft「OSだけ売るから自作なり出来合いなり好きにしろ」
Linux「OSはタダでやるからそれ以外は自分でやれ。改造してもこっち頼るな」
unixとは無縁だがあれの扱いも林檎とどっこいでいいんだよな?一般人は用ないし
2020/04/10(金) 06:21:29.88ID:4WnvV4mF
× Microsoft「OSだけ売るから、自作なり出来合いなり好きにしろ」
○ Microsoft「OSと開発環境、プラットフォームを提供するから、自作なり出来合いなり好きにしろ」

MSが提供してる開発環境・プラットフォーム
・Visual Studio
・Visual Studio Code
・Azure
・GitHub
・WSL
・Office(マクロ)
・SQL Server
・HyperV
111デフォルトの名無しさん
垢版 |
2020/04/10(金) 09:07:06.52ID:Ixv/fgWK
small basicが入ってないぞ
2020/04/10(金) 10:23:40.16ID:ES+9souz
LinuxというかGNUが提供しているプラットフォーム・開発環境は
>>110
の数倍はありそう(下手すると数十倍?)。

その上で,「こっち頼るな,寄り集まって好きに改造しろ。」だからな。
2020/04/10(金) 11:04:17.67ID:4WnvV4mF
>>112
LinuxじゃなくてGNUだろ?
GNUのものはWindowsで何でも使えるようになったぞw

GNU「開発ツールはタダでやるから勝手に使え。OSはまだできてない。」


あとAzureに相当する開発プラットフォームはAppleもLinuxも実現できてない
やってるのはAmazonとGoogleであってLinuxではない
そう考えるとクラウドもOSの機能の一つを完全に実現してるのは
Microsoftだけなんだよな
2020/04/10(金) 13:07:14.50ID:CpDDWrVd
MS信者がキモい
2020/04/10(金) 14:26:12.32ID:5gPd6BaW
Linuxって企業だったんだwww
2020/04/10(金) 14:46:54.18ID:ES+9souz
めっちゃ突っ掛かってきてワロタ
2020/04/10(金) 16:00:20.83ID:nukGJGZx
>>115
企業じゃないよ。だから金がなくてLinux単体では
使い物にならない。
2020/04/10(金) 16:04:50.67ID:vdvhEun4
Linux愛好者?って偏屈だよね
俺Linux知ってるけどお前に教えないワラって感じで性格悪い
そのあたりでLinuxが浸透しない原因
そして今日もMSの株価時価総額1位
2020/04/10(金) 16:26:01.02ID:pLdRSiLY
時価総額の世界第一は違うぞ
第3位のAppleの時価総額はさほど第2位のMicrosoftとさほど変わらんが同等に見てるってことだな、お前は
2020/04/10(金) 16:32:36.01ID:ix9xeN7W
マイクロソフト信者やパソコンの大先生のよた話はもういいよ
2020/04/10(金) 16:50:45.63ID:5/MlN8IX
時価総額世界一はマイクロソフトだぞ?
ずっと前に奪還したって聞いたんだがな

https://stocks.finance.yahoo.co.jp/us/ranking/?kd=4&;tm=d

1〜50件 / 6370件中最終更新日時:2020年4月10日7時40分
順位 名称・ティッカー・市場 取引値 前日比・前日差 時価総額 掲示板
1 マイクロソフト [MSFT] - NASDAQ 165.14 (04/09 17:20) +0.01% (+0.01) 1,256,062,603千
2 アップル [AAPL] - NASDAQ 267.99 (04/09 17:20) +0.72% (+1.92) 1,172,584,885千
3 アマゾン・ドット・コム [AMZN] - NASDAQ 2042.76 (04/09 17:20) -0.01% (-0.24) 1,016,907,263千
2020/04/10(金) 17:11:16.18ID:ix9xeN7W
奪還とか信者きめえ。今の世界第一はサウジアラムコな
そんな会社関係ないIT関係でとか言いそうだが
アホみたく無知を晒すなよ、それもキリリっとかでw
2020/04/10(金) 17:11:29.26ID:QxjVipyN
スレ違い
2020/04/10(金) 18:29:49.84ID:5gPd6BaW
>>117
アスペかよwww
2020/04/11(土) 10:25:05.95ID:md0SvLvZ
× Linuxは使いものにならない
○ Linuxを使いこなせない。

だいたい,シェルスクリプトに関して言えばLinuxなんかのUnixが圧倒的に有利なんだから,
少なくともこのスレでWindowsを讃えまくっても無駄骨だと思います(指摘)。
2020/04/11(土) 22:43:08.40ID:7reDkQuk
自炊できない自分を棚にあげて親のメシマズをあげつらう僕ちゃん
2020/04/11(土) 23:13:07.29ID:OL9J6aZ0
厳密にいうとシェルスクリプトではないのですが、

wsl や cygwin で

$ mv 'テスト' test

とすると

test\r

というファイルができてしまいます。

test

というファイルにするにはどうすればいいですか?
2020/04/12(日) 10:26:07.71ID:3CnLqbrV
>>127
これマジ?

Cygwinは試してないけどWSL (Ubuntu)
ではそんな現象起きないぞ。
2020/04/12(日) 10:44:52.40ID:6aAn44p0
マジなわけねーだろw
2020/04/12(日) 11:29:32.30ID:kH7j2wOo
ls で見ると

'test'$'\r'

というファイルができています

sed とか tr とかいろいろ試しているのですが、\rが取れません。
2020/04/12(日) 11:55:26.80ID:qLm4HprE
Windowsだから改行がCRLFになってCRがファイル名として処理されたんだろうね
昔そうなった記憶があるようなないような
普通ならエラーになったような気がするんだけどね

試してないけど名前変えたいだけならGUIでログインしてファイルマネージャで修正できると思う
コマンドラインならESC押しながら補完したらコマンドで触れる有効なファイル名になった気がする
2020/04/12(日) 11:59:52.48ID:qLm4HprE
CRLFのCRが原因だろうけど
シェルスクリプトなら改行コード変換してみるとか
ターミナルならTeraTerm使うとかでしのいで
根本対処は後にした方がいいと思う
うちはcygwinの環境もうないしWSLも使わんわ
もっぱら仮想環境かラズパイ
昔仕事でcygwin使ってたころ
いざUnixやLinuxの実機に移したら
動かなくて痛い思いした覚えがある
2020/04/12(日) 12:03:30.62ID:KtYGSQjQ
stty igncr
mv $'test\r' test

Windows/MS-DOSなテキストファイル(CRLFが改行)に書いて実行したとか
2020/04/12(日) 12:13:43.08ID:KtYGSQjQ
ふつーーーーのTeminalアプリでは igncr にしちゃうと改行できなくなんのか
WindowsのCommand Promptからbash起動でも同じく改行できなくなんな
>>127は本当にインタラクティブでやったのか?
2020/04/12(日) 12:39:56.00ID:KtYGSQjQ
送り側(Terminalアプリ)の改行はCR、受け側はCRをLFに変換してなのね
stty のそこらあたりのデフォ(-inlcr -igncr icrnl)からは。WSLでも同じ
stty igncr するとリターンキー叩いても無視されて何もできなくなるが、リターンキーの代わりにControl-JでLF送ればいいだけなのね
136127
垢版 |
2020/04/12(日) 13:16:51.20ID:kH7j2wOo
シェルスクリプトでやっています。

mv "テスト" test
stty igncr
mv '$test'\r' test

というファイルを作って

$ bash ,/file

とやると

cannot execute binary file: Exec format error

とでます。インタラクティブでやらないとできないんでしょうか?
2020/04/12(日) 13:32:38.13ID:MICQg9zq
そのシェルスクリプトの改行コードがCRLFになってるんじゃないですか、というのと

mv '$test'\r' test
ではなく
mv $'test\r' test
(シングルクオートの位置と数に注意)

$ bash ,/file
ではなく
$ bash ./file
or
$ bash file
で実行しましょう。
2020/04/12(日) 13:34:49.83ID:QH8CCQ6c
書き間違いなのかも知れないけど、そこは

$ bash ./test

なんじゃ?
2020/04/12(日) 13:57:36.00ID:KtYGSQjQ
bash ./test
ではないでしょ。ターゲットファイルがtestでスクリプトファイルじゃないんだから

>>137のとおり。>>136はわざとなのか?wなぜそうすると言うw
mv "テスト" test
をなぜ入れる。また、sttyはシェルスクリプトでは(ほとんど)関係ないよ

ちゃんと改行を選択できる(もしくはLFになる)エディタで書けばいいだけの話だし、
mv "テスト" test
だけで test になるだろう
すでにある 'test\r' を test にしたいなら、
mv $'test\r' test
とファイルに書いて実行すればいいだけだな
2020/04/13(月) 06:27:55.73ID:bwzJgTJt
POSIX準拠度を図るツールとか調べてるサイトないんかね?
2020/04/14(火) 01:35:34.02ID:JSjD3hsj
checkbashismとかは?
2020/04/14(火) 07:04:50.30ID:ji8PXwtq
>>141
あー、シェルスクリプトの準拠度じゃなくて
シェルの準拠度ね。シェルがどれだけ標準を満たした実装かってこと
2020/04/14(火) 09:49:58.31ID:r1rqFhB1
調べてどーすんの?
2020/04/14(火) 10:25:51.42ID:ji8PXwtq
そうすりゃ自分が間違ってるのかシェルにバグが有るのかわかるだろ?
2020/04/14(火) 10:42:05.80ID:GtUt/+gx
調べたければ公式のtest suite入手すればいい
http://get.posixcertified.ieee.org/posixfaq.html
146デフォルトの名無しさん
垢版 |
2020/04/16(木) 01:24:21.41ID:sXaGgreP
ファイルが存在するなら上書き、しないなら新規作成ってtouchじゃなくてviでやるかんじでしょうか?
2020/04/16(木) 01:56:40.88ID:phPWx1q3
リダイレクトでappendすればいい

$ do_something >> output.txt
2020/04/16(木) 02:20:53.33ID:tywb42E3
bash なら、-e で、ファイルが存在すれば真
[ -e ファイル名 ]

逆に、ファイルが存在しない時に真
[ ! -e ファイル名 ]
2020/04/16(木) 09:20:05.32ID:pf1fo5EI
>>148
これだとうまくいかないことがある
2020/04/16(木) 11:59:50.73ID:TtBh+dOu
上書きって言ってるから、単純に

$ do_something > output.txt

で良いんじゃない?
2020/04/16(木) 12:07:49.18ID:DjP17ITj
>>150
普通にこれでいいな。
2020/04/16(木) 13:48:40.08ID:pf1fo5EI
リダイレクトでファイルを作れるけど
リダイレクトでファイルを削除ってできないんだよな
空にすることはできるけど
2020/04/16(木) 14:05:57.06ID:42Nlbk00
ファイルオープンとファイル作成は同居してるからな
削除は別物
2020/04/16(木) 14:19:23.91ID:pf1fo5EI
まあ分かるけど対象性がないと言うか
Aから出力したものをBにコピーする。の発展で
AからBに移動する。みたいな発想はなかったんかな?
そうすれば/dev/nullに移動 = 削除になったと思うんだが
移動も削除も実装w
2020/04/16(木) 15:26:12.37ID:MiKwJnZu
消去したいパスのリストをファイルに入れておいて(1行1パス)
cat path_list.txt | xargs rm -rf
みたいなことをしてるのですが、ファイルのパスでワイルドカード(アスタリスク)を
使いたくなりました。

単純にパスのリスト中でアスタリスクを使っても展開されないようですが、
展開させるにはどうするのがいいでしょうか。
2020/04/16(木) 15:32:46.71ID:pf1fo5EI
>>155
ファイル名に*という文字が含まれている場合はどうするの?
2020/04/16(木) 15:33:05.34ID:pf1fo5EI
あ、いや、「*」という名前のファイル名があったらどうするの?
2020/04/16(木) 15:58:03.80ID:phPWx1q3
$ ls
foo.log bar.log baz.txt qux.txt *.txt input.txt

$ cat input.txt
*.log
'¥*.txt'

$ cat input.txt | xargs -I {} bash -c 'ls {}'
bar.log foo.log
*.txt
2020/04/16(木) 18:47:06.88ID:qyR5Ndp0
bash -cってどんな時に使うんです?
簡単なシェルスクリプトならググらず書けるようにはなったけどまだよく分からん
関数もaliasも使えない分安全だろうけど使いたい時はどうするの
2020/04/16(木) 19:26:09.12ID:pf1fo5EI
>>159
その場でbashでコード実行したいときだろ?
今使ってるシェルがzshで、bashだったらどう動くか確認したり
シェルにログインするまでもないなとか
2020/04/16(木) 19:28:03.58ID:pf1fo5EI
あと環境汚すようなときにも使うな。
関数定義してなにかしたいけど、後で消したいとか
まあサブシェルとかでもいいんだけど
2020/04/16(木) 19:39:39.35ID:MiKwJnZu
>>158
なるほどー。素晴らしい。
2020/04/16(木) 21:47:35.66ID:phPWx1q3
>>159
interactive shellじゃない場合は
`shopt -s expand_aliases; source <alias設定file>` でエイリアスが展開される

$ cat .alias_and_fn
alias ll='ls -tAhG'
foo() {
echo "foobar!!"
}
$ cat input.txt | xargs -I {} bash -O expand_aliases -c $'source .alias_and_fn;¥n ll {}; foo'

行単位で読み込むときにalias展開するからaliasを設定した後に改行入れてから使う

interactiveなログインシェルとして起動したければ`bash -cli`とか
詳しくはman bashで
2020/04/16(木) 22:37:57.81ID:tywb42E3
bash -c は、よく見る
16556
垢版 |
2020/04/17(金) 06:27:50.85ID:wSTFfL+S
>>56
ようやく、分かりますた!

xxx="$(command -v rbenv)"
と、端末で直接実行すると、xxx は、rbenv となって、パスが付かないのは、
すでに、rbenv という関数が定義されたファイルを読み込んでいるため、
同名のコマンドよりも先に、関数が見つかるから

一方、xxx="$(command -v rbenv)"
と、bash スクリプト内に書いて、スクリプトを実行すると、
xxx は、~/.rbenv/bin/rbenv とパスが付くのは、
rbenv という関数が定義されたファイルを読み込んでいないため、コマンドが見つかるから

シェル関数を使うには、その関数が定義されたファイルを読み込んでから使うのか
2020/04/17(金) 06:41:06.63ID:BxfxWji9
Ubuntuでシステムのシェルってdashになってるみたいですけど、確かこれってbashより
速いからって理由でしたっけ?

実際どのぐらい違うか興味があるんですが、どこかにdashとbashのベンチマーク比較した
情報とかあります? (自分でやれって? w)
2020/04/17(金) 10:38:11.77ID:9nBzfuh2
>>166
なんの速度かは言わないがあるツールをdashで動かしたら約3秒
bash 5.0 だと 11秒、kshだと6秒でzshだと9秒
2020/04/17(金) 10:44:00.48ID:9nBzfuh2
dashを選んでるのは速度もあるしPOSIX準拠ってのもあるだろうね
2020/04/17(金) 14:54:31.55ID:Urb0mH6b
関数を一行で書く時エラーで悩んでたけど波括弧ってに空白いるのな
foo(){ echo foo;}
小括弧だと必要ないのに何この初見殺し
2020/04/17(金) 15:09:03.88ID:xgpGiYXu
>>169
shellcheck使うといいよ
2020/04/17(金) 15:40:41.15ID:9nBzfuh2
>>169
zshは空白無くても動く

zsh -c 'foo(){echo test;};foo
test

dashはコンパイルエラー起こらないと思いつつ、実行するとエラーになり
dash -c 'foo(){echo test;}' # コンパイルエラー起こらない
dash -c 'foo(){echo test;};foo' # でも実行すると怒られる

実は"最後の" ; がおかしい
dash -c 'foo(){echo test;} foo' # これを実行するとこうなる
{echo: not found

エラー内容から、最初の { がおかしい事がわかる。これが正解
dash -c 'foo()echo test;} foo'
test

後ろの } はただのノイズだと思われるので、とってあげても動く
dash -c 'foo()echo test; foo'

↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
でもbashやyashでは動かない

そこから考えると
dash -c 'foo()echo test;foo' は動くということがわかるし、
dash -c 'foo()echo test;}foo' は
foo()echo test +}foo になるので、 }foo: not found と表示されることも理解できる
172デフォルトの名無しさん
垢版 |
2020/04/17(金) 16:52:28.83ID:nls2b0po
>>171
> dash -c 'foo()echo test; foo'
>
> ↑これは POSIX 準拠なので(笑)zshやkshやmkshでも動く
> でもbashやyashでは動かない

それは bash や yash の方が正解
関数定義の本体は複合コマンド(compound command)のみ
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05

ちなみに yash や posh はこれに関して、bash よりも分りやすいエラーメッセージを吐く:

% yash -c 'f() echo'
yash -c:1: syntax error: a function body must be a compound command
% posh -c 'f() echo'
posh: f: function definition must use compound command
%
2020/04/17(金) 17:38:27.88ID:9nBzfuh2
>>172
compound-command は必ずしもグループ化しろとは書かれてないよ
グループ化はオプション
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04
2020/04/17(金) 19:28:17.38ID:3FstJMua
>>170
これいいですね
解説が丁寧で、初心者の自分には勉強になる
175デフォルトの名無しさん
垢版 |
2020/04/17(金) 19:40:14.03ID:nls2b0po
>>173
何を言いたいのかわからない

>>172のリンク先で関数定義の形式として示されているのは
fname ( ) compound-command [io-redirect ...]
の一種のみ

echo test は compound-command ではないから
foo() echo test; などは上記の形式には当てはまらない
という話なんだけど

「グループ化」云々ってどっから出てきたの
2020/04/17(金) 19:56:23.51ID:UJSQQO8I
え,関数って一行で定義するときは
foo() echo hello;
みたいに波括弧で括る必要ないの?
知らんかった。
2020/04/17(金) 19:58:37.78ID:9nBzfuh2
>>175
リンク先見ろ、Grouping Commands って書いてあるだろ

compound-command は
 () や {} でグループ化してもいいし、しなくてもいい
 単一のコマンドも compound-command
 というか、単一のコマンドが compound-command であり
 複数のコマンドをまとめる時に Grouping Commands を使う
2020/04/17(金) 19:59:07.40ID:9nBzfuh2
>>176
本来はね。でもbashで対応してないから事実上諦めるしかない。
2020/04/17(金) 20:01:55.41ID:9nBzfuh2
>>176
あとグループ化するのに使うのは {} または () なので

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

こっちはbashやyashも対応している。
ただし当然のことながらサブシェルで実行される。
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
181デフォルトの名無しさん
垢版 |
2020/04/17(金) 20:07:41.32ID:nls2b0po
>>177
> 単一のコマンドも compound-command
> というか、単一のコマンドが compound-command であり

それ初耳だわ
どこに書いてある?
2020/04/17(金) 20:13:43.55ID:9nBzfuh2
>>181
なんのために Grouping Commands と別に説明してある思ってる?

Grouping Commands を作るための {} または () が必須じゃないから、
「compound-commands の定義は {} または () で始まる」と*書かれてない*んだよ
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ではない
2020/04/17(金) 20:57:55.90ID:xgpGiYXu
foo() if true; then echo "foobar"; fi
↑こういうのはOK

↓shellcheckの解説
POSIX allows the body of a function to be any compound command, e.g. foo() for i; do :; done. Since this usage is rare, ShellCheck intentionally requires the body to be { ..; } (or ( ..; )):
https://github.com/koalaman/shellcheck/wiki/SC1064
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
2020/04/17(金) 22:32:27.89ID:UJSQQO8I
<<. dash
foo() echo hello
foo
.
hello

たしかにDashだと問題なく定義できるな……。
こんなこと始めて知ったわ。実地で使うかどうかは置いといてw
2020/04/17(金) 23:15:40.63ID:lZxGXmOk
要するに素直に括弧でくるんどけってことやな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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