1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
151 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:55:23.20 ] cat file | コマンド の順に書きたいというだけの理由なら、 < file コマンド と書けば良い。
152 名前:143 mailto:sage [2012/01/21(土) 09:25:54.14 ] >>146 凄く参考になった。ありがとう > バッククォートを使う古い形式の置換を用いたとき、バックスラッシュは文字通りの意味を保ちます > が、 $, `, \ の前にある場合は例外となります。バックスラッシュが前置されていないバッククォートが > あると、そこでコマンド置換は閉じられます。 $(command) という形式を用いたときは、括弧の間にある > 全ての文字がコマンドとなります。特別扱いされる文字はありません。 `cmd`と$(cmd)の2つの形式で意味(処理?)が違うなんて知らなかった > コマンド置換は入れ子にできます。バッククォート形式の時に入れ子を行うには、 > 内側のバッククォートをバックスラッシュでエスケープします。 入れ子にするときは2つの形式を組み合わせて書いてたから、これも気が付かなかった 特殊扱いの文字が$(cmd)形式ではないなら、cmdの中に)がある場合\でエスケープはできないってことか >>147 評価回数について、ありがとう。最小3つ並べる必要があるのか cat使っているのは、前処理があってパイプを使っているという意思表示 ときどきシーク可能か否かで挙動が変わるプログラムもありますし
153 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:01:25.74 ] >>147 > $( )使っちゃ駄目よ。 爺さんや、Solarisでも/bin/shはkshになりましたよ。 というわけでもういいんじゃないか。テンプレもそろそろ修正どき。
154 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:17:31.18 ] >>151 正直、その書き方は知らなかった。
155 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:26:19.10 ] >>148 同じ様な経験から自分と似たような対処している全然知らない人の存在を知ると、何か和むなぁ
156 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 10:28:50.43 ] $( )を使わないのは大手SIerじゃ常識だね。
157 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 11:57:08.26 ] >>148 なんかずれてる気がする
158 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 12:16:06.97 ] >>148 tar xvf と tar cvf を間違えたって話か? ふつーあらかじめ chmod -w hoge.tar やっておくから消すことはありえない。
159 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 12:33:47.90 ] sudo tar cvf 〜 なんてしちゃったり
160 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:25:25.15 ] ftpmailで取得してた20年前じゃあるまいし、tarなんか消しちゃっても全然問題ないだろ。
161 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:29:30.84 ] tar cvf aaa.tar bbb ccc とやろうとして tar cvf bbb ccc とかやって、bbbを消しちゃったってことかな
162 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 13:32:21.94 ] あぁ、もともとのきっかけは20年前か… ftpmailあり得るな。
163 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 14:11:25.85 ] >>161 >>146 では「ファイルを読む際には必ずcatで読む」て言ってるから、 tar xvf の時の話かと。
164 名前:148 mailto:sage [2012/01/21(土) 23:40:04.95 ] >>158 > tar xvf と tar cvf を間違えたって話か? それそれ。
165 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 00:51:01.40 ] 俺も先頭にcat付ける派。 cat foo | cmd1 で、cmd1の前に前処理やりたくなった時、 cat foo | cmd0 | cmd1 と書き換え簡単。 cmd1 fooをcmd0 foo | cmd1にするのは語順置き換えがある。 transpose-wordするのは空白入り"文字列やオプション指定があるとちょっと面倒。 ファイル名をひとつしか指定できないバカコマンドで、 2つ指定したくなった時にイラっとくるから、などの理由。
166 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 01:25:14.86 ] 俺はcatつけないな。後段のコマンドにもよるけど、 ファイルがないなどのエラーを捕捉し損ねる可能性があるから。
167 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 06:46:04.29 ] むかし、cat foo | sed をここで書いて叩かれた思い出。
168 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 08:04:14.62 ] >>165 は >>151 読んでないだろw cat foo | cmd1 ではなく、 < foo cmd1 とする。(いつもこう書く癖を付けておく) で、cmd1の前に前処理やりたくなった時、 < foo cmd1 | cmd2 と書き換え簡単。 以上で、catを無駄に使う理由がなくなる。
169 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 09:05:11.75 ] scshっていうシェル思い出しわ (| (< foo cmd1) cmd2) とかって書くやつ
170 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:15:08.87 ] >>168 流れが一方向ではないので理解しづらい。 そもそも<禁止ルールがある場合もある。
171 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:19:18.34 ] > <禁止ルール 俺ルールでは禁止って後だしで言われてもなあ。 w
172 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 10:30:20.87 ] >>170 良く見ろ。流れは一方向だぞ。 流れを一方向にするために、 com1 < file | com2 を < file com1 | com2 と並べ変えたんだが。>>170 は良く読んでなさそうだなw
173 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:00:43.73 ] 知識の浅い上司に、直されることはある。 初心者でも読めるように cat から始めろ。 実績がないから cat から始めろ。 俺流を通す無能な上司を説得する方法も教えろください。
174 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:05:03.14 ] >>168 > で、cmd1の前に前処理やりたくなった時、 > < foo cmd1 | cmd2 逆じゃね?
175 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:16:14.22 ] 後付けで無能な上司という制約条件だされてもなあ。そんなとこ辞めれば? w
176 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:16:49.44 ] >>174 で、cmd1の前に前処理やりたくなった時、 < foo cmd0 | cmd1 かな
177 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:22:49.70 ] いや、後付けじゃなくて便乗なんだけどね…
178 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:30:36.38 ] catなんてあんたのような無能かつ無用な上司。そんなプロセスは必要ないでしょ。
179 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:38:12.78 ] kill -9 >>178 > /dev/null 2>&1
180 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 11:43:57.77 ] 何でもいいけど 引用レスの最初に入力リダイレクト書くと顔文字みたい > <
181 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:11:08.98 ] >>179 2>&1とか使うくらいならcshでやれよ頭固いなあ
182 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:15:52.47 ] >>181 だって、無能上司の部下だもの。
183 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:19:51.88 ] cat >>181 | tee -a 2ch.net 2> /dev/null
184 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 12:29:22.98 ] じゃあ俺はcatじゃなくてdog使うわ
185 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:05:48.18 ] cshを使わないのは大手SIerじゃ常識だね。
186 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:16:17.54 ] >>168 < foo cmd1は使えない。 !<でも !cmd1 でもhistoryを呼び出せない。
187 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:21:03.72 ] >>186 シェルスクリプトでhistoryを使う馬鹿?
188 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 13:41:56.10 ] >>186 全力で己の無能を告白するなよ。ドMの新しいプレーか? www !?cmd1 で呼び出せるだろ。
189 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:22:29.46 ] cat使うと複数でも処理対象がハッキリするから好きな書き方ではある。冗長だけどね リダイレクトじゃ複数は無理だし、多く引数を取るコマンド、特に入出力のファイル名を どちらも引数に取れるコマンドだと、入力だけ区別して分けられる
190 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:45:03.84 ] テキストファイルだけ扱うならいいけどバイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。
191 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:47:00.85 ] 読み取る側から見た場合、リダイレクトならシーク可能だけど パイプはそうではないという違いもあるよね つまりcatが単に冗長で資源の無駄、というだけでなく 単純にcatではダメなケース(あるいは非常に非効率になるケース)が 厳然としてあるわけで、>>173 の上司にはその点を訴えてみたらどうだろうか stdout/stderrを何かに保存する目的でいずれにせよリダイレクトは使うだろうし パイプのほうがリダイレクトより「初心者でも読める」というのは意味不明だ なんかほんの少しでも合理的な理由があるのだろうか?
192 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 14:51:57.61 ] >>189 バカな習慣を必死に言い訳すんなよ。羞恥プレー続行中か? w 複数ファイルを引数に取るのはどうすんだよ。 for f in $files ; cat $f |file -;done こうか? スゲーぜ。 www
193 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 15:31:48.18 ] >>192 fileは普通標準入力から読み込ませることはしないだろ?シェルスクリプトで使うこと前提だぞ、スレ的に
194 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 15:36:47.44 ] >>190 何それ? 分割したバイナリを合体させるのに普通にcat使えるでしょ catってfile結合コマンドだよ
195 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:05:46.12 ] >>191 ありがとう。 機会ができたら、訴えてみる。 「初心者でも」っていうのは、ちょっとニュアンスが伝えにくいんだけど…気にしないで大丈夫です。 展開の順序とか考えず、コマンドを並べるならなんでもかんでもパイプを通せばいいじゃんって 新人とかへ教えるのが楽だから、そういう(ローカルな)文化になってるのかも。
196 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:13:11.56 ] >>193 「ヒストリー使えないからダメ」とか言い出したのはやっぱり羞恥プレーか? まあ、それは置いとくとして、「入力ファイルを区別できるからからcatして パイプから流し込む」と言い出したバカをからかってるだけだよ。 入力ファイルは引数から渡した方が、 1 名前を渡せる。 2 シークも可能。 と、明らかに有利。 catはその名の通りファイルを結合する場合に使用する。 恥さらしな習慣の見苦しい言い訳まだ続ける?
197 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 16:59:14.69 ] 世の中には、cat = catalog の略といわれて、からかわれてるのに気付かず信じるような 僕みたいなのもいるのですよ。 concatenate なんて…
198 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:13:08.18 ] >>191 リダイレクトってシーク可能だったのか、知らなかった。 でもシークできるかできないかで挙動を変えるのはプログラム側だよね? プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある? シーク前提のプログラムはそもそも標準入力から読み込もうとしないんじゃないかな。
199 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:37:41.83 ] 見苦しい言い訳をまだ続けるのか。 > プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある? お前のようなボンクラは知らないだろうが、必要ならばしている。
200 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 17:52:16.93 ] >>198 fstat()で簡単に判断できるから、まともなプログラムならシーク可能かどうかは 「標準入力かどうか」ではなく、stat情報で判断する ロジック的に1パス、シークエンシャルアクセスで行ける場合でも、 wavみたいなある程度でかいバイナリストリームを処理するソフトウエアでは 不要なチャンクをシークで飛ばせるかread()が必要かでは大違いなので 特にマルチメディア系ではシークが使える場合には使うのが普通 (そうしたプログラムがパイプで標準入力を利用可能なのも普通)
201 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 18:45:46.67 ] >>198 ざっとbinutils、grep、awk、sedのソース漁ってみてが、無いな
202 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 18:50:17.20 ] >>201 ボンクラがメクラ撃ちしたって当たらないって事の証明だな。 オレは一発でtailを見つけたが。w lessもおそらくやってる。
203 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 19:00:26.75 ] wc -c 1GB_file # 一瞬 < 1GB_file wc -c # 一瞬 cat 1GB_file | wc -c # 時間かかる
204 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 19:51:25.77 ] >>203 これは俺にとって cat やめる理由になるな。 逆に言えばここまで出てきた書き込み程度ではあまり cat やめる気がしない。 でも何故だろうな。wc はソースしっかり読んだのに気が付かなかったなあ。
205 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 20:02:12.51 ] 色んなシステムの様々なシェルスクリプトで共通的に関数を使いたいときって、どういう方法が 効率がよいだろう ・.profileとかで共通関数を定義する ・共通関数だけのスクリプトを作ってセットで使う ・がんばってシェルスクリプトに埋め込んでいく 他にある?
206 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 20:10:17.98 ] >>190 > バイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。 どこのcat?
207 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 20:11:46.67 ] >>205 ふつうはファイル別にしてsourceする。
208 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 20:12:38.04 ] >>205 その 2 番目は source で読み込むという意味でOK? . functions.sh
209 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 22:52:35.96 ] >>200 なるほどね。確かにfstatだと区別できる。とても参考になった 特に前に戻るシークしか考えてなかったから、後半はその通りだわ。酷いレベルで気付かなかった
210 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/22(日) 23:23:48.64 ] システムコールのマニュアルは全部読んどくといい。 全部読んでも大した量じゃないから。
211 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/23(月) 00:18:56.40 ] >>203 wcに似たプログラムを自分で作ったことがあるんだけど、wcの方が処理が速いわけ んでなぜwcの方が速いのかソースを調べたことがある。すげえ勉強になったよ
212 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/23(月) 01:08:55.19 ] >>207 >>208 そうさね 現状は、sourceで読み込ませてる で、今は共通関数をfunctions.shとしてマージして使ってるんだが、対象システムで 使われてない関数も一緒になってるんで、サイズが無駄に大きくなってる しゃあねえのかなぁ
213 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/23(月) 01:33:25.92 ] 適切に分割して必要な分だけ読み込ませりゃいいじゃないか。
214 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 00:19:15.61 ] シェルスクリプトの中で一行でpsql発行したいんだけどどう書けばいいかな postgresユーザに切り替えてからpsqlでselect文(time列から現在時刻の一ヶ月前からのデータだけをとる) 叩きたいんだけど TIME=1 sudo su - postgres -c 'psql -d データベース名 -c "select time from データベース名 where time > current_timestamp + '-${TIME} months';"' どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
215 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 01:28:32.12 ] sudo su - postgres -c 'psql -d データベース名 -c "select time from データベース名 where time > current_timestamp + '"'-${TIME} months';\"" かなぁ
216 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 07:25:52.83 ] postgresユーザーで実行するコマンドをスクリプトにしておいて、そのスクリプトをsuで実行すればいいだけ >>ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。 意味不明。
217 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 08:10:02.57 ] >>215 ありがとうやってみる。 >>216 別ファイル?にして呼び出すということでしょうか。すみません初心者なので
218 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 09:34:29.11 ] PGUSER=postgres PGPASSWORD=xxxx export PGUSER PGPASSWORD pgsql -d foo -A -q -c "SELECT * FROM hoge"; こんな感じでいけるんじゃないの?
219 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 10:45:42.00 ] select文の中で不等号と変数を使いたいんだ そこがわからない
220 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 11:04:18.96 ] zshの話?どこに使いたいの?
221 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 11:09:52.37 ] >>214 postgresのselect文の構文は知らないので、↓ select time from データベース名 where time > current_timestamp + '-1 months'; このselect文が正しい結果を返すと仮定して、 >どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。 この「どうにもうまくいかない」ときに、sudo su ... コマンドから どのようなエラーメッセージが出されているのかを具体的に教えください。
222 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 11:12:29.95 ] ああごめん219は218へのレスです。 bashです。
223 名前:218 mailto:sage [2012/01/24(火) 11:18:56.48 ] >>222 例えばMovableTypeへのアクセスだけど、これでいけたけど psql -d foo -A -q -c "SELECT log_id,log_created_on FROM mt_log where log_created_on > current_timestamp + '-${TIME} month';"
224 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 12:06:10.33 ] su: option requires an argument -- c Try `su --help' for more information. months > chg_date;': -c: line 0: unexpected EOF while looking for matching `''months > chg_date;': -c: line 1: syntax error: unexpected end of file
225 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 12:11:56.62 ] 上記のような感じです TIME=1 sudo su - postgres -c "psql -d データベース名 -c 'select time from テーブル 名 where current_timestamp + "-$TIME months" < time;'" 実行したのはこれです
226 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 12:17:14.76 ] >>225 ダブルクォートの中で素のダブルクォート使っちゃ駄目。 そこでクォートが終了して別引数とみなされて su 側でエラーになってる。
227 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 12:17:51.07 ] >>223 ユーザーを切り替えてからやるにはうしたらよいのでしょうかと
228 名前:218 mailto:sage [2012/01/24(火) 12:52:46.68 ] >>227 postgres(root)でデータベースの実行をしたいだけだよね? それを >>218 で書いているわけだけど、それとも私が勘違いしているのかな
229 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 13:03:41.37 ] /path/to/doit ------------------ #/bin/sh TIME=1 psql -d データベース名 -c "select time from テーブル名 where current_timestamp + '-$TIME months' < time;" ------------------ # sudo su - postgres -c /path/to/doit
230 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 13:12:38.92 ] 228さんごめんなさい 僕が勘違いしているのだと思います 教えていただいた方法でやってみます
231 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/24(火) 14:36:27.74 ] 教えていただいた方々ありがとうございました 228さんの方法で問題なくできました!
232 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/25(水) 22:21:21.41 ] total_size=`fdisk -l $device | grep Disk | awk '{print $5}'` $deviceには/dev/sdbとか このスクリプトをsudoで動かすと、total_sizeが空 rootになって実行すると、容量の数字が入ります。 どうして?
233 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/25(水) 23:47:33.70 ] PATHが通ってない。
234 名前:232 mailto:sage [2012/01/26(木) 12:25:23.62 ] >>233 PATHなの?
235 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/26(木) 12:35:38.39 ] sudoってその辺の環境変数再設定しなかったっけ
236 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/26(木) 20:01:15.66 ] >>232 sudoの中で変数に代入しても、sudoを抜けたら元のシェルの変数には入ってないよw と、ボケておこう。
237 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/26(木) 20:31:33.86 ] それボケなん?
238 名前:232 mailto:sage [2012/01/27(金) 12:23:26.54 ] >>236 sudoを抜けてないんですが
239 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/27(金) 13:27:36.89 ] やったことをもうちょい詳しく。
240 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/27(金) 15:10:58.95 ] つ total_size=`sudo fdisk -l $device | grep Disk | awk '{print $5}'`
241 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/27(金) 19:32:43.61 ] >>232 $ cat ./test.sh #!/bin/sh device=/dev/sda total_size=`fdisk -l $device | grep "Disk $device" | awk '{print $5}'` echo $total_size $ sudo ./test.sh 2> /dev/null 21474836480
242 名前:232 mailto:sage [2012/01/28(土) 21:12:44.61 ] すいません、遅くなりました ~$ cat mksd.sh #! /bin/sh device=$1 echo $device total_size=`fdisk -l $device | grep Disk | awk '{print $5}'` echo "total_size = $total_size" ~$ sudo ./mksd.sh /dev/sdb /dev/sdb total_size = ~$ su パスワード: # ./mksd.sh /dev/sdb /dev/sdb total_size = 3904897024 です
243 名前:232 mailto:sage [2012/01/29(日) 08:51:14.17 ] >>241 あれ、すいません見てませんでした ~$ cat mksd.sh #! /bin/bash device=$1 echo $device total_size=`fdisk -l $device | grep Disk | awk '{print $5}'` echo "total_size = $total_size" size=$[$total_size / 2] echo $size saito@ubuntu:~$ mksd.sh /dev/sdb mksd.sh: command not found saito@ubuntu:~$ ./mksd.sh /dev/sdb ./mksd.sh: line 9: /2: syntax error: operand expected (error token is "/2") ~$ su パスワード: # ./mksd.sh /dev/sdb /dev/sdb total_size = 3904897024 1952448512 なぜ、こうなるんでしょうか?
244 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/29(日) 09:09:10.62 ] >>243 面倒だから /proc/partitions の方使えよ。こっちならroot権限要らん。 1kバイトのブロック単位だから、1024倍な。 引数は /dev/sdaじゃなく、sdaだけで指定する。 grep/awkとか使わずに内部コマンドだけで組んでみた。 $ cat hoge.sh device=$1 while read x x blocks name && [ "$name" != "$device" ] do :; done < /proc/partitions total_size=$((blocks*1024)) $ ./hoge.sh sda 1000204886016
245 名前:243 mailto:sage [2012/01/29(日) 11:28:34.42 ] >>244 ありがとう、ございます。
246 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/29(日) 12:12:34.09 ] >>243 まだやってたんだ。 envやsetの出力差分とか見ないのか?
247 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/30(月) 08:01:56.00 ] >>242 ↓の結果を比べてみる、とか。 #! /bin/sh result=`fdisk -l /dev/sda` echo "$result"
248 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/30(月) 20:31:06.87 ] 標準入力からデータを読み込むようなbashスクリプトを書いています。 スクリプトの途中でread -s -n 1などとして画面をポーズしたいのですが、 標準入力にデータが渡されているため画面ポーズのためのreadにもそれが読み込まれてしまい、思ったように動作しません。 一旦ファイルディスクリプタの0番をクリアすれば良いのかと思うんですが、どのようにすれば実現できるでしょうか? 念のため、画面の一時停止はsleepなどでも可能なのは分かっていますが、 今回はreadで実現したいということでよろしくお願いします。
249 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/30(月) 20:35:24.72 ] >>248 read -s -n 1 < /dev/tty
250 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/30(月) 20:51:23.68 ] >>249 出来ました!こんな簡単な事だったんですね。 ついでに聞きたいんですが、一旦読み込まれた標準入力のクリアとかって無理なんでしょうか? それと/dev/ttyは移植性のある?書き方なんでしょうか。 質問ばかりですみません。
251 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/30(月) 20:56:36.52 ] >>250 exec < /dev/tty を実行すると、以降の行は標準入力が端末に戻るので read -s -n 1 だけで行けるようになる。 /dev/ttyはどのOSでも移植性がある。