トップページunix
1001コメント305KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2009/01/29(木) 06:54:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
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でそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。
0302名無しさん@お腹いっぱい。2009/03/06(金) 06:41:00
foreach i ($array)
echo $i
end
だろ。
0303名無しさん@お腹いっぱい。2009/03/06(金) 06:48:04
csh(笑)の質問はこっちでやれ
http://pc11.2ch.net/test/read.cgi/unix/1094041299/

>>302
それだと、要素の中のスペースで分割されてしまうからダメ。
例: "a 1" が a と 1 に別れてしまう。
0304名無しさん@お腹いっぱい。2009/03/06(金) 09:42:48
そんなこと言うならbash()笑の質問もこっちでやれってことになるぞw
http://pc11.2ch.net/test/read.cgi/linux/1210999497/
0305名無しさん@お腹いっぱい。2009/03/06(金) 22:26:43
>>300
cshなら配列使えばいいのでは?

#!/bin/csh -f
set a = ("a 1" "b 2" "c 3");

set i=1
while ( $i <= $#a )
   echo $a[$i]
   @ i = $i + 1
end
0306名無しさん@お腹いっぱい。2009/03/07(土) 00:49:25
set name = value
とかイコール前後にスペース付けられるあたりはcsh悪くないよね

というかスペースを許さないbashの代入がちょっとどうかと思う。
0307名無しさん@お腹いっぱい。2009/03/07(土) 01:10:08
なぜそこでbash
0308名無しさん@お腹いっぱい。2009/03/07(土) 03:17:01
とつぜんbashがきたので・・・
0309名無しさん@お腹いっぱい。2009/03/07(土) 07:01:04
>>306
算術式ならbashでもスペースを入れられるよ。

((i = 123))
echo $i
0310名無しさん@お腹いっぱい。2009/03/08(日) 04:05:42
(())ってなんなの?
0311名無しさん@お腹いっぱい。2009/03/08(日) 05:48:05
ま○こ
0312名無しさん@お腹いっぱい。2009/03/09(月) 19:53:57
まi = 123こ
echo $i
0313名無しさん@お腹いっぱい。2009/03/10(火) 07:44:38
sh, bashでシェル変数の値を変数名とするシェル変数を定義して
代入したいのですがどうすればよいでしょうか?
eval "$A=B"

eval "$A"=B
と書くと、意図通りに代入と判断されるシェル(最近のLinuxのbashやSolarisのsh)も
有ればコマンドと判断されてcommand not foundとなってしまう
シェルもあって、困っています。
0314名無しさん@お腹いっぱい。2009/03/10(火) 08:24:35
>>313
一般的には、代入する値のスペースや記号の解釈を避けるには、

eval $A=?''代入する値'?'

と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。

Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。
0315名無しさん@お腹いっぱい。2009/03/10(火) 08:27:12
>>313
わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。
0316名無しさん@お腹いっぱい。2009/03/10(火) 08:59:21
>>313
具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?
0317名無しさん@お腹いっぱい。2009/03/10(火) 18:05:12
シェルスクリプトってOOじゃないんでしょ?
ダサっ
0318名無しさん@お腹いっぱい。2009/03/10(火) 18:37:45
>>313
困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。
0319名無しさん@お腹いっぱい。2009/03/10(火) 20:10:54
last(1)を去年の11月から今日まで出したいのですがどうすれば
いいでしょうか。
0320名無しさん@お腹いっぱい。2009/03/10(火) 20:30:06
cat /var/log/wtmp.3 /var/log/wtmp.2 /var/log/wtmp.1 /var/log/wtmp.0 /var/log/wtmp >/tmp/wtmp
last -f /tmp/wtmp
rm -f /tmp/wtmp

場所が違えば適宜探すこと。
圧縮されてたら適宜伸長すること。
11月の分が存在しなければ諦めること。
0321名無しさん@お腹いっぱい。2009/03/11(水) 02:00:46
>>314-315
ありがとうございます。
が、試してみたところエラーとなりました。

XX=YY形式の設定ファイルをIFS="="として、
while readで読み込んで、環境変数XX=値YYとしています。
whileブロックの外ではエラーがでないので、
IFS="="が悪さをしているのではないかとふと思いつきました。
明日試してみます。

>>316,318
bash3.2.25です。
0322名無しさん@お腹いっぱい。2009/03/11(水) 06:29:23
>>321
エラーになってあたりまえだ。

IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。

これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。

「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。

あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。
0323名無しさん@お腹いっぱい。2009/03/11(水) 09:45:54
Windows PowerShellはOOなのに
シェルスクリプトはOOじゃないんだよね
時代遅れだね
0324名無しさん@お腹いっぱい。2009/03/12(木) 07:21:25
>>323
PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。
0325名無しさん@お腹いっぱい。2009/03/14(土) 01:53:46
jpgファイルのサイズを知りたいんですが、調べられますか?
0326名無しさん@お腹いっぱい。2009/03/14(土) 02:09:29
はい
0327名無しさん@お腹いっぱい。2009/03/14(土) 02:14:51
>>324
彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。
0328名無しさん@お腹いっぱい。2009/03/14(土) 02:20:53
>>325
imagemagickのidentifyコマンド
0329名無しさん@お腹いっぱい。2009/03/14(土) 12:03:01
ls -lとかじゃないのか。
0330名無しさん@お腹いっぱい。2009/03/14(土) 12:32:29
echo "jpgファイル" | wc -c
0331名無しさん@お腹いっぱい。2009/03/14(土) 23:02:45
>>328
ありがとうございます。できました。

>>329
>>330
すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。
0332名無しさん@お腹いっぱい。2009/03/17(火) 22:56:18
かなりてきとーだけど。

while read l; do
for w in $l; do
type $w > /dev/null 2>&1 && echo $w
done
done < (ファイル) | sort | uniq
0333名無しさん@お腹いっぱい。2009/03/18(水) 19:31:29
>>325 >>331 X環境ならば
xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。

但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う
0334名無しさん@お腹いっぱい。2009/03/18(水) 19:32:16
>>333 つまりこのスレ的にはexiftoolの返しをいかに削るかということだと思う
03353282009/03/18(水) 20:35:04
つ identify -verbose
0336名無しさん@お腹いっぱい。2009/03/19(木) 01:52:23
削るとかよりも素直に
WIDTH=`identify -format '%w' image.jpg`
HEIGHT=`identify -format '%h' image.ipg`
じゃない?
0337名無しさん@お腹いっぱい。2009/03/21(土) 00:05:33
>>336 元質問者の調べる楽しみを奪っちゃダメだよ。 >>335くらいでとどめておくのが良い
exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。
0338名無しさん@お腹いっぱい。2009/03/22(日) 04:07:52
shcでできたCソースからshに戻すというのは楽しいですか?
0339名無しさん@お腹いっぱい。2009/03/22(日) 08:11:40
>>338
俺がお前に聞きたいわ。
0340名無しさん@お腹いっぱい。2009/03/22(日) 23:38:38
shcってechoはsystem("echo");とかに変えるんだろうか?
0341名無しさん@お腹いっぱい。2009/03/25(水) 18:48:49
過去ログ見終わって今来た。ふぅ。

cshでさ、cshrcで
set path = (${path} ${TOMCAT_HOME}/bin)
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/lib
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ROOT/WEB-INF/classes
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ctx/lib:${TOMCAT_HOME}/jdbc/lib
って設定してて、気がつくと、
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin
LD_LIBRARY_PATH=:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib
みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る?
なんだか検索で遅くなりそうだが、気にしないが現実的?
0342名無しさん@お腹いっぱい。2009/03/25(水) 21:04:54
cshなんて使わないのが現実的
.cshrcでは setenvしない(setenvは .loginでする)のが現実的
setenvする場合でも、以前の値が蓄積するような書き方はしないのが現実的

cshの話題は
http://pc12.2ch.net/test/read.cgi/unix/1094041299/
に書くのが現実的
0343名無しさん@お腹いっぱい。2009/03/26(木) 00:23:22
csh って何回も打つからそうなるんじゃない?
それならshでも同じことでしょ

存在しないコマンド打った場合はエラーが帰るのが多少遅くなりそうだけど・・

気持ち悪ければ、「;」を改行に変えて、sort -u して「;」戻して新たにPATHに突っ込めばよいのかもしれんけどそうすると元の順番と変わるなぁ
0344名無しさん@お腹いっぱい。2009/03/26(木) 07:27:35
>>343
>それならshでも同じことでしょ

なんでやねん。アフォかw

shの .profile は「ログインシェル」しか読まない。
shって何回も打っても二重登録されない。
0345名無しさん@お腹いっぱい。2009/03/26(木) 07:41:07
いや.shrcならさ
0346名無しさん@お腹いっぱい。2009/03/26(木) 07:51:23
>>345
はぁ? .shrc なんてファイル何者?

少なくとも/bin/shはそんなファイルを読まない。
ash bash zsh ksh も .shrcなんてファイル読まないぞw
0347名無しさん@お腹いっぱい。2009/03/26(木) 08:00:36
cshには .login ってファイルなかったっけ
0348名無しさん@お腹いっぱい。2009/03/26(木) 08:04:57
>>347
>>342 が回答済み
0349名無しさん@お腹いっぱい。2009/03/26(木) 14:58:19
>>341
普通に使ってたら、そんなことは起きない。
0350名無しさん@お腹いっぱい。2009/03/26(木) 23:52:39
.shrcってないんだ・・
bashしか使わんから.bashrcみたいにあると思い込んでいたよ
0351名無しさん@お腹いっぱい。2009/03/27(金) 01:18:27
マニュアル読まない奴は多いんだね
0352名無しさん@お腹いっぱい。2009/03/27(金) 01:36:44
試してみない奴はもっと多い
0353名無しさん@お腹いっぱい。2009/03/27(金) 12:34:12
初心者質問すいません。
スクリプトの中で変数が空かどうか調べるにはどう書けばよいでしょうか?
ご教示頂きたくm()m
0354名無しさん@お腹いっぱい。2009/03/27(金) 12:44:24
>>353
変数名 HOGE が空かどうかを調べる

(1)空文字列は空とはみなさない場合:

echo ${HOGE-'空だよ'}

---
(2)空文字列がセットされていても空とみなしたい場合:

echo ${HOGE:-'空だよ'}
0355名無しさん@お腹いっぱい。2009/03/27(金) 12:48:45
>>353
)空文字列も空と見做していいなら、

if [ -z "$HOGE" ]; then
: 空の場合の処理
fi
03563532009/03/27(金) 12:51:54
ありがとうございます!m(_ _)m
0357名無しさん@お腹いっぱい。2009/03/27(金) 12:52:39
>>353
空文字列は空ではないと考えるなら、

if [ "${HOGE+a}" ]; then
: 空の場合の処理
fi
0358名無しさん@お腹いっぱい。2009/03/27(金) 12:56:12
>>357
条件逆になってるよw

if [ -z "${HOGE+a}" ]; then
: 空の場合の処理
fi
03593532009/03/27(金) 15:36:18
ありがとうございます。
すいませんもう一個疑問が出来ました。
$1のような特殊変数には値の代入はできないのでしょうか??
0360名無しさん@お腹いっぱい。2009/03/27(金) 15:38:12
つ set -- value1
0361名無しさん@お腹いっぱい。2009/03/27(金) 15:52:22
>>359
× 特殊変数
○ 位置パラメータ

代入方法 ( $1 に HOGEを代入したいなら)
set -- HOGE
ただし、$2以降のすべての位置パラメータがリセットされる

他に、「特殊パラメータ」($0 $@ $# $? など)もあって、
特殊パラメータには値は代入できない。
0362名無しさん@お腹いっぱい。2009/03/27(金) 17:23:22
>>357
「空文字列は空ではない」ってどういう意味??

HOGE+aってそんな変数できるの? 変数に足し算?
HOGE+bとかやるとなにか違い出るの?

全然わかりません><
0363名無しさん@お腹いっぱい。2009/03/27(金) 17:28:37
unsetな状態を「空」って言うのか?
0364名無しさん@お腹いっぱい。2009/03/27(金) 19:24:58
変数が無い
変数設定されてるが空。
変数に値が設定されている。
0365名無しさん@お腹いっぱい。2009/03/27(金) 23:44:09
>>364
で、質問は何?
変数が必要なら設定すれば?
0366名無しさん@お腹いっぱい。2009/04/01(水) 09:36:21
>>363
はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日からもう来なくていいから。
0367名無しさん@お腹いっぱい。2009/04/01(水) 12:44:33
説教の誤爆はいつ見ても滑稽だな。
0368名無しさん@お腹いっぱい。2009/04/01(水) 14:58:19
誤爆つーかコピペ
0369名無しさん@お腹いっぱい。2009/04/01(水) 15:53:48
今日から新人来るからな。
今までの下っ端が下っ端を抜け出せるかの試練の日。
0370名無しさん@お腹いっぱい。2009/04/01(水) 16:14:02
CRONで別サーバーにファイルを転送しようとしています。
対話式で
ftp example.com
username
password
cd ディレクトリ
put ファイル
quit
とやると正常にファイルを送信することができます。

ftp -n example.com << __END__
user username password
bin
passive
cd ディレクトリ
put ファイル名
quit
__END__

をシェルスクリプトで実行すると
ファイル名: Permission denied.
と権限がない旨が表示されます。

転送元ファイルの権限はroot、パーミッションは0644、転送するファイル一般ユーザー権限、ディレクトリに変えてみたのですが、
結果は変わらずです。
実行ユーザーはroot、シェルスクリプトのパーミッションは0700です。
対話式とは権限周りが違うのでしょうか?
0371名無しさん@お腹いっぱい。2009/04/01(水) 16:29:25
>>370
cronを使わずに、そのシェルスクリプトを一般ユーザーで実行して正常動作するなら、
NFSでrootの権限がない問題と思われる。
シェルスクリプトのパーミッションを755とかにすれば?
0372名無しさん@お腹いっぱい。2009/04/01(水) 16:44:03
よくNFSだってわかったな。
0373名無しさん@お腹いっぱい。2009/04/01(水) 16:56:37
put ファイル名 でエラーしたんじゃないの?
0374名無しさん@お腹いっぱい。2009/04/01(水) 17:02:47
>>373
それだったらメッセージが違う。ftpdからのメッセージになるから、
5XX cannot write hoge とか。
03753702009/04/01(水) 17:06:33
一般ユーザーディレクトリにbackup.shを移し、一般ユーザー権限で
/bin/sh /home/ユーザーdir/適当なフォルダ/backup.sh

を実行しましたが、変わらずです。
backup.shのパーミッションは0755。

CRONでもコマンドライン上でも、シェルスクリプト経由でFTPを通すとエラーが出るようです。
一般ユーザー権限でも、対話式なら問題ありません。

0376名無しさん@お腹いっぱい。2009/04/01(水) 17:12:24
CRONとか大文字で書いてるし、どうせ釣りだ
0377名無しさん@お腹いっぱい。2009/04/01(水) 17:17:53
>>375
一般ユーザーで、

$ /bin/sh -x /home/ユーザーdir/適当なフォルダ/backup.sh

を実行した結果を省略せずに貼ると何かわかるかも。
0378名無しさん@お腹いっぱい。2009/04/01(水) 17:34:55
>>377
そんなこと言って、「省略せずに貼」ったとたん、黙り込むんだよなぁ。
または、他の人が正解を回答して、結局、貼った内容は全く関係なかったり
するんだよなぁ。
0379名無しさん@お腹いっぱい。2009/04/01(水) 17:38:59
>>370
その backup.sh の中の ftp -n を、ftp -nv に変えてメッセージを検証して。
0380名無しさん@お腹いっぱい。2009/04/01(水) 17:39:14
>>374
試してみた?>>370 のようなエラーがでたよ
(Solaris8)
0381名無しさん@お腹いっぱい。2009/04/01(水) 17:49:58
>>378
まぁあくまで「わかるかも」だからな。
03823702009/04/01(水) 18:17:08
遅くなりましたが解決しました。
原因はシェルスクリプト自体の権限が、FTPで接続するユーザート違かったからだと思います。

SSHでログインしているサーバーのユーザーは「root」の他に「admin」「information」などのユーザー名を使用していたのですが、FTPで接続する先のユーザーは全く違う名前でした。
なので、FTPのユーザー名と同じユーザーを作成し、そのユーザー権限でシェルスクリプトを実行したら、無事成功しました。

けど、FTPのユーザー名と、実行するユーザー名が異なると権限のエラーがでるのですね。 不思議です。

皆様ありがとうございました。
0383名無しさん@お腹いっぱい。2009/04/01(水) 18:24:36
そんなはずないと思うんだがなぁ。
0384名無しさん@お腹いっぱい。2009/04/01(水) 18:25:24
Cygwin(bash)を使っています。

for文の中で文字列の代入をさせようとするとエラーが返されます

#!/bin/sh

for i in *
do
  $output = $i
  (・・処理・・)
done

どうしたらfor文の中で文字列の代入をさせることができるでしょうか?
0385名無しさん@お腹いっぱい。2009/04/01(水) 18:26:18
for の外なら

$output = $i

はできてるのか?
0386名無しさん@お腹いっぱい。2009/04/01(水) 18:36:15
>>385
for文の外でも

=: command not found

と言われてエラーを返されました(´・ω・`)
0387名無しさん@お腹いっぱい。2009/04/01(水) 18:38:48
えっと、この空気的には
output=$i
ってマジレスしちゃダメなんだろなぁ
0388名無しさん@お腹いっぱい。2009/04/01(水) 18:39:51
>>386
他の言語の常識持ち込まずに
ちゃんと構文調べてから書いた方がいいよ。

>>387
別にいいんじゃね。
0389名無しさん@お腹いっぱい。2009/04/01(水) 18:46:55
>>387
それでも

output: command not found

とエラーが返されましたorz・・・
0390名無しさん@お腹いっぱい。2009/04/01(水) 18:49:06
cshユーザーに隙はなかった
0391名無しさん@お腹いっぱい。2009/04/01(水) 18:49:20
>>389
>>387をそのまま書く。
空白入れちゃだめ。
0392名無しさん@お腹いっぱい。2009/04/01(水) 18:59:18
>>391
できました。ありがとうございました(;´∀`)
0393名無しさん@お腹いっぱい。2009/04/01(水) 21:22:43
本日の祭り会場はこちら

【ネット】朝日新聞編集局員(49)、2ちゃんで荒らし行為&差別を助長する書き込み→朝日新聞からの書き込み規制され…★64
http://tsushima.2ch.net/test/read.cgi/newsplus/1238588235/


※ソース(3月31日付けasahi.com)
http://www.asahi.com/national/update/0331/TKY200903310332.html
0394名無しさん@お腹いっぱい。2009/04/02(木) 02:25:42
どこかの鯖のシェルスクリプト見るとパスワード書いてあったりするのかwww
なんだかなあ。
0395名無しさん@お腹いっぱい。2009/04/02(木) 08:47:42
findでひっかけたファイル一覧をforで回したいんですけど、引っかけたファイルにスペースが入っている場合、単語単位でforで回ってしまいます。
この場合って、事前にIFSをイジるしか解決策は無いのでしょうか?
findの-print0とかして、forのデリミタをNULLにしたりとかは出来ないのでしょうか?
0396名無しさん@お腹いっぱい。2009/04/02(木) 08:51:34
>>395
find . -exec sh -c 'for arg in "$@"; do echo "$arg"; done' dummy {} +
0397名無しさん@お腹いっぱい。2009/04/02(木) 09:09:17
>>396
ありがとうございます。
出来ました。
ただ何をやっているのか、理解していないと思われる部分があるので質問させて下さい。

dummyは何をやってるのでしょうか?
僕の理解としては、shの引数としてfindの1結果を渡しているんだと思うんですけど、shにとっての第1引数はdummyなので、
dummy ファイル名
が$@に入ってると思います。
ただ、
$ sh -c 'echo "$@"' arg1 arg2
とすると、arg22がechoされるので、dummyが必要なのは現象からわかるのですが、理由がわかりません。

それと、最後の+はどういう意味でしょう。findのmanでは\;で-execは終われと書いてあるように読めるのですが。

以上、すいませんが、解説お願い出来たらお願いします。
0398名無しさん@お腹いっぱい。2009/04/02(木) 10:55:42
どっちもマニュアル嫁だな

sh(1)より:

-c string If the -c option is present, then commands are read from string. If there are
arguments after the string, they are assigned to the positional parameters,
starting with $0.

find(1)より:

-exec command {} +
This variant of the -exec action runs the specified command on the selected files,
but the command line is built by appending each selected file name at the end; the
total number of invocations of the command will be much less than the number of
matched files. The command line is built in much the same way that xargs builds
its command lines. Only one instance of `{}' is allowed within the command. The
command is executed in the starting directory.
0399名無しさん@お腹いっぱい。2009/04/02(木) 11:33:43
forで回したいという要求に合ってない気がするが
空気読んで黙っておくよ
0400名無しさん@お腹いっぱい。2009/04/02(木) 11:47:12
ファイル名にシングルクォートが含まれていないと仮定するなら、

for files in `find . -printf "'%p' "`
do
echo "$files"
done


findに、「シェルで再利用可能なクォートを施した状態でprint」という
機能がない以上、完全な対応は無理。なので、>>396 のように sh -c を -exec する
方法しかない。
0401366NGNG?2BP(0)
お礼遅れてすいません!ありがとうございましたm(_ _)m
0402名無しさん@お腹いっぱい。2009/04/06(月) 02:09:11
LANGが日本語じゃなくてもshだと日本語が表示されるのと、
LANGが日本語じゃないとcshでは表示されない理由を教えてださい

[root@yama ~]# csh -c "setenv LANG C ; echo '日本語'"

[root@yama ~]# sh -c "export LANG=C ; echo '日本語'"
日本語
[root@yama ~]#
■ このスレッドは過去ログ倉庫に格納されています