- 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/
- 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 名前:サうですね []
- [ここ壊れてます]
- 724 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:02:19.80 .net]
- >>704
>>705 どうもありがとうございます 今触れないので、あとでやってみます!
- 725 名前:700 mailto:sage [2018/03/22(木) 01:05:43.95 .net]
- >>703
>>706 >>707 の3つは私です
- 726 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:26:33.69 .net]
- 文字列を1文字ずつ処理するってどうやれば良いのかな?
- 727 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:26:58.52 .net]
- なるべく速い方法で
- 728 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:40:38.44 .net]
- 先頭の一文字を削除するっていうのはできるんだけどなぁ。
一文字削除したらな、その削除した一文字を取りたいものだ あ、POSIXの話ね
- 729 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:43:14.01 .net]
- あ、これでいけるのか
str=abcdefg last=${a##?} echo ${str%%$last}
- 730 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:43:57.68 .net]
- exprが柔軟かな
- 731 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:17:21.19 .net]
- grep -o .
- 732 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:28:14.30 .net]
- >>709
速いかどうか分からんけど awk でやるなら printf 'Hello\nWorld\n' | awk -F '' '{for(i=1;i<=NF;i++) print $i}' とかかなぁ。grep -Eo '.' ってのもあるけど for c in $(printf 'Hello\nWorld\n' | grep -Eo '.') do echo "$c" done あとは fold コマンドとかで。 printf 'Hello\nWorld\n' | fold -w1
- 733 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:37:08.12 .net]
- 間違えてた
str=abcdefg last=${str##?} echo ${str%%$last}
- 734 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:39:35.06 .net]
- >>715
後出しだけど、意外と改行まで1文字として扱うのは大変なんだよね
- 735 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:48:27.27 .net]
- 改行を扱いたい場合は bash か zsh の read かな。
printf 'Hello\nWorld\n' | while read -r -n 1 c;do echo "$c"; done awk の場合は RS に '\0' をセットすればいいかも printf 'Hello\nWorld\n' | awk -vRS='\0' -F '' '{for(i=1;i<=NF;i++) print $i}'
- 736 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/24(土) 18:09:58.40 .net]
- 公開するようなシェルスクリプトって--helpオプションくらいは付けたほうがいいかな。
問答無用で第一引数をファイル名やらURLやらだと解釈するほうがはるかに楽だし簡潔になるんだけども。
- 737 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/24(土) 18:17:47.94 .net]
- オプションで思い出した。
オプションの解析めんどくせーとか思って他の言語のライブラリを参考に オプション解析のライブラリを作ろうかと思ってるんだが、 getoptやgetopts程度だと使いやすくなった気がしないし、 作った所でそんなに簡単に書けるようなもんでもなさそうで、 何のためにコレが必要なんだ?って思いなした結果 他言語にあるようなライブラリは、--helpを半自動で 生成してくれるものだと思ってたりする でももう少しオプションの解析楽にならないかな? どうすればいいんだろう
- 738 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 01:51:02.53 .net]
- ある文字列のハッシュ値を求めたいんですけど
どのLinux/UNIX/FreeBSDでも標準ではいってる ハッシュ化コマンドって何がありますかね? それからPOSIX標準コマンド?みたいなものってあるんですか? どこでも絶対はいっていなければいけないコマンドとか
- 739 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:25:15.03 .net]
- POSIXってこれ?
pubs.opengroup.org/onlinepubs/9699919799/
- 740 名前:700 mailto:sage [2018/03/25(日) 02:29:04.48 .net]
- DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp' BAKDIR='$TMPDIR/backup_%DATE' #echo "$DATE" mkdir $TMPDIR/backup_$DATE cp -rfp /home/atashi/doc $BAKDIR これだとcpが出来ないんですがどこが間違えていますか?
- 741 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:29:55.81 .net]
- ない
- 742 名前:700 mailto:sage [2018/03/25(日) 02:34:52.38 .net]
- 最後の行は
cp -rfp /home/atashi/doc $BAKDIR/docです
- 743 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:41:09.90 .net]
- >>723
3行目の%が間違ってるよね? あと 4行目でデバッグ用にechoすべきは$BAKDIR 5行目はmkdir “$BAKDIR” 一つ一つ確認したほうがいいよ
- 744 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:44:00.47 .net]
- >>723
BAKDIR='$TMPDIR/backup_%DATE' こうじゃない? BAKDIR='$TMPDIR/backup_$DATE'
- 745 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:44:27.17 .net]
- あ、かぶったw
- 746 名前:700 mailto:sage [2018/03/25(日) 03:03:57.65 .net]
- >>726
>>727 ほんとだ。 $に直したんですが、 DATE=`date '+%Y%m%d%H%M'` TMPDIR='/tmp' BAKDIR='$TMPDIR/backup_$DATE' echo "$TMPDIR" #mkdir "$BAKDIR" echo "$BAKDIR" を実行すると、 $ ./hoge.sh /tmp $TMPDIR/backup_$DATE になってしまって、ダメでした。 mkdir "$BAKDIR" を入れると、カレントディレクトリに「$BAKDIR」というフォルダが出来てしまいました
- 747 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 03:13:28.38 .net]
- >>729
シェル シングルクォートとダブルクォートの違い 辺りでググってみて
- 748 名前:700 mailto:sage [2018/03/25(日) 03:17:52.62 .net]
- DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp' BAKDIR="$TMPDIR/backup_$DATE" echo "$TMPDIR" mkdir "$BAKDIR" echo "$BAKDIR" >>730 出来ました! どうもありがとうございました。 $ ./test.sh /tmp /tmp/backup_201803250316
- 749 名前:700 mailto:sage [2018/03/25(日) 04:07:06.26 .net]
- 上の後に
cp -rfp /home/hoge/doc $BAK_DIR/doc zip -r $BAK_DIR.zip $BAK_DIR をやるとzipを解凍してみたら tmpフォルダが出来てその中にbackup_201803250348フォルダが出来ているんですが、 zipを解凍したらbackup_201803250348フォルダが出来るようにするにはどうしたらいいですか?
- 750 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 09:39:54.86 .net]
- ( cd $TMPDIR ; zip -r backup_$DATE.zip backup_$DATE )
- 751 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 16:41:32.60 .net]
- すみません、timeoutコマンドのうまい使い方を教えてください
シェルの中でtimeoutでタイムアウトさせた場合、シェル丸ごとごと落ちてしまいます タイムアウトさせた上で処理を分岐させて継続して処理させるにはどう制御したら良いのでしょうか timeout unzip || func_hoge といった感じで一応回避できたのですが、関数処理が終わると丸ごとプロセスキルされる事には変わらず、綺麗に終わらすことができません
- 752 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 16:54:52.07 .net]
- timeoutコマンドを実行したシェルは落ちないよ
$ timeout 1 unzip … としたときに タイムアウト後にunzipのプロセスがキルされると困るって話??
- 753 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 17:56:56.40 .net]
- https://linuxjm.osdn.jp/html/GNU_coreutils/man1/timeout.1.html
コマンドがタイムアウトした場合で、かつ --preserve-status が設定されていない場合、 終了ステータスは 124 になります。
- 754 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 19:03:35.42 .net]
- >>735
紛らわしい書き方をしてすみませんでした シェルスクリプトです 今環境がないので具体的な結果を示せませんが、例えば以下のような処理を実行するとtimeoutがプロセスを落とした(?)メッセージがコンソール出力された後、後続のechoは何も表示されません #/bin/bash timeout 1 unzip piyo.zip if [ $? -ne 0 ]; then echo hoge else echo fuga fi echo owata
- 755 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 19:19:17.27 .net]
- >>737
んー。こっちでは表示されるけれども… Script started on 2018年03月25日 19時18分12秒 testuser@debian:~/var/tmp/temp$ cat ./to.sh #! /bin/sh - timeout 1 sleep 10 if [ $? -ne 0 ]; then echo hoge else echo fuga fi echo owata testuser@debian:~/var/tmp/temp$ ./to.sh hoge owata testuser@debian:~/var/tmp/temp$ exit exit Script done on 2018年03月25日 19時18分30秒
- 756 名前:700 mailto:sage [2018/03/25(日) 21:40:43.57 .net]
- >>733
どうもありがとうございます
- 757 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:27:12.96 .net]
- ていうか
BAKDIR がいつから BAK_DIR になったんだ
- 758 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:38:36.41 .net]
- このコードってvalidですよね?
やってること・・・foo関数が最初に呼ばれた時に OS判定(相当)のことをして、OS毎に処理を切り替えて実行 関数を上書きすることで、次回以降は判定することなく処理実行 #!/bin/sh foo() { echo first call os_type=linux [ $os_type = linux ] && \ foo() { echo linux } [ $os_type = mac ] && \ foo() { echo mac } foo } foo foo
- 759 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:53:06.94 .net]
- >>738
なんででしょうね(´;ω;`) もう一度見直してみます
- 760 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 08:52:17.43 .net]
- くだらないtypoしていたに一票。
変だと思ったら、 sh -x スクリプト名 でなにやってるか眺めてみることをオススメする。 勿論、
- 761 名前:標準エラーを /dev/null に捨てたりするのもナシで。 []
- [ここ壊れてます]
- 762 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:04:26.16 .net]
- 再確認してきました
実際にはリンク先の48,49行目のログ整形のための処理で問題が起こっているようです timeout自体の問題ではないので一旦取り下げます、ご協力ありがとうございました https://pastebin.com/F5QC2Yu5
- 763 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:13:47.05 .net]
- ワロタw
fail() { case "$1" in 0) echo "Info :$2" ;; 1) echo "Warn :$2" ;; 2) echo "Error:$2" ;; 3) echo "Success :$2" exit 0 ;; 4) echo "Fatal:$2" exit 1 ;; 略 esac }
- 764 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:16:57.86 .net]
- failwww ひどいなw
fail 0 " **** test start ****" WAIT_SEC=5 time timeout -sKILL ${WAIT_SEC} unzip -t /home/xxxx/crypto.zip if [ $? -ne 0 ]; then fail 2 "hage" else fail 0 "hoge" fi fail 3 "**** test end ****"
- 765 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:20:23.93 .net]
- おお、是非原因と対処法も書いてってください
- 766 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:22:56.42 .net]
- failなのにsuccessなのか…
- 767 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:47:56.48 .net]
- >>747
原因・・・他人のコードを理解せずにパクって、行き当たりばったりにコード書き加えて、終わらすこと 対処法・・・ちゃんとコード読んで理解して無駄なものをなくせ
- 768 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 12:55:45.54 .net]
- >>749
全く耳が痛い、実際そういうレベルだけど頑張るよ(´・ω・`) > >は実際わけわからずに使ってるし
- 769 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 02:35:57.99 .net]
- あー、ちくしょ、
ローカルでもリモートでも使うスクリプトを 置くディレクトリ名が決まらない ローカルだけで使うスクリプト リモートだけで使うスクリプト 両方で使うスクリプト どういうディレクトリ構成にしよう Windowsも考慮したいから シンボリックリンクは使いたくない
- 770 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 02:56:48.81 .net]
- またお前か
- 771 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 19:30:16.58 .net]
- >>751
~/share/public/ に置いてる。
- 772 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 20:19:33.81 .net]
- なんか冗長な感じ
- 773 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 21:50:15.67 .net]
- うちは~/share/public/sbin/
|

|