シェルスクリプト総合 その25©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/08/14(金) 23:42:01.51□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0079名無しさん@お腹いっぱい。
2015/10/20(火) 07:41:49.44sed p foo.txt
0080名無しさん@お腹いっぱい。
2015/10/20(火) 21:45:48.66ありがとうございます
こんなに簡単にできちゃった・・・
とりあえずpコマンド調べてみて
変換しない指定で返還前と変換後の2行が出力されるからこうなると理解しました
0081名無しさん@お腹いっぱい。
2015/10/20(火) 23:06:19.800082名無しさん@お腹いっぱい。
2015/10/21(水) 00:43:12.910083名無しさん@お腹いっぱい。
2015/10/21(水) 00:49:57.210084名無しさん@お腹いっぱい。
2015/10/21(水) 01:33:11.680085名無しさん@お腹いっぱい。
2015/10/21(水) 01:46:20.530086名無しさん@お腹いっぱい。
2015/10/21(水) 01:56:17.21sed 'N; s/.*\n//'
0087名無しさん@お腹いっぱい。
2015/10/21(水) 06:13:41.20sed -n 1~2p
0088名無しさん@お腹いっぱい。
2015/10/21(水) 06:38:20.240089名無しさん@お腹いっぱい。
2015/10/21(水) 07:02:03.890090名無しさん@お腹いっぱい。
2015/10/22(木) 08:26:25.71現代でも使える場面のあるsedは凄い
0091名無しさん@お腹いっぱい。
2015/10/22(木) 12:24:50.150092名無しさん@お腹いっぱい。
2015/10/22(木) 14:32:56.99スマートな方法はありませんか?
ファイル変換しないといけないでしょうか?
0093名無しさん@お腹いっぱい。
2015/10/22(木) 15:27:18.78pdftotext あたりで標準出力に吐かせて grep とか
0094名無しさん@お腹いっぱい。
2015/10/22(木) 15:55:01.58pdftotext hoge.pdf - | grep aaa
pdftotextでググったらこのページが
ttp://www.clear-code.com/blog/2010/8/2.html
Excelはssconvertを使えばいいようですね
0095名無しさん@お腹いっぱい。
2015/10/22(木) 22:52:20.38総務省の『憲法改正国民投票法』、でググってみてください。
日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、日本人の悲願である
改憲の成就が決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。
0096名無しさん@お腹いっぱい。
2015/10/27(火) 08:43:35.49ってことかな?
大きなテキストファイルをawkで処理するときにcatで投げ込むのと、ファイル読み込みするのどっちが速いか比較 - カメニッキ
http://tapira.hatenablog.com/entry/2015/07/22/214419
大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
http://d.hatena.ne.jp/yohei-a/20150728/1438099752
0097名無しさん@お腹いっぱい。
2015/10/27(火) 09:02:14.04それって Linux OS でマルチコアで出力先が SSD の場合にだけ
速くなるかもしれないってオチだったような
0098名無しさん@お腹いっぱい。
2015/10/27(火) 11:16:32.980099名無しさん@お腹いっぱい。
2015/10/27(火) 12:25:26.580100名無しさん@お腹いっぱい。
2015/10/27(火) 12:54:33.20今の時代SSDしかないような気がするんだけど・・・
0101名無しさん@お腹いっぱい。
2015/10/27(火) 17:55:11.78他の環境だとリダイレクトの方が速かったよ
0102名無しさん@お腹いっぱい。
2015/10/27(火) 18:45:52.060103名無しさん@お腹いっぱい。
2015/10/27(火) 23:01:18.380104名無しさん@お腹いっぱい。
2015/10/27(火) 23:24:17.69その書いたやつを見せてください。ぜひとも参考にしたいです
0105名無しさん@お腹いっぱい。
2015/10/28(水) 05:47:50.830106名無しさん@お腹いっぱい。
2015/10/28(水) 06:27:57.970107名無しさん@お腹いっぱい。
2015/10/28(水) 07:30:41.83入出力パスとか、オプションのon/off(1か0か)などを書いておき、その設定ファイルを
シェルスクリプト上から読み込んで、処理内容に反映して実行することを想定しています
こういった処理をする場合、業界の一般的な様式みたいな決まりってありますか。
また、いろいろな実装方法が考えられますが、どのようなコマンドで実現するのが適切でしょうか。
busyboxに入ってそうなコマンドが一通り動ける環境を想定しています。
0108名無しさん@お腹いっぱい。
2015/10/28(水) 08:21:07.49あなたはどんな業界の人ですか?
0109名無しさん@お腹いっぱい。
2015/10/28(水) 10:38:06.95RedHat系なら /etc/sysconfig/ 以下、Debian系なら /etc/default/ 以下を参考に
0110名無しさん@お腹いっぱい。
2015/10/28(水) 11:48:34.730111名無しさん@お腹いっぱい。
2015/10/28(水) 11:54:18.980112名無しさん@お腹いっぱい。
2015/10/28(水) 12:20:06.26シェルスクリプトから呼べば(実行すれは)環境変数として設定されるようになる
0113名無しさん@お腹いっぱい。
2015/10/28(水) 12:21:45.13readしてexportするんじゃなくてそのまま実行して環境変数に設定する
0114名無しさん@お腹いっぱい。
2015/10/28(水) 13:28:25.070115名無しさん@お腹いっぱい。
2015/10/28(水) 13:35:42.310116名無しさん@お腹いっぱい。
2015/10/28(水) 15:00:41.96>>112
>>113
107です、ありがとうございました。ファイルを読ませることしか頭にありませんでしたので、聞いてよかったです。
その方式で、スクリプトの冒頭で設定を担当するコードを実行するようにします。
0117名無しさん@お腹いっぱい。
2015/10/28(水) 22:16:32.330118名無しさん@お腹いっぱい。
2015/10/28(水) 23:07:56.69具体的にどこが偉そうなの?どこがカンに障るの?
0119名無しさん@お腹いっぱい。
2015/10/29(木) 04:20:02.340120名無しさん@お腹いっぱい。
2015/10/29(木) 06:23:24.26ユーザーはソフトのインストール禁止ですが、
最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、
X権限をすることによってソフトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようなおすすめのunixって何ですか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
0121名無しさん@お腹いっぱい。
2015/10/29(木) 07:39:00.78お腹いっぱいとは?
0122名無しさん@お腹いっぱい。
2015/10/29(木) 08:29:26.090123名無しさん@お腹いっぱい。
2015/10/29(木) 09:02:26.07最近は余りにもスレ違いな話題が多くないか?
0124名無しさん@お腹いっぱい。
2015/10/29(木) 10:15:07.660125名無しさん@お腹いっぱい。
2015/10/29(木) 11:15:37.67お前脳みそついてなくてUnix使ってんのか?
Windowsでも使ってろよ
希望してることができるから
0126名無しさん@お腹いっぱい。
2015/10/29(木) 12:04:46.300127名無しさん@お腹いっぱい。
2015/10/29(木) 22:18:02.02>>123
0128名無しさん@お腹いっぱい。
2015/10/30(金) 11:01:24.94軌道修正したレスができるなら相手して構わないんだけど、自演が疑われるような受け売り回答って不要だよな。
0129名無しさん@お腹いっぱい。
2015/11/01(日) 13:31:00.57たとえば/usr/bin/sensible-browserでは
/usr/bin/x-www-browser ${URL:+"$URL"}
のように使われています
なぜこう書くのかヒントをいただけたら…
0130名無しさん@お腹いっぱい。
2015/11/01(日) 14:16:24.02Parameter Expansion の項(日本語訳では パラメータの展開 の項)
を見るよろし。てか俺がしょっちゅう見直すとこだわソレw
0131名無しさん@お腹いっぱい。
2015/11/02(月) 12:13:01.41What does ${1+"$@"} mean?
http://www.in-ulm.de/~mascheck/various/bourne_args/
Autoconf
http://www.geocities.jp/fut_nis/html/autoconf-ja/Shell-Substitutions.html#Shell%20Substitutions
# 例えば、 $URL が未定義や、ヌルなら
/usr/bin/x-www-browser "$URL"
# は、この様な意味になるが
/usr/bin/x-www-browser ""
/usr/bin/x-www-browser ${URL:+"$URL"}
# は、こうなる
/usr/bin/x-www-browser
test.sh 引数の数に違いが出る(bash の方で理解しやすいので #!/bin/bash で)
#!/bin/bash -vx
foo="hoge"
bar=""
bash -vxc 'echo "$#, " "$@"' "dummy" "$foo"
bash -vxc 'echo "$#, " "$@"' "dummy" "$bar"
bash -vxc 'echo "$#, " "$@"' "dummy" "$baz"
bash -vxc 'echo "$#, " "$@"' "dummy" ${bar:+"$bar"}
bash -vxc 'echo "$#, " "$@"' "dummy" ${baz:+"$baz"}
0132129
2015/11/02(月) 14:09:15.67アドバイスありがとうございます。自分もよくそこ見ます
環境はlinuxのbashなのですが、"$@"と書いておけば
${@:+"$@"}と結果的に同じになるはずなのに
わざわざ後者のように書くのはどうしてかなと疑問に思った次第です
0133129
2015/11/02(月) 14:12:02.34有益な情報ありがとうございます
なるほど"$@"が""になってしまうことがあるためなのですね
違いを確認するためのスクリプトまで用意していただいて感謝です
おかげで長い間疑問だったことが氷解しました
/usr/bin/sensible-browserは、#!/bin/shですし
ポータビリティを十分に考えて作られているわけですね
なぜAdobeのacroreadなどでも使われているか納得できました
とっても勉強になりました
0134131
2015/11/03(火) 18:32:53.39> ポータビリティを十分に考えて作られているわけですね
/usr/bin/sensible-browser は、Debian 系で使われているスクリプトのようなので
dash で動けば十分でしょう
ポータビリティのサイトは参考になるかと貼りましたが、${1+"$@"} と違って
/usr/bin/x-www-browser ${URL:+"$URL"} の場合、関係無いかと思います
念の為 dash 等で内容がヌルの場合に、"$URL" と、 "$@" で展開の結果に違いが有る事を、強調しておきます
LANG=C PAGER='less -p "Special Parameters"' man dash
> @ Expands to the positional ...略... If there
> are no positional parameters, the expansion of @ generates
> zero arguments, even when @ is double-quoted.
0135名無しさん@お腹いっぱい。
2015/11/04(水) 10:19:47.91例えばダブルクリックした時点で1.shが動いて〜10秒後に2.shを動かして〜というような感じにしたいです。
お力貸していただけると幸いです。
0136名無しさん@お腹いっぱい。
2015/11/04(水) 12:50:56.08最初に/data/local/tmpあたりに転送して、chmodして、それをwait含めて実機で実行するのが
良いんじゃないの。
何をやりたいのか書いてないのでアレだが、操作する側で10秒開けるのか、実機で10秒ウェイトするのか。
あと、なぜ10秒あける必要があるのか、10秒後までに実行した端末で何が起きているのか、
その判定は必要なのか、などを考える必要があるし、
さらには泥のことをよく理解できてないオッサンたちが、こういう話題は、ここではスレチじゃね?
と煽ってくるので、飛来するオッサンたちを黙らせる技術も必要とされる
0137名無しさん@お腹いっぱい。
2015/11/04(水) 13:12:49.86現在はwindowsでbatファイルを利用してuwscというフリーソフトを使って1.batを起動させて〜10秒後に2.batといった具合にやってます。
最近linuxでも開発を始めたいと思い同じようなことがしたいです。
シェルスクリプトでwindowsでやってるuwscのような制御ができないかなぁと思って質問させていただきました。
そんなめんどくさいことするよりlinuxならこのフリーソフト使って制御しとけみたいなのがあれば
教えていだだけると幸いです。
0138名無しさん@お腹いっぱい。
2015/11/04(水) 13:15:27.82この10秒後に、という処理自体をbatでやればいいんじゃないの?
なぜuwscを挟む必要があるの?
0139名無しさん@お腹いっぱい。
2015/11/04(水) 13:29:28.23独学でやってるうえに無知な状態からまだ2ヶ月くらいしか経ってないものでこのスレのレベルの方からしたら程度が低い質問かもしれませんが他に聞けるような環境がないもので;;
0140名無しさん@お腹いっぱい。
2015/11/04(水) 13:33:00.98ちなみにゲームの自動制御とか、その手の話だったら俺は降りる
0141飛来したオバハン
2015/11/04(水) 13:33:27.010142名無しさん@お腹いっぱい。
2015/11/04(水) 17:24:19.98例えばカレントディレクトリのスクリプトは、
./script.sh
で起動出来る
ダブルクリックで起動するには、 .desktop ファイル作る
#!/bin/sh
./1.sh
sleep 10
../2.sh
/home/username/bin/3.sh
PATH="/home/username/bin:$PATH"
4.sh
PATH=".:$PATH"
1.sh
0143名無しさん@お腹いっぱい。
2015/11/04(水) 17:24:50.70それをアプリから起動するなら、GScript Lite とか使うんや。よー知らんけど
#!/system/bin/sh
./1.sh
sleep 10
./2.sh
ついで
@echo off
call 1.bat
ping localhost -n 11 > nul
call 2.bat
0144名無しさん@お腹いっぱい。
2015/11/04(水) 21:13:41.29やっぱりlinuxのほうが軽くて動作も安定してる感じなのでこれからはlinux中心にデバッグを行っていけたらと思います。
0145名無しさん@お腹いっぱい。
2015/11/08(日) 19:54:14.49raspbianだとTABに置き換わってるんだけど
Sientific Linuxだと\tのままなんだけど何でかわかる?
シェルスクリプトをそのまま持っていって実行したら
そんな感じになってた・・・
0146名無しさん@お腹いっぱい。
2015/11/08(日) 20:08:08.87echo の違いではない?
man dash
echo [-n] args...
If any of the following sequences of characters is encountered
during output, the sequence is not output. Instead, the specified
action is performed:
man bash
echo [-neE] [arg ...]
-e オプションを指定した場合、以下に示す、バックスラッシュの
エスケープ文字が解釈されるようになります。
0147名無しさん@お腹いっぱい。
2015/11/08(日) 20:14:18.70訂正
0148名無しさん@お腹いっぱい。
2015/11/08(日) 20:37:50.28確か実装したときにecho -eオプションは使っていたのですが
raspbianの/bin/shで実行すると
echo -e "test\ttest"
が
-e test test
になってしまっていろいろ試した挙句
-eいらないじゃんってことになったのを思い出しました
今は双方とも/bin/shを使っているのですが
上記のようになるのはraspbianの/bin/shだけで
/bin/bashを使うと双方とも期待したとおりの結果になりました
どこかのデストリのいずれかのシェルが
実は利用者が意識してるもの(パスが示すもの)と違うというのを
見た覚えがあるのですがraspbianの/bin/shだったかは思い出せません
継続して調べてみますが取り急ぎありがとうございました
0149名無しさん@お腹いっぱい。
2015/11/08(日) 22:14:22.18printf 'TAB\tTAB\n'
# 少なくとも dash/bash/zsh では printf は shell の builtin function
そういや、ファイルの中に
-n
だけの行があって、
cat hoge.txt | while IFS= read str
do
echo "$str"
done
ってしたらその行が出力されなくてハマったことがあった…
0150名無しさん@お腹いっぱい。
2015/11/09(月) 12:53:41.77どうやって回避したの?参考までに知りたい
0151名無しさん@お腹いっぱい。
2015/11/09(月) 18:25:32.860152名無しさん@お腹いっぱい。
2015/11/09(月) 22:29:31.56移植性重視ならprintf安定
とorilyに書いてあった
0153名無しさん@お腹いっぱい。
2015/11/11(水) 18:21:45.18単にファイル名にスペースが入っていただけだった
風俗行って頭をすっきりしてます
0154名無しさん@お腹いっぱい。
2015/11/11(水) 19:33:08.210155名無しさん@お腹いっぱい。
2015/11/12(木) 14:52:38.27今シェルスクリプトを作ってテキストファイルに書かれてある
URLからファイルをダウンロードしています
早くダウンロードしたいため多重(多重度は回線の帯域などを考慮して3〜15で任意で設定)で
ダウンロードしていますが全体の終了時間を早めたいため
ファイルサイズでソートして大きいファイルからダウンロードしています
ただこの方法だと初めの方に大きいファイルばかりダウンロードするため
成果が上がってるように見えません
またもっと効率のよい方法があるのではとも思っています
お勧めのダウンロード順(を求めるアルゴリズム)があれば教えてください
なおちょっとしたシェルスクリプトは書いていますが
やってることは以下のコマンドと大差はありません
xargs -P 10 -n 1 wget -nv -c < downlist.txt
私のほうで考えられるのはたとえば10多重の場合
大きいものからを5多重で
小さいものからを5多重で
順にダウンロードすることくらいでした
でもこの方法だと全体のダウンロード完了が
遅くなる可能性があると思います
0156名無しさん@お腹いっぱい。
2015/11/12(木) 15:11:44.910157名無しさん@お腹いっぱい。
2015/11/12(木) 15:27:23.69大きなファイルは時間がかかるので
複数ファイルを多重でダウンロードしても
最長時間になる可能性があるためです
たとえば100MB、50MB、40MB、30MB、10MBのファイルを2多重でダウンロードするとき
以下のようにすればそれぞれ平均化されるため
1つめ:100MB→10MB
2つめ:50MB→40MB→30MB
なお以下のようになるのは最悪なパターンだと思います。
1つめ:100MB→50MB
2つめ:40MB→30MB→10MB
全体の終了時間が短くなる想定です
また当然ダウンロード速度は一定ではないため
特定のファイルに時間がかかった場合
小さなサイズのファイルだと調整がしやすいというのもあります
1つめ:100MB→30MB→10MB
2つめ:50MB(時間がかかった)→40MB
実際はスクリプト内でpsコマンドで多重度は監視しており
whileでループしながらダウンロードしているため
そのあたりの調整は楽にやれます
0158名無しさん@お腹いっぱい。
2015/11/12(木) 15:28:52.53この大きなファイルのダウンロードを最初からスタートさせれば
全体ダウンロード時間はこのファイルのダウンロード時間になるけど、
この大きなファイルのダウンロード開始を遅らせると
全体ダウンロード時間もそれだけ長くなることになるってことだよね
0159名無しさん@お腹いっぱい。
2015/11/12(木) 15:31:56.60そのとおりです
(大きなファイルはクリティカルパスになりえるってことです)
0160名無しさん@お腹いっぱい。
2015/11/12(木) 16:43:29.68> ただこの方法だと初めの方に大きいファイルばかりダウンロードするため
> 成果が上がってるように見えません
この場合の成果とはより短い時間で完了することであるわけだが
大きいファイルを先に転送すると短い時間で済む筈だったが実際には逆で
より長い時間掛かってしまうから何とかしたい、ということですか?
0161名無しさん@お腹いっぱい。
2015/11/12(木) 17:51:07.33大きいファイルが先だとはじめはなかなか進まないってことじゃないかな。
どんなコマンドでダウンロードしてるか知らないけど、
たいてい転送バイト数を出力できるはずだから、
頑張って出力を解析して計算すればいいかと。
あるいは手元のファイルサイズを監視したほうが早いか。
0162名無しさん@お腹いっぱい。
2015/11/12(木) 17:59:30.650163名無しさん@お腹いっぱい。
2015/11/12(木) 18:33:07.59その時、残りのファイルのダウンロード順はまだ決めない。
その10個のwgetのうち、どれか先に終了したもの(ファイルサイズ最小のもののことが多いがネット環境によりそうとは限らない)
について、その時点で残りのファイルのうちサイズ最大のものを割り当てて
ダウンロードさせる。
以下、残りファイルがなくなるまで繰り返し。
0164名無しさん@お腹いっぱい。
2015/11/12(木) 20:25:10.34ダウンロード時間があらかじめ分かっていたとしてもとても難しい問題。
数学苦手なのでテキトーに聞き流してもらえると助かるが、多分 NP hard って呼ばれる問題と
同等で、全通り試さないと厳密解は得られないんじゃね?
現実的には >>163 の言う貪欲法(greedy algorithm)的な?アルゴリズムが一番だろうな。
0165名無しさん@お腹いっぱい。
2015/11/12(木) 22:52:33.75自分側のバンド使い切っていないかとか、もっと条件詰めないと
そもそも議論出来ない気がするけど。
0166名無しさん@お腹いっぱい。
2015/11/13(金) 02:37:34.170167名無しさん@お腹いっぱい。
2015/11/13(金) 02:48:29.590168名無しさん@お腹いっぱい。
2015/11/13(金) 12:04:00.880169名無しさん@お腹いっぱい。
2015/11/13(金) 12:06:28.520170名無しさん@お腹いっぱい。
2015/11/13(金) 23:16:03.310171名無しさん@お腹いっぱい。
2015/11/14(土) 00:11:59.240172名無しさん@お腹いっぱい。
2015/11/14(土) 00:39:23.96ファイルを分割してダウンロードすればいい
0173名無しさん@お腹いっぱい。
2015/11/15(日) 12:35:05.13異常だったらtcp二階建てとかしてない限りロストしてるんだから
どんどん長くなるタイムアウトをボケっと待ってたって仕方がないじゃん
むしろ定期的に試行するようにしたほうが復旧を即感知できるんじゃないか?
0174名無しさん@お腹いっぱい。
2015/11/19(木) 07:18:13.65実行するのですが、許可がないとはねられます。パスワードを入力しろ、も出て
きません。
実行者はもちろん、visudoでUSER ALL=(ALL) ALLの権限を与えられています。
$sudo echo "abc" >> /path/a.txt
bash: /path/a.txt: 許可がありません
何が問題なのでしょうか?
0175名無しさん@お腹いっぱい。
2015/11/19(木) 07:28:16.93sudo sh -c 'echo "abc" >> /path/a.txt'
0176名無しさん@お腹いっぱい。
2015/11/19(木) 07:30:35.56ぐぐったら答え書いてありました。失礼しました。
最初のechoだけsudoで評価されて、リダイレクトはそうじゃないと。
0177名無しさん@お腹いっぱい。
2015/11/19(木) 09:35:05.07さんくすです。なるほど。
ググり先を参考に、evalを使いました。
また、引数が複数の場合も含めて、スクリプトにしました。
パイプを使わない分、>>175 さんのほうがスマートですね。
for i in "$@"; do
eval echo $"$i" | sudo tee -a /path/a.txt
done
0178名無しさん@お腹いっぱい。
2015/11/19(木) 09:36:39.66>ググり先を参考に、evalを使いました。
evalじゃなくて、teeだった。すんません
■ このスレッドは過去ログ倉庫に格納されています