[過去ログ] シェルスクリプト総合 その28 (922レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1
(3): 2018/07/24(火)11:01 ID:r0TJj2hB(1/5) AAS
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ: シェルスクリプト総合 その27(2chスレ:unix
796
(2): 2018/09/14(金)12:12 ID:CXa+ZLzo(3/4) AAS
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
797
(2): 2018/09/14(金)16:14 ID:6xTUz+7n(2/20) AAS
>>796
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。

手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね
798
(1): 2018/09/14(金)16:33 ID:gmWhNmZA(1/4) AAS
実行権限は絶対パスでも相対パスでも必要なので関係ない
799: 2018/09/14(金)16:35 ID:KKMncdOE(1) AAS
スクリプトのパスとインタプリタのパスを混同している
800: 2018/09/14(金)16:36 ID:6xTUz+7n(3/20) AAS
>>798
シバンの話だよ
実行するスクリプトのパスじゃなくて
実行するスクリプトが使用するインタプリタのパス
801: 2018/09/14(金)16:46 ID:gmWhNmZA(2/4) AAS
シバンの話は分かってるけど?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ?
802
(1): 2018/09/14(金)16:49 ID:CXa+ZLzo(4/4) AAS
>>797
なんか誤解してる?
絶対パスで書くってのは
#!/home/me/bin/awk -f
みたいに書くって意味だよ。
803: 2018/09/14(金)16:53 ID:UfVRD/gP(1) AAS
>>794
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。

逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。

同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。
804: 2018/09/14(金)18:40 ID:q3l06dS7(2/2) AAS
俺は半分脳死状態で
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。

上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh

-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり)
805: 2018/09/14(金)18:50 ID:hBiQ1eS5(1) AAS
- で閉じるのはオレもやってるけど、
シバンの後のスペースは入れない
#!/bin/sh -
806
(2): 2018/09/14(金)19:07 ID:6xTUz+7n(4/20) AAS
>>802
わかってる

#!/home/me/bin/awk -f
って書いたら、必ず /home/me/bin/awk が使われてしまう

例えばdebian 9のawkは4.1.4だがdebian 7は4.0.4だった
debianのawkのパスは /usr/bin/awk だが。debian 9で自分でawkの
最新版をビルドして /usr/local/bin/awk に入れたとしよう

awkスクリプトのシバンが #!/usr/bin/env awk と書いてあれば
$PATHを見て適切な /usr/local/bin/awk を選んでくれるが、
envを使ってないと、/usr/bin/awk 決め打ちになってしまう

大量にある(かもしれない)awkスクリプトのシバンを全部書き換えるなんてナンセンスだし
せっかく実行権限が付いてるのに、awk スクリプトファイル名 と書くのもナンセンスだろ

実行プログラムが何の言語で書かれているかなんて、利用者には知ったことじゃないんだから
fooコマンドはfooコマンドとして実行してほしいし、 使用するインタプリタは $PATH を見て欲しい
807: 2018/09/14(金)19:21 ID:za5qG/O1(1) AAS
なんかいろいろ誤解しとるw
808
(1): 2018/09/14(金)19:27 ID:EsLYvq4M(1/7) AAS
>>806
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。
809
(4): 2018/09/14(金)19:38 ID:6xTUz+7n(5/20) AAS
>>808
実装としてできないってどっちの話?

勘違いしている人がいて、話の前提で止まっている人がいてややこしいけど
>>806の話は理解した上で、俺が提案した #!awk でいいじゃんって話だよね?

PATHを見れないというのなら、見る必要はないよ。
#!awk -f という記述(絶対パスでないもの)を決め打ちした文字(/usr/bin/env )を
頭に入れて #!/usr/bin/env awk -f として解釈すればいいだけ

どういう文字を頭に入れるかはディストリが決めたカーネルの
ビルドオプションででも設定すればいいだろう

単なる文字列の変換でしかないので、カーネルだけでできる
810: 2018/09/14(金)20:18 ID:EsLYvq4M(2/7) AAS
カーネルが特定の決め打ちしたバイナリを呼ぶようなことはないよ。
せいぜいinitだけ。
811: 2018/09/14(金)20:29 ID:6xTUz+7n(6/20) AAS
そういう中途半端なレスはやめて欲しい。
結局>>809の方法で可能だってことだろう?
そうでないなら、そうでないとわかるように理由を添えて書いてくれ
812
(1): 2018/09/14(金)20:33 ID:EsLYvq4M(3/7) AAS
それほど言うなら試しにlinuxのパッチ書いて投げてみたら?
813: 2018/09/14(金)20:33 ID:6xTUz+7n(7/20) AAS
補足すると>>809読めばわかると思うけど、読み取ったシバンの文字列を置き換えるだけ。
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ
814: 2018/09/14(金)20:35 ID:6xTUz+7n(8/20) AAS
>>812
話がすり替わってる。

技術的に可能かどうかの話をしている所に、
じゃあってみせろと言われても、
それは関係者を説得するのは難しいだろう?別の話だろ?
815
(1): 2018/09/14(金)20:36 ID:EsLYvq4M(4/7) AAS
可能か不可能かで言えば、もちろん可能だよ。なんだって可能。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。
816
(1): 2018/09/14(金)20:39 ID:6xTUz+7n(9/20) AAS
>>815
話聞いてるか?
シバンはカーネルが読み取るもの
ユーザーランドのものには一切手を出していない。
読み取ったシバン文字列を置き換えるだけなんだから
817
(1): 2018/09/14(金)20:39 ID:1jWDqP4V(1/4) AAS
>>809
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!

ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw
818
(1): 2018/09/14(金)20:42 ID:6xTUz+7n(10/20) AAS
>>817
技術的に可能でありユーザーランドを触ってないってのは同意したの?

だから関係者と話をつけるのが難しいっていうのは
別の話だから、すり替えるのはやめてくれと行ったんだが
819: 2018/09/14(金)20:43 ID:6xTUz+7n(11/20) AAS
つーか、いい加減にしないといつもの荒らしモードに入るぞ?w

議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw

もうそろそろ荒らし認定することだと思ってるんだが?w
820: 2018/09/14(金)20:43 ID:6xTUz+7n(12/20) AAS
訂正

俺を荒らし呼ばわりするのはいつもの手だよなw
821: 2018/09/14(金)20:46 ID:6xTUz+7n(13/20) AAS
反論しないならさっさとNGIDに入れて
俺に反論できない状態を作ってくれよ?

見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw

はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー
822
(1): 2018/09/14(金)20:46 ID:1jWDqP4V(2/4) AAS
>>818
なんか別人と勘違いしてるようだが、俺は技術的にできないと書いたことは一度もない。

この勝手に勘違いしてるあたり、もしかしていつもの人か?
823: 2018/09/14(金)20:48 ID:6xTUz+7n(14/20) AAS
>>822
はい、技術的な内容を長文で書いて
相手を論破するのは、いつもの俺のパターンw
824
(1): 2018/09/14(金)20:48 ID:1jWDqP4V(3/4) AAS
だって勝手に勘違いして勝手な仮定して勝手に腹立ててるんだもん。

せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。
825: 2018/09/14(金)20:51 ID:jAge75Zy(1/3) AAS
長文ってだけでとりあえずスクロールする
826: 2018/09/14(金)20:54 ID:6xTUz+7n(15/20) AAS
>>824
5ちゃんねるなんだからこの程度のもんよ

こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる

いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ
827
(1): 2018/09/14(金)20:58 ID:EsLYvq4M(5/7) AAS
>>816
ファイルシステムの構成に何らかの仮定を置いた時点でユーザランドと分離できていない。
828: 2018/09/14(金)20:59 ID:EsLYvq4M(6/7) AAS
ちなみに俺はIDずっと変えてないよ。
829
(1): 2018/09/14(金)20:59 ID:6xTUz+7n(16/20) AAS
>>827
ファイルシステムの構成に仮定をおいたりしてない
単にシバン文字列を置換するだけ
830
(1): 2018/09/14(金)21:08 ID:EsLYvq4M(7/7) AAS
>>829
仮定せずにどうやって/usr/bin/env付ければいいってわかるの?
831: 2018/09/14(金)21:12 ID:6xTUz+7n(17/20) AAS
>>830
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。

カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない

単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない
832
(1): 2018/09/14(金)21:30 ID:gmWhNmZA(3/4) AAS
この話と実行権限が関係ないのは理解できたのか?
833
(1): 2018/09/14(金)21:44 ID:6xTUz+7n(18/20) AAS
>>832
お前1人で意味不明の話をしてるんだってw

(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない

当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ?
834: 2018/09/14(金)21:46 ID:6xTUz+7n(19/20) AAS
どうもこの話を理解できないのが、おかしいと思うんだが、
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?

いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。

でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw
835
(1): 2018/09/14(金)21:49 ID:jAge75Zy(2/3) AAS
ここまでの話全く読んでないけどawk実行させる時は-f使うわ
836: 2018/09/14(金)22:00 ID:6xTUz+7n(20/20) AAS
>>835
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?

かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ

実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw
837: 2018/09/14(金)22:02 ID:jAge75Zy(3/3) AAS
shは実行権限つける
perlは場合による
意味はない
838
(2): 2018/09/14(金)23:01 ID:gmWhNmZA(4/4) AAS
>>833
俺は>>797でお前が意味不明な
> それだと実行権限の意味がなくなるじゃん
と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
機能的文盲とかいうやつなのか?
839: 2018/09/14(金)23:05 ID:fXySkelb(1/2) AAS
$ls aho.sh
rw-r--r-- aho
$. ./aho.sh
aho
$
840: 2018/09/14(金)23:06 ID:fXySkelb(2/2) AAS
$cat ./aho.sh
echo aho
$
841: 2018/09/14(金)23:15 ID:1jWDqP4V(4/4) AAS
>>838
確かにあの書き込みは全体的に意味不明だったね。
842: 2018/09/15(土)01:10 ID:pm09nqHo(1/29) AAS
>>838
> と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
> 機能的文盲とかいうやつなのか?

実行権限がついているとパスの指定を省略できるんだよ

ご存知じゃないかもしれないが(皮肉)パスの指定を省略した時に
$PATHに設定された複数のパスから、パスを補完してくれる機能がある
つまり$PATHからパスを補完してほしいなら実行権限をつけないとだめ

(awk)スクリプトを$PATHの中から補完してほしいなら実行権限をつける。
そうするとパスを省略して実行できる。
スクリプト自体は$PATHから補完してくれる、だけどそのスクリプトに
シバンが/usr/bin/awkとなっていると、スクリプトを実行するインタプリタは
/usr/bin/awk固定となってしまう。

/usr/bin/env awk -f と書くことで、インタプリタ自体も$PATHから検索してくれる

パス指定を"省略すること" と 実行権限の意味、いい加減理解しましたかね?
843
(1): 2018/09/15(土)01:13 ID:pm09nqHo(2/29) AAS
ほんと、理解能力がないのか、
それとも、単に技術レベルが数ランク下なのか知らんが
馬鹿を相手にしてると疲れる。煽りたくもなるわw
844: 2018/09/15(土)01:20 ID:pm09nqHo(3/29) AAS
> 796 返信:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 12:12:08.80 ID:CXa+ZLzo [3/4]
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?

797 名前:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 16:14:10.39 ID:6xTUz+7n [2/20]
>>796
それだと実行権限(をつけてパスを省略できるようにした)の意味がなくなるじゃん

ここまで言えば、馬鹿でも理解できるかな?
まだ説明しないと理解できない?
845: 2018/09/15(土)01:22 ID:pm09nqHo(4/29) AAS
実行権限は単に実行可能にするだけじゃない
パスを省略して$PATHの中からパスを補完してくれる機能があるのだ
846: 2018/09/15(土)01:32 ID:pm09nqHo(5/29) AAS
まあ、細かいことを説明するなら、"スクリプトファイル" の実行パスを
検索してくれるのはシェルで、シェルが$PATHの中から
実行ファイルを見つけることができるようにするために実行権限をつける

でも今は "スクリプトファイル" の実行パスの検索の話ではなく
シバンから起動する "インタプリタ" の話
シバン自体には$PATHの中から検索してくれる機能はなくて
単にシバンに書かれたパスのプログラムを実行するだけ

そこで出てくるマジックが /usr/bin/env awk -f
シバンは$PATHを検索しないが、/usr/bin/envが$PATHを検索して
適切なプログラム(ここではawk)に引き継いでくれる

などと丁寧に説明してやったら、今度は長文だーとか言って
荒らし呼ばわりするんだろう?
847
(2): 2018/09/15(土)02:03 ID:pm09nqHo(6/29) AAS
話は変わるけどさ、

シェルスクリプト(シバンは #!/bin/sh 実体はdash)に
A=
A=123 echo "$A-1"
echo "$A-2"

って書いて実行したら以下のように表示されるんだよ。
-1
-2
この動きはA=123が評価される前にechoの変数展開が行われて-1になって
実行したらAの内容が元に戻るから-2と表示されるということで理解できる

でも以下のように書いたら
A=
A=123 eval 'echo "$A-1"'
echo "$A-2"

次のように表示されるんだよ
123-1
123-2

これはどういうわけだろう?

さらにbashとzshで実行した場合は以下のように表示されたw
123-1
-2
この動作ならまだ理解できる。

でもkshやposhやyashなんかはdashと同じ
どっちが正しい動きなんだろう?
848
(1): 2018/09/15(土)04:27 ID:2etSWec6(1) AAS
またかww
849
(1): 2018/09/15(土)05:43 ID:krdUo6un(1) AAS
>>847
単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
てか、あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから正しいか間違いかで考えること自体がおかしい。
850: 2018/09/15(土)06:12 ID:pm09nqHo(7/29) AAS
>>849
> 単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?

POSIXの仕様と照らし合わせてって意味だよ

POSIXの仕様と照らし合わせて正しいのか間違ってるのか
そもそもPOSIXにこういったときの仕様は定義されていないのか

> あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから

決まりはあって、それがPOSIXの仕様のことだよ
851: 2018/09/15(土)06:13 ID:pm09nqHo(8/29) AAS
>>848
> またかww

うん、またなんだ。済まない。
バーボン(略
852: 2018/09/15(土)09:25 ID:bwURAev4(1) AAS
よほどリアルでぼっちなんだな。そらそうだなという人格と見えるし
853: 2018/09/15(土)11:18 ID:OUVvcRON(1) AAS
>>843
> それとも、単に技術レベルが数ランク下なのか知らんが
画像リンク[jpg]:cdn-ak.f.st-hatena.com
854: 2018/09/15(土)15:58 ID:8KftQgLD(1/14) AAS
俺自身にもそういう傾向があるが
訊かれてもないことをずらずら書いて自己満足に浸るのはよくないと思う。
現実の人間関係でもそういう人はハブられがちだし。
855
(1): 2018/09/15(土)16:00 ID:KIanXBkQ(1) AAS
聞いたことを答えないで
聞かれてないことを答えるのは
それはそいつが何も知らないときだ

オマエはなにもわかってない
856: 2018/09/15(土)16:04 ID:pm09nqHo(9/29) AAS
>>855
誰がそんなことを答えてくれと質問したんだ?

聞かれてないことをペラペラ喋ってるのは
あんただろう?w
857: 2018/09/15(土)16:05 ID:pm09nqHo(10/29) AAS
>>847の質問よろしくおねがいします。
858: 2018/09/15(土)16:16 ID:iaCHT03n(1) AAS
文書なげぇんだよなぁ
859: 2018/09/15(土)16:16 ID:pm09nqHo(11/29) AAS
前に情報小出しにするなって言われたからねw
860: 2018/09/15(土)16:32 ID:Svn0IWNp(1/4) AAS
質問のときだけはへり下るのな
身を正してのつもりかもだが、質問のときだけですぐに豹変するからお前の場合はもうただただ気持ち悪いだけ
861: 2018/09/15(土)16:35 ID:pm09nqHo(12/29) AAS
何だ?質問も高圧的にすれば満足するんか?
ただ文句言いたいだけだろ。
そんな無駄な会話してないで
本題にもどれや
862: 2018/09/15(土)16:38 ID:Svn0IWNp(2/4) AAS
どうしてそっちになるのだか。やっぱりそっちが素で付け焼き刃のへりくだりか
社会的にはは豹変しない方になんだけどなあ
863: 2018/09/15(土)16:45 ID:pm09nqHo(13/29) AAS
やっぱり意地でもスレと無関係の話をしたいようだ。
お前がいなくなればスレは平和になるのになぁw
864: 2018/09/15(土)16:50 ID:Svn0IWNp(3/4) AAS
なにその俺は違う的なレスは
さすがいままでのレスで自己中ぶりを発揮しまくっただけあるやつだなあ。ただただ気持ち悪いのもそれは自己中ぶりからなんだかが、わからないだろうな、わかってたらそんな自己中にはならんだろうし
865
(3): 2018/09/15(土)16:55 ID:SSTURz0o(1/5) AAS
なるほど、コマンドライン上にある変数(シェルが予め展開する変数)はそのままなのか
fork & exec されるプロセス空間の環境変数にのみ作用するのだからそうなるわな

$ PATH=hoge ls "${PATH}"
$ PATH=hoge /bin/ls "${PATH}"
866
(2): 2018/09/15(土)17:01 ID:Svn0IWNp(4/4) AAS
>>865
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
867
(1): 2018/09/15(土)17:19 ID:8KftQgLD(2/14) AAS
>>866
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな

なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?

bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
868: 867 2018/09/15(土)17:20 ID:8KftQgLD(3/14) AAS
ごめん安価ミス
1s/>>866/>>865/1
869: 2018/09/15(土)17:42 ID:pm09nqHo(14/29) AAS
>>865
forkされる場合ってのはわかりやすいんだけどね

> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2

実行するのがシェルビルトインコマンドであっても実行後は元に戻る

ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動

ということで

> A=123 echo "$A-1"

と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
870: 2018/09/15(土)17:43 ID:pm09nqHo(15/29) AAS
ちなみにコマンドライン(シェル)じゃなくて
スクリプトを書いて実行して確かめてる
871
(1): 2018/09/15(土)17:56 ID:pm09nqHo(16/29) AAS
知ってると思うんだけど、念の為

var=value command

この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
872
(1): 2018/09/15(土)18:00 ID:pm09nqHo(17/29) AAS
話を簡単にすると

A=
A=123 eval :
echo $A

dashだと123と表示される。
bashだと何も表示されない。
873
(1): 2018/09/15(土)18:15 ID:SSTURz0o(2/5) AAS
>>872
ふむ、bash で set -o posix してから実行すると 123 って表示されるね
874: 2018/09/15(土)18:22 ID:pm09nqHo(18/29) AAS
>>873
それは気づかなかった。ってことはPOSIXで仕様化されてるってことかな?
evalだけ特殊と。なんでだろうね。
875
(1): 2018/09/15(土)18:34 ID:8KftQgLD(4/14) AAS
>>871
$ VAR=val echo $VAR
とした場合,「VAR=val」が反映されていないように見えるのはどうしてだろう
876
(1): 2018/09/15(土)18:43 ID:pm09nqHo(19/29) AAS
>>875
それは単に「VAR=var echo $VAR」が1行だから
先に$VARが展開されるだけだと思うよ

変数を一時的に変更したいけど、別変数にバックアップして元に戻すの面倒だな
その他にも方法あるけどアレ(省略)だし、

よし、var=value command構文を使おう!
うお、先に$VARが展開されちまった
ぴこーん!だったらeval使えば先に展開されることないんじゃね?

よし動い・・・あれぁ、変数を一時的に変更したかったのに
実行終わっても変数が元に戻らないよぉ

よし5ちゃんねるだ。という流れw
877: 2018/09/15(土)18:52 ID:8KftQgLD(5/14) AAS
>>876
もうとっくに分かってると思うが 俺が思い付いたのは
$ VAR=val-b4
$ (VAR=val-tmp; echo $VAR)
→ val-tmp
$ echo $VAR
→ val-b4
くらいだな
878
(3): 2018/09/15(土)19:22 ID:imSsWev+(1/5) AAS
画像リンク[jpg]:i.imgur.com

このスクショのようにmediainfoというコマンドのAudioの項目のFormatを取り出す方法教えてほしいです

以前はそのAudioのFormatという文字列はFormat profileだったので、
mediainfo "$FILE" | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/'
こうやってその行を抽出していたんですが、mediainfoがバージョンアップしてFormatという文字列に変わってしまいました。
Generalの項目にもFormatがあるので、これだと調べられません。
どうやるんでしょうか?
879
(3): 2018/09/15(土)19:37 ID:SSTURz0o(3/5) AAS
GNU sed の -r オプション使ってるけど、こんな感じで

$ mediainfo "$FILE" | sed -nr '/^Audio/,$s/^Format +: (.+)/\1/p'
880: 2018/09/15(土)19:38 ID:pm09nqHo(20/29) AAS
>>878
mediainfo "$FILE" | sed -n -E '/Audio/,/\s*$/{s/Format\s*:\s//p}'
881
(1): 2018/09/15(土)19:41 ID:SSTURz0o(4/5) AAS
ヘルプメッセージ読んだらこれでいいかも

$ mediainfo --Inform="Audio;%Format%" "$FILE"
882: 2018/09/15(土)19:41 ID:pm09nqHo(21/29) AAS
Audioにformatが複数あっても対応できないかなー?ってやってたら遅れたw
883
(5): 2018/09/15(土)19:42 ID:8KftQgLD(6/14) AAS
>>878
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s
これでどうだろう?

ところで綺麗な端末だね。
884: 2018/09/15(土)19:42 ID:8KftQgLD(7/14) AAS
ちょっと確かめてたらめっちゃ回答ついてたw
885
(1): 2018/09/15(土)19:43 ID:8KftQgLD(8/14) AAS
ちなみに俺のコマンドラインはPOSIXに準拠してるので可搬性は高いと思うよ(ドヤ顔)
886
(1): 2018/09/15(土)19:50 ID:pm09nqHo(22/29) AAS
Format複数あっても出力されるはずなのにおかしいと思ったら
CRLFになってたw いい加減ATOMのデフォルトを変えないと

>>885
> POSIXに準拠してるので
そうそう。それを言おうと思っていたw

>>879
> GNU sed の -r オプション使ってるけど、こんな感じで
-r じゃなくて -E を使えば良いのでは?
POSIX準拠?かどうか知らないけど-Eは使えるはず
887: 2018/09/15(土)19:57 ID:SSTURz0o(5/5) AAS
>>886
>> GNU sed の -r オプション使ってるけど、こんな感じで
>-r じゃなくて -E を使えば良いのでは?
>POSIX準拠?かどうか知らないけど-Eは使えるはず

癖で指が -r を押してしまう…以後気をつけます
888: 2018/09/15(土)19:59 ID:pm09nqHo(23/29) AAS
Macだと\sは使えないのかな?
とりあえず>>879を参考にしつつ修正してみた。
General、Audio、の次になにか来ても対応できるようにしてみた。
これなら-Eいらんかったわ。macOSで動くのを確認済み

sed -n '/^Audio/,/^$/ s/^Format *: *// p'
889: 2018/09/15(土)20:01 ID:pm09nqHo(24/29) AAS
-Eが良いよ(ドヤァ)

POSIX準拠というより可搬性重視なので、
-Eが使えるなら-Eつけてれば良いんじゃね?ぐらいに思ってるw
890
(1): 2018/09/15(土)20:06 ID:pm09nqHo(25/29) AAS
>>883
> grep '^Format' | cut -f '2-' -d ':' -s

grepしてcutするって流れは、俺もよくやるんだけど、
awk一つにまとめられる(と後からよく気づくw)
891
(1): 2018/09/15(土)20:13 ID:8KftQgLD(9/14) AAS
>>890
でもなんかその操作をawk一つにまとめるって
emacsのorgモードに近い印象を受けるというか
ちょっとUnix哲学っぽくねえなと思う。

もちろんUnix哲学に従う必要性は皆無なんだけど,あくまで個人的な意見として。
892
(1): 2018/09/15(土)20:16 ID:pm09nqHo(26/29) AAS
>>891
それ言ったらsedは今回、範囲選択+行選択+置換 の3つを同時にやってるんやで?w
893: 2018/09/15(土)20:20 ID:8KftQgLD(10/14) AAS
>>892
俺の >>883 ←これはそんなことやってねえぞ(謎の自信)
検索→表示オンリー

スレチにもほどがあるのでそろそろやめるわ
894: 2018/09/15(土)20:41 ID:pm09nqHo(27/29) AAS
sedもawkも複数行のスクリプトを実行できるわけで
一つのコマンドで複雑な異なる機能を提供してるから
Unix哲学から反してるのかもね

だから例のアレはUnix哲学がどうとか言ってる割に
結局awkでプログラム書くんかいって突っ込みたくなるんだな
895: 2018/09/15(土)20:45 ID:8rxpHkWL(1) AAS
まだとどまる事のない誤解を披瀝し続けとってわろたw
896
(5): 2018/09/15(土)21:28 ID:imSsWev+(2/5) AAS
みなさんどうもありがとうございます!

>>881
おお!こんなオプションがあったんですか!って思って試してみたんですが、
上のスクショのLC-AAC-Sample.aac、HE-AAC-Sample.aacで試すと、どちらもAACと表示され、
このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。

INFO=$(mediainfo "$FILE" | sedほげほげ"
case "$INFO" in
"AAC LC" )
ほげほげ1

"AAC LC SBR")
ほげほげ2

*)
ほげほげ3

って感じで次の処理に進むんですが、
>>879、880、888だとほげほげ1か2に進めて、>>883だとほげほげ3になってしまいました。
897: 2018/09/15(土)21:30 ID:imSsWev+(3/5) AAS
>>883
端末はMacのiTerm、シェルはfish、プロンプトは適当にいじったやつです。
898
(1): 2018/09/15(土)21:43 ID:pm09nqHo(28/29) AAS
>>896
> このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。

ちゃんと調べた? %Format%以外で出るのあるんじゃないの?
899
(1): 2018/09/15(土)21:59 ID:imSsWev+(4/5) AAS
>>898
Audio;%Format/Info%
だと上のスクショの
Advanced Audio Codec Low Complexityなになに
が取り出せるようでした。
これだとLC AACならAdvanced Audio Codec Low Complexity
HE-AACならAdvanced Audio Codec Low Complexity with Spectral Band Replication
が取り出せるので判別出来そうです。
900
(1): 2018/09/15(土)22:08 ID:8KftQgLD(11/14) AAS
>>896
>>883のコマンドラインを提案した者だが
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s | sed -e 's/^[[:blank:]]//1'
↑これでいけるかな。
ただ長いので他の人のを使ったほうがいいかも
901
(1): 2018/09/15(土)22:18 ID:8KftQgLD(12/14) AAS
>>899
ところで
外部リンク[zip]:www.mpeg-audio.org
↑こっからDLできるサンプルファイルで試したところ

AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4

HE-AAC/Technology-en-69s-2-heaac-64000bps_seg.mp4

mediainfoの出力結果で
Audio;FormatではどちらもAAC表示で区別できず
Audio;Format profileでやっと区別できるんだけど,俺の勘違いかな。
902
(1): 2018/09/15(土)22:25 ID:8KftQgLD(13/14) AAS
何度も投稿してすまん。
これでいいんじゃないかな。
確かめた環境はMediaInfo 0.7.91 on Debian 9.5。
case "$(mediainfo --Inform='Audio;%Format_Profile%' "$FILE")" in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
903
(1): 2018/09/15(土)22:45 ID:pm09nqHo(29/29) AAS
>>896のコード見て思うのは

Unix哲学(を完全に受け入れたわけじゃないが)
9. 全てのプログラムはフィルタとして振る舞うようにせよ。

すべてのプログラムはフィルタとして振る舞うようにしたとして
そのプログラムを使う側もフィルタとして利用するようにすべきだと思うわけよ

つまりね、こういうふうに書くべきじゃないのか?ってこと

mediainfo --Inform='Audio;%Format_Profile%\n' "$FILE" | while IFS= read -r line; do
 case $line in
  HE*) echo 'HE';;
  LC*) echo 'LC';;
 esac
done

本当は$FILEの所も"$@"にして複数ファイル対応できるようにしたい。
だけどメディアファイルっていうのはオーディオを複数入れることができるはずだから、
この場合どうなるのか?という疑問がある。その場合はうまくいかないかもしれない。
まあ適切なサンプルファイルを思いつかんし面倒だから試しては見てないが
904
(3): 2018/09/15(土)23:39 ID:imSsWev+(5/5) AAS
みなさんどうもありがとうございます
>>896の時点のコードは以下です
外部リンク:pastebin.com
拡張子がaacのファイルがあるディレクトリでこのスクリプトを動かしたらaacファイル全て(ひとつづつ)処理させてます。

>>900-903
明日確認してみます

$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1

以前のバージョンではFormat profile欄があったのでそこで判別してたんですが、いつのまにか(昨日気がつきました)最近のバージョンではFormat profile欄がなくなっているんです。>>878のスクショです
905: 2018/09/15(土)23:59 ID:8KftQgLD(14/14) AAS
>>904
なるほどね。Debainのaptで入れたやつは古いのか。

$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/HE-AAC/Technology-en-69s-2-heaac-32000bps_seg.mp4
LC SBR
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
LC
これは結構見分けやすいんじゃないか?
906: 2018/09/16(日)00:12 ID:ynEgKPZ+(1/3) AAS
>>904
ちょっと訊きたいんだけど,MPEG4のLCとHEの違いってSBRが適用されてるかいなかの差?
もしそうならまさにそのオプションがあって
mediainfo --Output='Audio;%Format_Settings_SBR%'
↑これは,SBRが含まれていれば“Yes (Explicit)”,含まれていなけば空文字を返す。
907: 2018/09/16(日)00:17 ID:6L484PJq(1/2) AAS
>>904
> >>896の時点のコードは以下です
> 外部リンク:pastebin.com

つまらん。特に指摘する点はない。
細かい趣味程度のことぐらいだな。

ファイルは引数で渡したほうがいいんじゃね?とか
俺ならset -eu -o pipefailをつけるとか
(一行で書く場合を除いて)コマンドの後ろの ;; は嫌いだとか
908: 2018/09/16(日)01:08 ID:dyBKzwHe(1) AAS
大先生かよw
909: 2018/09/16(日)01:22 ID:6L484PJq(2/2) AAS
ちーす
910: 2018/09/16(日)13:43 ID:dTju3huw(1/2) AAS
ネタフリ、これ前に紹介したことあったっけ?

modernish: a shell moderniser library
外部リンク:github.com

良さそうなことを書いてあるが、大きすぎて、それでいて何ができるのかよくわからない
ようするに誰か日本語で簡潔に解説してくれとw
911: 2018/09/16(日)21:03 ID:ynEgKPZ+(2/3) AAS
変な人が二人いるせいで質問者が帰っちゃったじゃん。せっかく良い案を思いついたのに。
912: 2018/09/16(日)23:14 ID:dTju3huw(2/2) AAS
いや、気にせず書けよw
また見るかもしれないじゃん
913: 2018/09/16(日)23:27 ID:ynEgKPZ+(3/3) AAS
もう書いてるよw
914: 2018/09/17(月)09:30 ID:yJ/mJYoq(1) AAS
二人いるんじゃなくて、同一人物なんじゃ?
例の人、プロバイダー2つ契約してて自演に使ってるんだし。
915: 2018/09/19(水)03:32 ID:6Ke1Nn09(1/4) AAS
引用符を除去するいい方法ってないかな。
個人的には変数の仕様("abc"はabcとみなされる)とかを利用してエレガントに解決できるんじゃないかと思ってるんだけど うまくいかん。
いまのところsed -e 's/"\([^"]+\)"/\1'で問題はないけれど「\"」の形のエスケープに対応したりするのが面倒になってくるんだよね この形だと。
916
(1): 2018/09/19(水)04:43 ID:ScWhkKn/(1/3) AAS
a='"aa\"a"'
eval echo "$a" とか eval "b=$a"
じゃだめ?

おまけ、最近のbashには以下のような変数展開が
増えているけど今回は関係なさそう
${parameter@A}
${parameter@E}
${parameter@P}
${parameter@Q}
917
(1): 2018/09/19(水)07:25 ID:6Ke1Nn09(2/4) AAS
>>916
なるほどevalは思いつかんかったわ。
ただそれだと "aa\""→aa" になってしまうんだが これは正常な動作なんだろうか。
918
(2): 2018/09/19(水)07:59 ID:ScWhkKn/(2/3) AAS
>>917
さあね。「引用符を除去するいい方法」の正確な意味がよくわからないので
もしかして単に前後の引用符を除去するだけだった?
ならこれだけで行けるけど

a='"aa\"a"'
a=${a#\"}
a=${a%\"}

エレガントに解決っていうから、なんかもっと複雑な話かと思った
919
(1): 2018/09/19(水)08:36 ID:6Ke1Nn09(3/4) AAS
>>918
いや 別に文句を言ったつもりはない
先に挙げてもらった方法で解決してるし あれはすごくエレガントだと思う。

エレガントっていうのは数学畑の言葉のつもりで使った。
つまりまわりくどいやりかたではなく本質をつらぬいた方法。
今回は,
「シェルに対してトークンの区切りを示すための引用符をシェルに読み込ませることによって除去する」
という非常に直感的で素晴しい方法を学べた。
俺のやりかたはわざわざsedを使ってる点で,シェルが解釈するという本質から外れてしまっている。
920
(1): 2018/09/19(水)08:38 ID:6Ke1Nn09(4/4) AAS
ちなみにやりたかったことは単純に
VAR="value with space"
↑こういうことが書かれたファイルから
value with space
という語句を取り出すというもの。

$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -f 2 -d '=' | eval echo "$(cat)"
↑こういう感じ。
921: 2018/09/19(水)09:31 ID:qXmDWFW/(1) AAS
$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -d'"' -f2

というのはどうだろう
922: 2018/09/19(水)09:41 ID:ScWhkKn/(3/3) AAS
>>919
単に文字列の途中にどういう意味かわからなかっただけだよ。
>「\"」の形のエスケープに対応したりするのが面倒
とか書いてあったから、何がしたいんだろうと

前後の""を取るだけなら>>918のやり方が最短で最速

>>920
> VAR="value with space"
> ↑こういうことが書かれたファイルから
> value with space
> という語句を取り出すというもの。

それだとまた話が変わってくるな
(. /etc/os-release; echo $PRETTY_NAME)

()でくくってるのは、単に変数のスコープをサブシェルに閉じ込めてるだけ
カレントシェルにばらまいていいなら()はいらない

シェル互換の文法としてみなせるファイルならこれでいけるよ
コードが入っていたら実行されるから、安全なファイルと断定できるものにしか使えないけど
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.214s*