シェルスクリプト総合 その21
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/11/15(木) 18:57:33.11□お約束
・特記なき場合は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.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0764名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANなんか実行結果をファイルっぽく扱う技があったやろ
アレ使え
0765名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANすごい!
代入文自体を文字列として返して
実際の代入はフォアグラウンドのシェル側にevalさせるのね。
0766名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0767名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0768名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANない
0769名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0770名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANちょっと違うな
恐れはあるが、恐れる理由が無い
分断されてもなにも困らないから
0771名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANなんかすごい新しいノウハウ。
>>749 がつまらんトボケたこと書き込んでるけどw
これからも "詳しい方"のみ回答をお願いしますね
0772名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0773名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0774745
2013/07/12(金) NY:AN:NY.AN私が元々の質問者ですが、違う方が催促もしてくれているようでw
別の言語も考えたのですが別の言語を使う能力がないのと
引き継いだものをできるだけ生かしたいと思いました。
(シェルもそもそも出来ません・・・)
たくさんのアドバイスをいただきましたが
ぱっと見では分からないので動かしてみてから、また書きます。
0775名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN試しに勉強してみなよ。シェルで無理するより楽かもよ。
0776745
2013/07/12(金) NY:AN:NY.ANお二人のアドバイス、両方ともやりたい事が出来ました。
どうもありがとうございました。
>>775
以前cとjavaは少し勉強した事があるのですが
ポインタでつまずき、オブジェクト指向でつまずきました。
プログラミングが専門ではないので許して下さい・・・
0778745
2013/07/12(金) NY:AN:NY.ANリトライとかタイムアウトでメッセージを出す仕組みってありますか?
1:****
2:****
・・・
のようなかたちの出力にして結果が得られたかを検証して
抜けているのがあれば手動でそれだけやりなおします。
止まった場合は、ctrl+cですw
0779名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANPerlとかRubyでいいじゃん。
ポインタ知らんでもそれなりに使えるよ。
0780名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANこのスレのやりとりは、横で見てるだけでもけっこう参考になる
0781名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0782名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.ANperlとrubyもhello worldと少しは勉強しました。。
どうもその先が理解出来ず挫折するようです。
逆になんで理解できるんですか!?
linuxにはいろいろツールがそろっているし、ファイルも楽ちん
manとかネットが充実してるからついついシェルでやっています。
ネックは速度くらいですかね。
javaとかでさくっと書けたらかっこいいだろうなと思いつつ。。
0783名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0784名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0785名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN他の言語を覚えるのに身が入らないのは。
シェルも皆さんほどには理解出来ていないですけど。
学生のころfortran(当時はこれしか知らなかった)で文字処理しようとしてあきらめ
シェル(grep、sed)でやって便利さに気づきました。
0786名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0787名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN0788名無しさん@お腹いっぱい。
2013/07/12(金) NY:AN:NY.AN野良電波が出ていないか定期的にチェックして、野良が出現したら
暗号化なしで繋ぎに行き、即VPNセッション張って暗号化させて、
完了したらルータのあんま使わないLEDを点灯させるスクリプトを走らせてる。
0789名無しさん@お腹いっぱい。
2013/07/13(土) NY:AN:NY.AN0790名無しさん@お腹いっぱい。
2013/07/13(土) NY:AN:NY.AN0791名無しさん@お腹いっぱい。
2013/07/28(日) NY:AN:NY.ANLinuxを始めたばかりで、無謀にもソースからのアプリコンパイルにチャレンジしており
シェルスクリプトのエラーに悩まされています。
/opt/bitnami/common/build-1/libtool: 3215: /opt/bitnami/common/build-1/libtool:
install_prog+=install: not found
/opt/bitnami/common/build-1/libtool: 3235: /opt/bitnami/common/build-1/libtool:
files+=mod_dav_svn.la: not found
この「install_prog+=」「files+=」という箇所をエディタで探して「+=」を「=」に書き換えると
エラーなく通るようになります。
後続で別のエラーが出て結局止まるのですが、それはまた別の話としまして
このnof foundという表示はどういう意味で、どう対処すべきなのでしょうか。
0792名無しさん@お腹いっぱい。
2013/07/28(日) NY:AN:NY.ANshの実体がdashとかashになっていて+=理解しないんじゃない?
bashで実行してみれば?
0793名無しさん@お腹いっぱい。
2013/07/28(日) NY:AN:NY.AN/binディレクトリを見てみたら、sh -> dash*
とリンクが張られていました。Ubuntuはdashが標準なんですね。
スクリプト先頭の /bin/sh を、/bin/bash に変更したら通りました。
一週間苦しんだのであっけなく解決して魂が抜けましたが、これも勉強ですね。
0794名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.ANまぁ、そうなんだけど、bashのつもりでshとスクリプトに書く方が悪いと思う。
そのアプリのメンテナにバグレポートを送ってもよいと思う。
0795名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN↓で聞けばいいよ。
くだらねえ質問はここに書き込め! Part 206
http://engawa.2ch.net/test/read.cgi/linux/1370948130/
0796名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0797名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN円満に終わった話を蒸し返そうとする>>795がアホなだけ
0798名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0799名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0800名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN一部のバカのレスをスレ全体の傾向に敷衍するのは、荒らすのが目的ですか?
0801名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0802名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0803名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN0804名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.AN雰囲気悪くするだけだ。
0805名無しさん@お腹いっぱい。
2013/07/29(月) NY:AN:NY.ANクライアンス運用ならdashのが劣っている点はなんですか?
0806名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.AN0807名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.AN0808名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.ANサルでも分かるような回答を強く期待します
0809名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.ANについてどう思いますか?
要は本に載ってたサンプルに
eval echo $"$VAR2"
というのがあって bash では動かないという話ですが
クォートすればいいのにしないというのは
普通のことだったんでしょうか。
0810名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.AN0811名無しさん@お腹いっぱい。
2013/07/30(火) NY:AN:NY.ANこれは warning 出せるかも。
いや、bash ではどうすんだ?
0812名無しさん@お腹いっぱい。
2013/07/31(水) NY:AN:NY.ANLinuxは0xnで改行、BSDは0xrで改行しますよね。
どうしてこういう違いができたんでしょう?
シェルで簡単に返還する方法はありますか?
0813名無しさん@お腹いっぱい。
2013/07/31(水) NY:AN:NY.ANN・K・F! N・K・F!
0814名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN> LinuxとBSDで開業コード違いますよね。
違いません
だから変換する方法も必要ないです
0815名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0816名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0817名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.ANFreeBSD 最新安定版リリース 9.1 / 2012年12月31日
NetBSD 最新安定版リリース 6.1 / 2013年5月18日
OpenBSD 最新安定版リリース 5.2 / 2012年11月1日
0818名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.ANNECの家庭用ルータは全部BSD系。
シリアルケーブル繋ぐとメッセージも出る。
Sat Jan 1 00:00:05 JST 2011
NetBSD/messimips (Amnesiac) (console)
login:
IPL:HARD-RESET
memory test ... ok
flinstall OK
boot version: 1.0.0
PKG "Sky-ST"
CPU "Atheros/AR9341"
Revision 12.1 CLOCK 535.0 MHz
HEAP MEMORY 262144 bytes
Boot:InitFilesystem
phy1.0: "Atheros/AR934x(SW)"
phy1.4: "Atheros/AR934x(phy)"
active ch:1
post start
DRAM Test ..... PASS
Timer test .... PASS
FLASH CHKSUM .. PASS
LAN Test .....
LoopBack count 0 ..
0819名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN温かい目で見守りたくなる
0820名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0821名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0822名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0823名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.ANそれならWinとMac以外みんな死滅してるでいいんじゃね
お前の中ではな
0824名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0825名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0826名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN0827名無しさん@お腹いっぱい。
2013/08/01(木) NY:AN:NY.AN$ cat -e -v /etc/rc.common | head -3
##$
# Common setup for startup scripts.$
##$
0828名無しさん@お腹いっぱい。
2013/08/05(月) NY:AN:NY.AN> 智花のbash <
 ̄Y^Y^Y^Y^Y^Y^ ̄
0829名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN---- tmp.sh -----
#!/bin/bash
mediainfo --Inform="Video;%Width%" tmp.wmv
---- ここまで ---
は期待と通りに動作するのですが、
---- tmp1.sh -------
#!/bin/bash
_C="mediainfo --Inform='Video;%Width%'"
${_C} tmp.wmv
---- ここまで ----
だとInformオプションが無視されます。
シングル・ダブルクオートの入れ替え、;や%をエスケープなど試行錯誤したのですが、
変数に格納してからmediainfoを使うと、Informオプションは無視されます。
0830名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN"${_C}" tmp.wmv
0831名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN0832名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN勝手に成りすまさないで。
>>830
コマンド+オプションを変数に格納して、
変数をダブルクオートで囲むと、
command not found
になるよ。
------ tmp2.sh ------
#!/bin/bash
_C="ls -l"
"${_C}" hoge.txt
------ ここまで ----
$ bash tmp2.sh
tmp2.sh: 行 4: ls -l: コマンドが見つかりません
0833名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.ANeval "${_C}" tmp.wmv
0834名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN解決しました。ありがとうございました。
evalは今まで避けてきましたが、これを機会に勉強します。
0835名無しさん@お腹いっぱい。
2013/08/07(水) NY:AN:NY.AN0836名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.ANクライアング運用ならashのが劣っている点はなんですか?
0837名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0838名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0839名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0840名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0841名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0842名無しさん@お腹いっぱい。
2013/08/08(木) NY:AN:NY.AN0843名無しさん@お腹いっぱい。
2013/08/18(日) NY:AN:NY.ANruby command not foundになってしまいます。
ログインシェルじゃないから.bashrcが読み込まれていないのが原因だと思いますがsourceで読み込んでみたり、bash -l -cなども試しましたがやはり読み込んでくれません
どこで質問したらいいかもわからず、もしすれ違いなら誘導して頂けると嬉しいです
0844名無しさん@お腹いっぱい。
2013/08/19(月) NY:AN:NY.ANまあ、個人設定に依存するものをシステムワイドな環境で実行できるようにするのは
セキュリティホールなので、できたとしてもやらない方がいいと思うけど。
# ruby を実行させるコマンドだったはずなのに後でユーザが破壊的な処理をする
# スクリプトに置き替えたら、システムの権限で動いてしまう。
# postfix なら root では実行されないのでまだマシだけど。
0845名無しさん@お腹いっぱい。
2013/08/19(月) NY:AN:NY.ANこれ使えば、楽なんだけど
0846名無しさん@お腹いっぱい。
2013/08/19(月) NY:AN:NY.ANsendmailでやってたのずいぶん昔の話だから覚えてないや。
0847名無しさん@お腹いっぱい。
2013/08/20(火) NY:AN:NY.ANhttp://www.postfix.org/postconf.5.html#local_command_shell
0848名無しさん@お腹いっぱい。
2013/08/20(火) NY:AN:NY.ANPostfix(8)
http://toro.2ch.net/test/read.cgi/unix/1227953898/
0849名無しさん@お腹いっぱい。
2013/08/20(火) NY:AN:NY.AN「pipeを使って」とは http://www.kobitosan.net/postfix/trans-2.2/jhtml/pipe.8.html
これのこと?
そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンドとして指定してるということ?
だとしたら rbenv で、どれかのrubyを選択しているときのシェルの環境変数を調べて、
postfixのpipeで実行しているシェルスクリプトの最初で同じになるように設定すれば、なんとかならないかな?
0850843
2013/08/20(火) NY:AN:NY.AN0851名無しさん@お腹いっぱい。
2013/08/27(火) NY:AN:NY.AN各々のファイル名を取得してそのファイル自身にファイル名を書き込むというか追加していく
というシェルスクリプト教えて下さい!
0852名無しさん@お腹いっぱい。
2013/08/27(火) NY:AN:NY.AN学校の宿題っぽいな。
テキストファイルの拡張子がtxtだったとすると、
ワンライナーで、
$ for t in *.txt; do echo $t >> $t; done
でいけると思うが、宿題でなければこれで解決だろ。
0853名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.AN宿題ではないですが超初心者です。
テキストファイルなんですが拡張子が付いてないので
試しに.txt拡張子追加してから
$ for t in *.txt; do echo $t >> $t; done
をtest.shという名前で保存して
テキストファイルがあるフォルダに放り込んでchmod +xしてから
実行しました。エラーもなく終わるんですが、どこにもファイル名が追加
されてないようです。
0854名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.ANbash test.shしてみなさい
0855名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.ANありがとうございます!
0856名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.ANということは、もしかしてtest.shを実行するつもりで
$ test
ってやりました?
0857名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.ANなぁ?
0858名無しさん@お腹いっぱい。
2013/08/28(水) NY:AN:NY.ANそれに気づいて改行コード直したら、今度は
>>852さんの
$ for t in *.txt; do echo $t >> $t; done
をそのまんまコピペして行頭の$を取るの忘れてsyntax error出ました。
それでやっと$取り忘れたの気がついて動きました、お手数かけてすみませんでした。
0859名無しさん@お腹いっぱい。
2013/09/04(水) 02:17:02.05でもブロックデバイスでしか動作しないソフトがある・・・てことで、
/dev/disk/by-idやmultipath -lのようなコマンドでメジャー/マイナー番号を引き、
mknodで固定的なデバイスを作成する
・・・みたいなことをシェルで実装したいのですが可能なものですか?
0860名無しさん@お腹いっぱい。
2013/09/04(水) 03:37:09.690861名無しさん@お腹いっぱい。
2013/09/04(水) 07:11:59.18変な小細工せずに、/etc/udev/rules.d/??-persistent.rules で設定して
SCSIデバイス固定にするのが筋だろ。
0862名無しさん@お腹いっぱい。
2013/09/06(金) 19:49:14.08で出てくる条件で固有のものをさがして
ATTRS{model}=="FD-05PUQ",MODE="0666",SYMLINK+="fd0"
って感じでrulesに書くんだけどね。
一行のうち"=="が条件文で"="や"+="が実行文
0863名無しさん@お腹いっぱい。
2013/09/08(日) 18:32:55.58src以下と同じフォルダ構成をlinkフォルダ以下に作成し
src以下にある全ファイルのシンボリックリンクをlink以下の同じフォルダの場所に作成したいです。
そこに、src2以下も同様にシンボリックリンクを作成し、linkフォルダ以下ではsrcとsrc2がマージされた状態としたいです。
また、シンボリックリンクのリンク先は絶対パスではなく相対パスで設定しておきたいです(myrootフォルダごと移動しても動くようにするため)
srcとsrc2には、同じファイル名のファイルが入っていることはありません。
どんなスクリプトでできるでしょうか?
現在:
myroot/
link/
src/
a.txt
f1/
b.txt
f2/
f3/
c.txt
src2/
f2/
d.txt
■ このスレッドは過去ログ倉庫に格納されています