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


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

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



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 で。

141 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 22:33:57.03 ]
ファイルからランダムに1行取り出すのにshufを使うのは
大手SIerじゃ5年前から常識だな

142 名前:名無しさん@お腹いっぱい。 [2012/01/20(金) 23:18:45.09 ]
shufはcoreutils 6.0(2006-08-15)からみたいだね。


143 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/20(金) 23:39:27.25 ]
改行区切りのテキストを、コマンドの引数で渡すために、コンマ区切りにしようとこう書いた
A="`cat list.txt |tr -s \\n , |head -c -1`"
でもこれだとnが,に置換される。\\nを'\n'にすればいけたけど、バッククオートの中のエスケープって何回評価されるの?

144 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 00:28:29.06 ]
つ echo "\\n"
\n

145 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 01:02:25.99 ]
ログインするシェルってどうかいたらいいんでしょうか?
ユーザーアカウント名とパスワードを自動で入れてログインしたいのですが

146 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 02:12:35.16 ]
>>143
linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBA
A="$(cat list.txt |tr -s \\n , |head -c -1)"

147 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 07:43:37.27 ]
>>143
とりあえずcatが無駄。

バッククオートの中のバックスラッシュは特殊な意味を持つので、
2回評価されると考えとけばいい。
この例ではバックスラッシュ3回で回避できる。

>>146
$( )使っちゃ駄目よ。

148 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:02:20.86 ]
俺も cat でファイル読む人なんだが、
なぜ cat をわざわざ付けるかと言うと、

自分が作る全てのスクリプトや打ち込むコマンドで
ファイルを読む際には必ず cat で読む

と統一する事で、ミスる可能性を減らしてるつもり。
客に納品するスクリプトでは仕方なく削るけど。

元々のきっかけは 20 年程前に tar でファイル消してしまったことだった。

149 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:09:55.16 ]
無駄なcatを入れないのは大手SIerじゃ常識だね。



150 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/01/21(土) 08:51:51.18 ]
コンピュータ的には無駄だが人間的には無駄ではない。
コメントの様な物だ。

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






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

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

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