[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 04/11 08:58 / Filesize : 268 KB / Number-of Response : 1033
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:07:26.41 .net]
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
echo.2ch.net/test/read.cgi/unix/1439563321/

623 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 20:51:46.21 .net]
>>606
名前付きパイプ(mkfifo)はプロセスが2個あって
片方が出力側プロセス、片方側が入力側プロセスに
別れない限りストリーミングにすることができない
(同一プロセスでは出力しながら入力ができないため)

今回の場合、標準出力と標準エラー出力の2つがあるから
出力側プロセス1個と入力側プロセス2個の合計3プロセスが必要になる
つまり別プロセスとして起動しなければいけない

もちろん出力の完了待ちのwaitも必要だし、作成したパイプの削除も必要。
特にCTRL+Cで中断された場合とか
また万全を期してパイプ名が被ることも考慮してランダムな名前にしたい

ここまで言えば名前付きパイプを使った方法は実装するのに行数がかかり
面倒な方法だと言うことがわかるだろう?

また>>557で書いたとおりbusyboxで動かす必要があるのだが、
そもそもbusyboxでmkfifoが存在しない場合もある
↑俺にとってはこっちのほうが重要

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:00:55.81 .net]
もう来なくていいよ
レス続けるならコテハン付けて

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:03:28.88 .net]
粘着かよ
気持ち悪い

626 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:03:48.79 .net]
レス続けたのは俺じゃないんだがw

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:57:56.36 .net]
うわ。まだ居たのかこのキ​チガイ…
まあ放置が一番いいな。俺のこのレスも彼を発狂させる原因になるやもしれんし。

628 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 22:15:10.19 .net]
まあ反論なく放置される(=俺の勝ち逃げ)という状況ってのが
俺にとっては一番であることには間違いないが


で俺がレスしたのは、放置してないからだよ?w

629 名前:604 mailto:sage [2018/03/08(木) 22:33:08.10 .net]
>>609
あ、しまった printf '\e' は GNU/Linux じゃないと動かないみたい。
Debian使ってんのがバレてしまったw
FreeBSDとかでも動作させる為には printf '\033' とやる必要がある。

630 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 22:42:34.38 .net]
>>609
出力 A 正常 出力 B 異常 出力 C 正常 の時
それだとACBまたはBACと表示されないか?
まぁそれで良ければ良いんだけど

631 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 23:32:13.81 .net]
ガチでアレな奴が粘着してるな
ここまで気持ち悪い奴は滅多に見ない



632 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 23:54:18.50 .net]
>>556
exec > >(sed -e 's/\(.*\)/^[[32m\1^[[m/')
exec 2> >(sed -e 's/\(.*\)/^[[33m\1^[[m/')

後は普通に処理を書けばおk

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 01:48:35.86 .net]
どんだけ答え知りたいんだ
あっちのスレいけよこっちはこっちで楽しんでんだから

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 22:50:21.96 .net]
おいおい勘違いするな
>>556はbashやzshでのやり方を聞いてる。
POSIXの範囲でやりたいと言ってる俺ではない

635 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 23:00:06.75 .net]
そういや>>619で思い出したけど、
busyboxのsedってなんか動きがおかしいんだよね。

(echo 1; sleep 5; echo 2; sleep 5) | sed 's/a/a/'

例えばこれを実行すると、1が表示されるのは5秒後になる
debianだとすぐに表示されるのに。一行遅れて表示される

だからsedは今回の俺の用途には使えなくてreadを使ってる

636 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 00:28:42.71 .net]
>>622
Ubuntu ではおかしいみたいですね。
Debian と openSUSE の busybox では記述通りの動きでした。

637 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:03:52.34 .net]
>>623
WSL上のUbuntuは問題なかった。
busyboxはビルドによって色々変わるだろうけど
よく分からんね

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:06:54.08 .net]
> openSUSE の busybox では記述通りの動きでした。
もしかして、sedはbusyboxじゃない方のsedになってない?

WSL上のUbuntuに入れたbusyboxのsed
↓つまりこれを実行するとやっぱり5秒後に1と表示される
(echo 1; sleep 5; echo 2; sleep 5) | busybox sed 's/a/a/'

やっぱりbusyboxが実装してる簡易版sedの問題な気がする

639 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:08:10.50 .net]
まあもともとbusyboxってそういうものだし
とりわけ騒いだりはしないけどさ

640 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 02:15:25.24 .net]
>>625
>>623 は busybox ash でシェルを起動して確認しています。
busybox sed 's/a/a/' にすると Debian も openSUSE も Ubuntu と同じ動作になりました。

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 09:07:03.16 .net]
おーほんとだ。Busybox v1.22.1 on Debianでも同じような動きになる。
ここまでハッキリしたバグに遭遇したの久し振りだわ
単に離れてただけかもしれんが



642 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 09:38:16.90 .net]
なにやら興味がある人がいるようでw

なんで俺の用途で使えないかというと、例えばこんな感じに
ユーザーのインタラクティブな入力を変換して出力したいから

↓ >(実際には画面に表示されない) の行がユーザーの入力

$ sh | sed 's/a/a/'
> echo 1
> echo 2
1
> echo 3
2

見ての通りユーザーが入力したコマンドの結果が一つ遅れて表示される
sedのよくあるユースケースでは問題ないんだろうけどね

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 12:15:21.67 .net]
>>629
挙動が変わるツールは珍しいなと思いました。
busybox ash の中で sh | sed 's/a/a/' とすると、
Debian (v1.22.1) まとも
Ubuntu (v1.22.1) 遅れる
openSUSE (v1.21.1) まとも(sh プロンプトが表示される)
CentOS (v1.15.1) まとも(sh プロンプトが表示される)
Windows (v1.29.0) 遅れる
でした。
ビルド時に引いているライブラリの差異なのでしょうか...

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 12:28:15.59 .net]
バッファリングが影響してそうなのかもしれないけど
正規表現の実装の都合な気もする。
はたまたカーネル

645 名前:ェ関係してるのかシェルの設定でなんかあるのか

正直、そういう違いが有るんだね。気をつけておくよと
事実を受け止めるぐらいでで深追いする気力はないw

話変わるけど、何もしない関数の定義、
foo() :

もしくは、echoするだけの関数の定義
foo(): echo foo

この書き方ってPOSIX準拠だよね?
bashやzshではエラーになった
[]
[ここ壊れてます]

646 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 15:57:33.44 .net]
>>631
foo() echo foo ならzshは理解するぞ
Bourne shell系はfoo() any-compound-commandだけ理解して
foo() any-commandは理解しない

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 18:45:48.71 .net]
>>631
POSIX準拠なのかはよくわかりませんが、sh ならば

foo()
foo1() echo "$1"

で、sh でも bash でも動かすなら

foo() { :; }
foo1() { echo "$1"; }

でいけると思います。

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 23:10:12.04 .net]
訂正
× foo(): echo foo
○ foo() echo foo


>>632
ごめん、zshでは試していなかった。
今zsh入れてたマシン壊れてるんだったw
別の環境にzsh入れたらたしかに動いたね

dash、ash、zsh では動いた
bashだけ動かなかった

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 23:17:51.17 .net]
func() :
↑これ確かにシェバンを #! /bin/sh にすると通るけど
#! /usr/bin/env bash にすると撥ねられるな。
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
一応現行POSIXのシェル関数の定義はここに書いてあるけど、func() : は恐らく適合してるな。
多分bashの文法チェックが少しばかりおせっかいすぎるんだろう。
でもPOSIXに準拠した記法なのにエラーになるって嫌だなぁ

650 名前:632 mailto:sage [2018/03/10(土) 23:21:43.98 .net]
あれ。yashでも「syntax error: a function body must be a compound command」って撥ねられるわ。
yashはかなり厳密にPOSIXに従ってる筈なんだけど…

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 00:25:29.87 .net]
またちょうどよくシバンの話がw

シェルスクリプトのファイルを直接実行するのではなく
ライブラリとして他のスクリプトから読み込むだけの場合
シバンいらないよね? またその場合の拡張子ってどうしてる?

シンタックスハイライトとか自動で適用させたいんだけど
余計なものはできるだけ排除したい



652 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 00:28:14.22 .net]
>>635
そうなんだよね。あと

> fname ( ) compound-command [io-redirect ...]

ここにio-redirectが書けたのがびっくり
どういう時に使えば良いんだろうか?

653 名前:632 mailto:sage [2018/03/11(日) 01:05:34.01 .net]
>>638

俺は未インストールコマンドの処理に使ってる

check_command()
{
type "$1" > /dev/null 2>&1 || {
printf '%s%s\n' \
"$1" 'をインストールして下さい。'
exit 1
} >&2

return $?
}

check_command "curl"

こうするとエラーメッセージが標準出力に出ないからパイプ繋いでてもおかしなことになりにくい。
もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 01:46:36.03 .net]
>>639
いや、そうではなくて関数定義の最後に書けるんだなーって話

その例で言えば、こういう書き方ってこと
(関数全体を別の所に出力したいときには便利か、うーん使うかな?)

check_command()
{
 type "$1" > /dev/null 2>&1 || {
  printf '%sをインストールして下さい。\n' "$1"
  exit 1
 }
} >&2

# ついでにどうでもいい所を俺の趣味で変更したw
# exitもreturnに変えたい。もしくはexit_if_command_not_foundみたいな関数名にしたい


> もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。

/dev/ttyに出力するって手もあるよ

$ (echo stdout-a; echo stderr-a >&2; echo tty-a >/dev/tty) |& sed 's/a/b/'
tty-a
stdout-b
stderr-b

655 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 02:00:39.65 .net]
>>636
yash覚えた

最低限機能しかももってないと思われるashで動けば
Bourne Shell 系全部でうごくだろうと思っていたから
そういうこともあるんだなーって思った

656 名前:632 mailto:sage [2018/03/11(日) 02:47:31.38 .net]
>>640
あ,そういうことか。勘違いしてたわw それはちょっと使い道思い付かん

ところで,
return $?
↑これ消した理由なに? C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
シェルスクリプトだと要らないのかな。今まで特にreturn行のせいで不具合が発生したこともなかったけれど。

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 11:42:23.58 .net]
>>642
何も書いてなければ、その時点の$?がそのまま返るだろ?

> C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
Ruby(最後に評価された値を返す)やってるとreturnなんて書かないんだがw

658 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 11:44:13.17 .net]
> 今まで特にreturn行のせいで不具合が発生したこともなかったけれど。
まあ不具合は発生しないだろうね。

関数の最後でなにもしないなら、その時点の $? が返る所を
$?を取り出してreturnの引数で$?を返すようにしただけだからw

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:19:13.21 .net]
Cとか化石みたいな言語使ってる人って無駄が多いよね
生産性悪w

660 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:41:26.14 .net]
そういうこと言う奴って大体Cが出来ないコンプレックス抱えてるんだよなぁ

661 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:44:23.08 .net]
Cから学べること多いのになぁ



662 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:59:18.74 .net]
Cはハードに近いところを表現するのに適してるから絶対に無くならないけどね。
化石だけど生活には欠かせない燃料みたいなもんかな。
Cで書かれてるシェルのスレで否定しちゃうのはちょっと痛いね。

663 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 14:52:52.42 .net]
俺はCを否定してないぞ。C以外を使っていれば
returnしなくていい言語だってあることを知るだろうし、
returnを書くことに拘る必要はないってことだ

664 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:03:25.28 .net]
>>643
ruby使ってたってreturn書くことあるだろ
implicitとexplicitを状況に応じて使い分けることが大事

665 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:26:06.07 .net]
山月記ってアニメ化されないの?

666 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:39:38.95 .net]
>>650
ルビ厨の相手するなよ

667 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 17:07:11.55 .net]
>>652
Cに対するコンプレックス同様
Rubyに対するコンプレックスも見苦しい

668 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 22:37:37.82 .net]
>>650
returnを省略できる場合に、returnを書くことはないよ

669 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 09:24:03.09 .net]
話をぶった切ってすまんが、なるべく依存関係が少ない・かつインタラクティブがある程度機能的なPOSIX互換シェルって何があるかな。
ksh98とかyashとかは使ったことあるけど、ああいう感じでもうちょい開発が盛んなやつとか知らない?

670 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:35:16.53 .net]
連続足し算だけど
#!/bin/bash

while true
do
add=expr 0
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done

でできるが
line 5: 0: command not found
1
----------
1
./tasizan-renzoku.bat: line 5: 0: command not found
2
----------
3
./tasizan-renzoku.bat: line 5: 0: command not found

と 気色悪い。 どうすれば正解なの?

671 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 17:39:55.92 .net]
expr 0が何も囲われてないが大丈夫か



672 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:48:20.94 .net]
すごいね、以下でエラーがなくなった。

#!/bin/bash
while true
do
add=(expr 0)
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done

673 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:49:39.62 .net]
エラーがなくなった が 足し算の合計もなくなった

674 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:58:34.26 .net]
a=0
while read x; do
a=$((a + x))
echo ----------
echo ' ' $a
done

675 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 18:02:05.44 .net]
ありがとう。 合計を外側で定義することがわからなかった。
こうなると 

676 名前:d卓より便利! []
[ここ壊れてます]

677 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 22:12:41.08 .net]
【大統領】   Japは我々の家畜  <大イスラエル帝国>  安楽に暮らせる奴隷   【議定書】
rosie.5ch.net/test/read.cgi/liveplus/1520856333/l50

678 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 23:38:42.01 .net]
また頭がおかしいのがわいてきた
UNIX板荒らさないでほしい

679 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/13(火) 00:08:45.00 .net]
コマンドにローマ字で名前付けるやつは多かれ少なかれキチ成分が入ってる (経験からくる偏見)

680 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/15(木) 11:45:55.61 .net]
>>654
書いといた方がデバッグが楽だぞ

681 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/15(木) 22:29:00.04 .net]
>>665
あんまりそう思ったことないな



682 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 03:48:34.81 .net]
for i in `seq -f %02g 1 10`

do
echo ${i}
done


このfor文の中で01の時に1、02の時に2を指定する方法ってありませんか?
簡潔に言うと先頭の0を取ったものを使いたいです

683 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:33:32.12 .net]
>>665
どうしてデバッグが楽なのか知らんが、
少なくともprintfデバッグすると
終了コードが0に変わるからデバッグしづらいな

684 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:52:03.87 .net]
>>667
2桁と決まっているなら

echo "${i##0}"


逆にしてこっちのほうが楽だと思うが

for i in $(seq 1 10)
do
printf "%02d\n" $i
done

685 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:52:41.56 .net]
訂正

printf '%02d\n' "$i"

686 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 20:01:50.50 .net]
拡張POSIX準拠らしいけど
echo {1..10} {01..10}

arch linuxだと普通のshでも展開してくれる

687 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 20:09:04.24 .net]
ありがとうございます

688 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 21:41:11.21 .net]
どういたしまして

689 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 22:02:49.28 .net]
>>671
> arch linuxだと普通のshでも展開してくれる
してくれなかったぞ

690 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 23:05:13.47 .net]
> 拡張POSIX準拠らしいけど

拡張POSIXってしう仕様があるの?
POSIXを拡張したもので、POSIX非準拠って意味だと思ってたんだけど?

691 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 00:55:12.66 .net]
シェルスクリプトってさ、POSIXが標準だけど
実質bashがデファクトスタンダードって考えて良いのかな?
zshやfishを使っていてもbashはインストールされていると考えていい?

いや、あるコマンド作ろうと思ってるんだけど、
基本はPOSIXで動くようにするけど、bashがインストールされていれば
拡張機能が使えるようになる。という仕組みは
ほぼすべての人が拡張機能使えると考えて良いんだろうかなって思って



692 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:08:34.19 .net]
>>676
bash前提はだめ。
BSD系にはデフォルトで入っていないし、後から入れてもパスが違う。

693 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:10:24.11 .net]
>>674
ごめん
/bin/shのバージョン確認してみたら
GNU bash, バージョン 4.4.19だった

694 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:15:31.51 .net]
>>677
いやbash前提じゃないんだ。POSIX シェル前提。POSIX シェルだけで動く。
だけどbashがインストールされていれば拡張機能が使える
その拡張機能っていうのも、本質的な機能じゃなくて
なんていうかな、同じコマンドで実行結果も同じだけど情報が詳細に取れるって感じ

BSD系といってもMacはデフォルトでbashになったのは知ってる。
パスに関してはシバンではなくbashコマンド経由で実行すれば良いと思ってる
(切替可能なようにするのでどっちみちシバンには頼らないと思うし)

695 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:16:39.04 .net]
>>678
うん、たしかCentOS系はbashへのシンボリックリンクになってたはず
Debian系はdashなので拡張POISXは使えない

696 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 09:35:45.26 .net]
POSIX規定外のことをPOSIX拡張って書くのは誤解のもとだからやめた方がいい。
伝統的にシェルにはなくてPOSIXで増えた機能のことをPOSIX拡張とよぶことがあるので、意味が真逆。

697 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 09:54:45.87 .net]
可搬性を考えるとPOSIX準拠で書く癖をつけた方が
自分のためになるなあ

698 名前:名無しさん@お腹いっぱい。 [2018/03/18(日) 12:02:31.33 .net]
  ★★★The● best way to eliminate too much gap between rich and poor, is to decide the tax● rate of the progressive tax in the referendum(Root Tax).★★★

  この掲示板(万有サロン)に優●秀な書き込みをして、総額148万円の賞金をゲットしよう!(*^^)v
●  jbbs.livedoor.jp/study/3729/ →リンクが不良なら、検索窓に入●れる!

699 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 14:34:15.18 .net]
POSIX準拠で書くのは結構つらいので
デファクトスタンダードであるbash機能のみで書くといいよ

700 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 14:55:14.07 .net]
>>679
いっその事
ps -p $$ -o comm=
でシェルを見て処理を分けるとか

701 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 15:53:34.91 .net]
>>685
見分け方は本質的なところじゃないんで
俺にとってはどうでもいい話だけど、
シェルの判定ではなくて機能チェックで見分けるよ

ブラウザをUserAgentで判定するのではなく
使いたい機能が使えるかどうかで判定するのと似たようなやり方ね

> ps -p $$ -o comm=
ちなみにそれcygwinではエラーになった



702 名前:682 mailto:sage [2018/03/18(日) 22:58:03.92 .net]
>>686
bash や zsh の機能を多く使うならば、その都度機能が動くかどうか判定するより、
起動シェルを見て分岐したほうが手間がないという意味合いで書きました。

cygwin の ps は -o オプションは無いのですね。失礼しました。
freebsd の環境で hoge.sh に ps -p $$ -o comm= と書いて、
/usr/local/bin/bash ./hoge.sh とすると、bash と表示されます。
(debian とかの ps でも ok)

cygwin の /bin/sh は /bin/bash なのでシェルを見るよりその都度使用する機能を判定するほうがよさそうですね。

703 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 06:19:05.05 .net]
> > ps -p $$ -o comm=
> ちなみにそれcygwinではエラーになった

マジで!? POSIXでも定義されてるんだけどなぁ

704 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:02:30.98 .net]
壊れた動画探しに
ffmpeg -i input -f null /dev/null 2>&1 | grep -m 1 -Ii error
ffmpeg -i input -f null /dev/null 2>&1 | grep -q -i error
とやったのですけれど、grepにヒットしてもffmpegの動画読み込みが止まりません。
grepにヒットしたらffmpegを止めるにはどうすればいいのか。
いいアイデアはないですか。

705 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:45:03.71 .net]
この手が使えるのではないか
https://stackoverflow.com/questions/7178888/grep-q-not-exiting-with-tail-f

706 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:52:10.70 .net]
ffmpeg -xerror は使えないんだっけ
‘-xerror (global)’
Stop and exit on error

707 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 00:41:07.30 .net]
bashがどうしても使えない化石サーバは廃品回収へ

708 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 01:44:18.89 .net]
新Mac板から来ました。
カレントディレクトリ内にaacファイルがあれば、mediainfoでHE-AACかLC-AACか調査して、
l-smash muxerを使ってHE-AACとLC-AACでは別のコマンドにてm4aに詰め込みたいです。

以下のままだと、aacが無い場合は
-----
aacファイルはありません.
-----
iTunes MP4 muxing mode
./test.sh: 3 行: 27777 Segmentation fault: 11 muxer -i $file 〜
と表示されてしまいます。

AACファイルがない場合はmuxerのコマンドに進まないようにするにはどう書くといいん

709 名前:でしょうか?

続く
[]
[ここ壊れてます]

710 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 01:44:57.18 .net]
続き

#!/usr/bin/env bash

for file in *.aac; do
if [ -e $file ] ; then
# aacファイルが存在する場合
mediainfo $file | grep '^Format profile *: LC$' >/dev/null 2>&1
#es=$?
else
echo "-----"
# aacファイルが存在しない場合
echo "aacファイルはありません."
fi
#------------------------------------
# HE-AACだった場合
if [ $? = 1 ] ; then
echo "-----"
muxer -i $file?sbr --file-format m4a -o ${file%.aac}.m4a
fi
#------------------------------------
#AACの場合
if [ $? = 0 ] ; then
echo "-----"
muxer -i $file --file-format m4a -o ${file%.aac}.m4a
fi
# .aacで終わるファイル名だけど、HEでもLEでもどちらでも無い場合はどうやるんだろうか
done

711 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 06:10:19.91 .net]
$1は本当に直前に実行したのコマンドのステータスしか入らないから注意
ifで比較する前にecho $1で何が入ってるか確かめてごらん
それをふまえて論理構造組み直しな



712 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 08:25:32.50 .net]
「AACの場合」の前後の fi と if ... の2行を else に置き換えた上で、mediainfo コマンドの直後に
「HE-AAC だった場合」以降の if/else 文を移動、ではだめかな。

$? はすぐに別のコマンドの結果を格納してしまうので、
. mediainfo ...
. MEDIAINFO_RET=$?
. ...
. if [ $MEDIAINFO_RET = 0 ] ; then ...
みたいにコマンド実行直後に別の変数に回収してみるといいかもね。

713 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 10:06:24.97 .net]
>>690,>>692
ありがとう
早速試してみる

714 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 11:43:54.77 .net]
>>695
>>696
どうもありがとうございます
試してみます

ググっていたら、同じようにエラーが出る人がいて、testの[]を二重のカッコ[[]]にしてるようでした

今見返したら、es=$?でやってみようと思ってたのに途中になってたっぽいです

715 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 12:10:20.27 .net]
for文脱出したいだけならbreak

716 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 02:19:38.65 .net]
>>695
>>696
うまくいきました。
どうもありがとうございます。

>>699
書き換え前のスクリプトで試しましたが、こちらもエラーが出ませんでした。
どうもありがとうございます。

オライリーの入門bashには、ループの終了にbreakを使うのは良くないと書いてありました。
それはなぜでしょうか?

717 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 02:54:50.71 .net]
>>700
今回みたいなエラー処理の場合はexitした方が良いかもね

718 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 09:34:02.98 .net]
>>701
なるほどです

719 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 23:13:42.44 .net]
>>693
>>694
>>696

上の場合はmediainfoの終了ステイタスで判断して次にさらにif〜と進んでいるんですが、
LCかHE-AACかそのどっちでも無いかをcace〜muxer〜っとやるほうが確実なのかなと思いました。

その場合、
mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'
で出てきた文字列をcaseに渡したいんですが、

case HOGE in
"*: LC" ) muxer〜;;
"*: HE-AAC / LC" ) muxer〜;;
* ) "AACではない";;
ecase

だった場合、HOGEにはどう書けばいいんでしょうか?

720 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:30:54.25 .net]
>>703
HOGE=$(mediainfo $FILE | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/‘)

mediainfoの出力をgrepでFormat profileの行だけに絞って
それをsedで必要な箇所だけ置換して変数に入れてる
円マークはバックスラッシュに変換してね

721 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:40:17.02 .net]
sedじゃなくbashのstring manipulationを使いたければ

HOGE=$(mediainfo “$FILE” | grep -E '^Format profile')
case ${HOGE##*:} in


${HOGE##*:} はHOGE内の文字列を先頭から”:”まで最長一致で取り除く



722 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:59:34.53 .net]
自己レス

HOGE=`mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'`
case $HOGE in

これで大丈夫

723 名前:サうですね []
[ここ壊れてます]






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef