シェルスクリプト総合 その19
■ このスレッドは過去ログ倉庫に格納されています
0001シェルスクリプトライター
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。
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 でトレースしましょう。
前スレ
シェルスクリプト総合 その18
http://hibari.2ch.net/test/read.cgi/unix/1308195527/
次スレは >>970 で。
0383名無しさん@お腹いっぱい。
2012/02/25(土) 11:21:00.66量は多いけど時間は多少かかってもかまわないんでしょ。
0384名無しさん@お腹いっぱい。
2012/02/25(土) 11:22:45.37次の日の出社までに終わってればいい、なんてケースだと
7時間が4時間に短縮されてもあんまり意味ない。
0385名無しさん@お腹いっぱい。
2012/02/25(土) 11:52:15.99初めは>>372のように考え、どうしても長さが保存できないので何かやり方は無いかと質問しました
>>371,377
もっとさくっと書けるコマンドがあるかなと思っていたけど、やはりスクリプト言語使うしかないですか
それにしてもrubyは短く書けるんですね。今のシステムには入れていませんが勉強になります
>>375
なるほど。任意の長さの文字列を作るのにsedで置換を使う方法は思いつかなかった
それを元にすると最終的にこんな感じでしょうか?
MADR=foo.bar@example.com
MASK=*
RC=3
DOM=${MADR##*@}
MINV=${MADR:$RC:${#MADR}-RC-${#DOM}-1}
echo "$MADR"
echo "${MADR:0:$RC}${MINV//?/*}@$DOM"
これなら、外部のプログラムを呼び出さないのでそこそこ速そう
ただ、bashで動くことは確認したけど、汎用性を考えるとawkを使う>>377?
速度についてですが、何度も変換するものではないし、
寝ている間に終わればいいなと思っていたのでシェルスクリプトで十分でした
0386名無しさん@お腹いっぱい。
2012/02/25(土) 11:54:23.140387名無しさん@お腹いっぱい。
2012/02/26(日) 01:55:24.94ヽ('A`)ノ、スーパーちんぽマン参上!!
/ ( ) \
んヘヽヽ〜'
0388名無しさん@お腹いっぱい。
2012/02/26(日) 10:43:00.23# SIGQUIT (signal 3) and returns to single user after fsck.
trap : 2
trap : 3 # shouldn't be needed
という一文が有るのですが、
SIGINITとSIGQUITを無視(ignore)するならば
trap ' ' 2
trap ' ' 3
と言う書き方になるような気がするんですが、
:はどういう意味が有るのでしょうか?
0389名無しさん@お腹いっぱい。
2012/02/26(日) 10:55:51.64trap '' 2 は、
親(シェル自身)も子プロセス(外部コマンド)もSIGINTを無視する。
trap : 2 は、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻
る。
あと、' ' じゃなくて '' (空文字列)な。
0390名無しさん@お腹いっぱい。
2012/02/26(日) 11:23:35.810391名無しさん@お腹いっぱい。
2012/02/26(日) 22:34:59.64>>390
:ってヌルコマンドって奴ですか?
そうすると、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻る
という解釈どうして出てくるかさっぱりなので、教えてください
お願いします
0392名無しさん@お腹いっぱい。
2012/02/27(月) 01:17:55.060393名無しさん@お腹いっぱい。
2012/02/27(月) 07:26:12.43そのシグナルを無視し、子プロセスも無視するとは書かれているけど、
これだけだとわかりにくいかも。
trapで何らかのコマンドを指定すると、それはシグナルハンドラが設定されるので、
シグナルの一般仕様により、シグナルハンドラが設定されている場合の子プロセスでは
シグナル設定はデフォルトに戻る。
よって、ダミーのシグナルハンドラを設定するために、: コマンドを指定している。
0394名無しさん@お腹いっぱい。
2012/02/27(月) 13:56:39.45何が間違っているのでしょうか?
BEGIN{x = 0}
printf("%d\n",x++)
END{x=0 }
0395名無しさん@お腹いっぱい。
2012/02/27(月) 14:04:05.230396名無しさん@お腹いっぱい。
2012/02/27(月) 14:11:30.36BEGIN{}等は使わない
↓
#!/bin/awk -f
FNR==1{x=0}
{printf("%d?n",x++)}
0397名無しさん@お腹いっぱい。
2012/02/27(月) 15:17:34.24":"がnull commandなのは先頭語に出てきた場合だけ。
trapが第一引数の":"をどう解釈しようと自由。
ただnull commandからの類推で「無視するが〜」としただけ。
0398名無しさん@お腹いっぱい。
2012/02/27(月) 15:22:42.53ちがうよ。
trapは、第1引数を改めてコマンドとして解釈する(2回解釈する)ので、
結局 : は先頭に出てきたのと同じで、null command として解釈される。
(eval : の場合と似てる)
trapが:を特別に解釈しているわけではない。
たとえば、trap true 2 って書いても trap : 2 と同じ。
0399名無しさん@お腹いっぱい。
2012/02/27(月) 15:54:02.25これでSIG_IGNにすることになってる。
0400名無しさん@お腹いっぱい。
2012/02/27(月) 23:12:06.60while read hoge hage ; do
:
done <file
とかよくやるけど、1行の文字列を分割しようとして
echo "hoge hage" | read hoge hage
ってやってみても、$hoge にも $hage にも何も入らない
なんで?
0401名無しさん@お腹いっぱい。
2012/02/27(月) 23:28:41.940402名無しさん@お腹いっぱい。
2012/02/27(月) 23:29:53.910403名無しさん@お腹いっぱい。
2012/02/27(月) 23:31:57.84read hoge hage
echo hoge=$hoge hage=$hage
}
0404名無しさん@お腹いっぱい。
2012/02/27(月) 23:36:20.13おおー入った! \(@o@)/
どういう仕様になってるんだろう
サブシェル的な問題?
0405名無しさん@お腹いっぱい。
2012/02/28(火) 08:06:57.00その通りだが、そうならないシェルもある。自分なら read hoge hage <<<"hoge hage" って書く
0406名無しさん@お腹いっぱい。
2012/02/28(火) 10:45:26.990407名無しさん@お腹いっぱい。
2012/02/28(火) 11:12:25.510408名無しさん@お腹いっぱい。
2012/02/28(火) 18:54:44.50リナックスのkshは冷やすとリング使える不思議
0409400
2012/02/28(火) 22:39:16.48オイラの読んだ入門書には載ってなかったんだよなぁ
と思いながら試してみたら
Syntax error: redirection unexpected
sh -> dash なうちのDebianじゃダメみたい (・ω・` )
ステキな機能だけに残念
やっぱこういう場合はset使うべきなんですかね…
0410名無しさん@お腹いっぱい。
2012/02/28(火) 22:52:20.02一行で書きたいならセミコロン
echo hoge hage | { read hoge hage; echo hoge=$hoge hage=$hage; }
0411名無しさん@お腹いっぱい。
2012/02/29(水) 02:06:19.12xxx.sh -a test -yx
#!/bin/ksh
while getopts a:yx opt
do
case ${opt} in
a)
YY=${OPTARG}
echo "オプション[-a]の引数は${YY}だよ。"
;;
yx)
echo "オプション[-yx]があるよ。"
;;
esac
done
0412名無しさん@お腹いっぱい。
2012/02/29(水) 08:15:39.53getoptsでは、-yx は -y -x と指定したのと同じに解釈されるから無理。
0413名無しさん@お腹いっぱい。
2012/02/29(水) 10:48:10.110414名無しさん@お腹いっぱい。
2012/02/29(水) 10:50:38.33すみませんが詳しい方のみ回答をお願いします
0415名無しさん@お腹いっぱい。
2012/02/29(水) 10:54:40.480416名無しさん@お腹いっぱい。
2012/02/29(水) 11:34:25.80-y x も受けつけちゃうけど。
0417名無しさん@お腹いっぱい。
2012/02/29(水) 14:08:24.59list=`cat ./file | grep aaa`
って感じでlistにaaaを持つ行を全部放り込んでるのですが、
これらを別々の1行ずつに分割して
なおかつlistを配列にして格納する事はできますか。
具体的には、fileの中にはaaaの文字列を持つ行が5つあるのですが
それをlist[0]〜list[4]に格納したいのです。
よろしくご指導お願いしますm(_ _)m
0418名無しさん@お腹いっぱい。
2012/02/29(水) 14:10:31.36grep aaa file でよくね?
0419名無しさん@お腹いっぱい。
2012/02/29(水) 15:35:13.71IFSに改行コードのみを代入した状態で、list配列に一括代入する文法を使う。
#!/bin/bash
IFS='
'
list=(`grep aaa file`)
0420名無しさん@お腹いっぱい。
2012/02/29(水) 16:42:01.73ありがとうございます!
できました!
0421400
2012/02/29(水) 23:33:48.87>>410
パイプ通すとブレースもサブシェルで動作してるのか
外からは参照できないみたいなんですよね
いやもちろん最初の例もサブシェル作ってるんですが (;´Д`)
処理の内容にもよるけど、やっぱりグローバルで使いたいってなると
関数に括り出してバッククォートで呼んだりして結局同じようなことなのかなぁと
そんな感じの意味です
でも勉強になりましたみなさんありがとう
0422名無しさん@お腹いっぱい。
2012/03/01(木) 06:47:03.28getopt(外部コマンド)はスペース入りファイル名などの引数を正常に扱えない
などの仕様バグの固まり。getoptsを使うべし。
0423名無しさん@お腹いっぱい。
2012/03/05(月) 08:04:37.31#define HOGE MAGE
HOGE の定義値を抽出したい。
grep HOGE header.h |grep define |awk print $NF
みたいな書き方(うろ覚え)すると
キャリッジリターンも拾うわ、
タブ(スペース)数でフィールド変わるわなんですが
うまい方法ないですか?
0424名無しさん@お腹いっぱい。
2012/03/05(月) 08:12:54.29$ cat header.h
#define HOGE MAGE
$ (cat header.h; echo HOGE) | gcc -E -P -
MAGE
0425名無しさん@お腹いっぱい。
2012/03/05(月) 08:25:52.140426名無しさん@お腹いっぱい。
2012/03/05(月) 09:38:08.860427名無しさん@お腹いっぱい。
2012/03/05(月) 10:17:08.260428名無しさん@お腹いっぱい。
2012/03/05(月) 12:00:16.07けどお題はもっと単純な話なんじゃないのかな。
マクロの展開を止めたいなら、
(#define MAGE 〜があってもMAGEを出力したい場合)
awkスクリプトになってしまったが、こんな感じ。
awk '$0 ~ /^#define[ ]+HOGE/ { $1=""; $2=""; print $0 }'
[]の中はスペースとタブ
0429名無しさん@お腹いっぱい。
2012/03/05(月) 22:50:17.04あるディレクトリにある全部のファイルに対して
コンパイルをかけるスクリプトをつくりたいです。
TESTLISTには
ソース名 コンパイラオプション
が書いてあります(hoge.c 5みたいに)
---------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# コンパイルをかける
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done < ${LIST}
--------------------------------------------
のような簡単な奴で良いんですが、
0430名無しさん@お腹いっぱい。
2012/03/05(月) 22:51:02.05cc.shの中に、
--------------------------------------------
if [ ${RETCD} -ne 0 ]
then
echo "コンパイルログを表示しますか?"
RCV=""
while [ `echo "${RCV}" | sed -ne '/^[ ]*[yYNn][ ]*$/p' | wc -l` -eq 0 ]
do
read RCV
done
if [ `echo "${RCV}" | sed -ne '/^[ ]*[yY][ ]*$/p' | wc -l` -ne 0 ]
then
more ${コンパイルログ}
fi
fi
-------------------------------------------
のように書いてあり、コンパイルに失敗した場合、
「コンパイルログを表示しますか?」が端末に表示されたままで、「N」や「Y」を
入力しても反応がなく、Ctr-Cで実行を打ち切っている状態です。
0431名無しさん@お腹いっぱい。
2012/03/05(月) 22:52:03.41コンパイルに失敗した場合、Ctr-Cを入力すると
次のファイルにコンパイルをかけるようにしたいのですが、
--------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# Ctr-Cを無視するように設定(サブシェルには有効)
trap : 2
# コンパイルをかける
while read ARG1 ARG2
do
#サブシェル化
(${CCOM} ${ARG1} ${ARG2})
done < ${LIST}
---------------------------------------------
でオッケーでしょうか?
ちなみにMakeは使用不可です。また、cc.shはいじれません。
0432名無しさん@お腹いっぱい。
2012/03/06(火) 11:06:00.37この状況を何とかした方が建設的かと。
0433名無しさん@お腹いっぱい。
2012/03/06(火) 19:10:20.96> でオッケーでしょうか?
つまり俺たちにデバッグしろと言っているのか?
0434名無しさん@お腹いっぱい。
2012/03/06(火) 19:12:06.020435名無しさん@お腹いっぱい。
2012/03/06(火) 19:19:26.970436名無しさん@お腹いっぱい。
2012/03/06(火) 19:21:31.590437名無しさん@お腹いっぱい。
2012/03/06(火) 20:23:39.440438名無しさん@お腹いっぱい。
2012/03/06(火) 21:07:07.27コンパイルに失敗した場合、「N」や「Y」を入力しても反応がない原因を
教えてやる。
>>429 の while do .. done ループで、done < ${LIST} となってるので、
標準入力が ${LIST} にリダイレクトされたままになってて、
その状態で cc.sh が起動されてる。
cc.shの中でキーボードを読んでるつもりが、${LIST}を読んでしまうので、
「N」や「Y」を入力しても反応しない。
解決方法は、>>429 で、
----------------------------
exec 3< ${LIST}
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done 0<&3
----------------------------
とすること。標準入力をキーボードにしたまま、readには記述子3を読ませる。
0439名無しさん@お腹いっぱい。
2012/03/06(火) 21:12:06.05おいおい、そのリダイレクト方法だと結局同じ理由で駄目だよ。
標準入力を退避しておいて復帰する。
exec 3<&0
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2} 0<&3
done < ${LIST}
0440名無しさん@お腹いっぱい。
2012/03/06(火) 21:17:04.64>>438 が言いたかったのは
↓じゃないかな
exec 3< ${LIST}
while read ARG1 ARG2 0<&3
do
${CCOM} ${ARG1} ${ARG2}
done
0441名無しさん@お腹いっぱい。
2012/03/06(火) 22:15:57.04> でオッケーでしょうか?
オッケーだと言う人がいたらしいよ。
ただし私は、貴方の環境と責任を共有していないので、自己責任でやって下さいね。
0442名無しさん@お腹いっぱい。
2012/03/07(水) 00:36:49.85探しています。OSはCentOS6、シェルはbashです
以下のような問題に対処したいのですが、何か手段はありますでしょうか?
以下のsampletext.txt(「\\」や「\」を含む)を、readecho.shのようにreadで読み、
echoで出力すると、「\」がエスケープか何かされているようで、表示されません
bashやechoのmanにある-Eオプションを明示的に付与してみても変化が無いようです
awkprint.shのようにawkで行うと期待した結果が出るのですが、他の処理の関係上、
できればawkは使わずに、シェルスクリプトで実現させる方法を知りたく思ってます
テキストを事前に「\\」から「\\\\」としておく等の対処はせずに済ませたいです
$ cat sampletext.txt
\\winsv\a\b\c
\\sambasv\d\e\f
$ cat readecho.sh
#! /bin/sh
while read STRING
do
echo -E "${STRING}"
done < sampletext.txt
$ ./readecho.sh
\winsvabc
\sambasvdef ←「\\」が「\」になり、「\」が消えている。NG
$ cat awkprint.sh
#! /bin/sh
cat sampletext.txt | awk '{print $0}'
$ ./awkprint.sh
\\winsv\a\b\c
\\sambasv\d\e\f ←上記のような問題はない。OK
0443名無しさん@お腹いっぱい。
2012/03/07(水) 00:42:21.68read -r
0444名無しさん@お腹いっぱい。
2012/03/07(水) 00:42:48.660445名無しさん@お腹いっぱい。
2012/03/07(水) 00:45:02.830446名無しさん@お腹いっぱい。
2012/03/07(水) 00:48:20.73情報ありがとうございました
うまくいきました
bashでもreadは「Backslash does not act as an escape character.」だそうです
なるほどreadで対処するのか...
$ cat readecho.sh
#! /bin/sh
while read -r STRING
do
echo -E ${STRING}
done < sampletext.txt
$ ./readecho.sh
\\winsv\a\b\c
\\sambasv\d\e\f
0447名無しさん@お腹いっぱい。
2012/03/07(水) 00:55:51.24> bashでもread -rは「Backslash does not act as an escape character.」だそうです
と書きたかったのか?
0448名無しさん@お腹いっぱい。
2012/03/09(金) 22:27:14.08Aを開始、
Bを開始
Bの中でAの処理中を待つことできますか?
意味わかりませんかね・・・
mkdirとかロック待ちみたいなやつです。
0449名無しさん@お腹いっぱい。
2012/03/09(金) 22:43:33.00while 文で無限ループ作って、sleep でも挟めば十分「処理待ち」になると思うけど。
0450名無しさん@お腹いっぱい。
2012/03/09(金) 22:44:29.80FreeBSDなら lockf(1)、Linuxならflock(1)を使ってなんとかしろ。
0451名無しさん@お腹いっぱい。
2012/03/09(金) 23:06:08.54ありがとうございます。
がんばってみます。
0452名無しさん@お腹いっぱい。
2012/03/09(金) 23:18:55.14なんで似てるようで違う名前なの?
0453名無しさん@お腹いっぱい。
2012/03/10(土) 00:14:30.880454名無しさん@お腹いっぱい。
2012/03/10(土) 09:50:04.490455名無しさん@お腹いっぱい。
2012/03/11(日) 03:13:24.48for FILE in `find / \( -iname "zoo*.png" -o -iname "land*.png" -o -iname "zoo*.txt -o -iname "land*.txt" \)`; do
rm -vf $FILE
echo $a
done
初心者です、スクリプト書いてみたんですが、この$aで表示される数がおかしくてこまってます。
なぜかrmコマンドでは1つも削除されておらずメッセージも表示されていないのに4と表示されるのです。
やりたい事としてはこうです↓
「zoo*.png、land*.png、zoo*.txt、land*.txtというファイル名のファイルを全て削除し、その数をカウントする」
何がおかしいのでしょうか?
0456名無しさん@お腹いっぱい。
2012/03/11(日) 04:32:12.074が表示されるのはオカルト。君もうすぐ死ぬんじゃない?
ファイルを削除して数をカウントしたいだけなら
find ほにゃらら -print0 | xargs -0 rm -v | wc -l
でよい。変数もforも必要ない。
4が出るのは君がオリジナルのスクリプトをここにコピペするときに何か端折ったせいだろう。
0457名無しさん@お腹いっぱい。
2012/03/11(日) 04:53:51.30ごめんなさい、a=$(($a + 1))が抜けてました...
にしてもこんなにコンパクトになるもんなんですね
ありがとうございました
0458名無しさん@お腹いっぱい。
2012/03/11(日) 08:05:01.28find ほにゃらら -exec rm -v {} + | wc -l
で良い。
0459名無しさん@お腹いっぱい。
2012/03/11(日) 08:11:05.46find ほにゃらら -delete -print | wc -l
0460名無しさん@お腹いっぱい。
2012/03/11(日) 08:14:18.54-exec の方が古い感覚だけどどうなんだろ?
0461名無しさん@お腹いっぱい。
2012/03/11(日) 08:17:25.43-exec ';' なら古い感覚
-exec + は新しい感覚
0462460
2012/03/11(日) 08:29:08.31+ はいま使っているマシンの中では使えない物がほとんどかも。
-exec は元々 Unix に魅せられたポイントなので、1989 年には使ってた。
xargs はネットで教えてもらって 1995 年頃から使い始めた。
けど確か元からあったかも。
0463名無しさん@お腹いっぱい。
2012/03/11(日) 08:32:05.19-exec + はSolarisでさえ使えるのに、どんな古いOS使ってるんだよ?
0464名無しさん@お腹いっぱい。
2012/03/11(日) 08:54:41.56使えないのを探す方が難しいよね。
原始人と言われたからってムキになってウソを教えるのは良くないな。
http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-210.html
| One of these extensions, which I believe is supported at least on all
| systems derived from SVR4 and on HP-UX (although in some cases it is an
| undocumented feature), is a variant of the "find -exec" primary where
| "find" does argument aggregation internally:
|
| find . -type f -exec some_command {} +
0465名無しさん@お腹いっぱい。
2012/03/11(日) 09:52:56.43確かテンプレではfind -print0 | xargs -0推奨で、スレ内議論では-exec +を使えと主張する人がいた。
0466名無しさん@お腹いっぱい。
2012/03/11(日) 10:09:06.10られていたから。質問者のためではなく回答者のためのテンプレ。
-exec {} + 構文が紹介されてからはxargsを使う意味がなくなったのか削除された。
それでもしばらくは-exec {} + を知らない原始人がいたけど、そのたびに原始人と
呼ばれて、絶滅していった。テンプレから削除されたのはこの時点(絶滅後)かも。
-exec {} + ですべてが置き換え可能とは言わないが、find+xargsが必要になること
は極めてまれ。
0467名無しさん@お腹いっぱい。
2012/03/11(日) 10:32:32.19あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
0468460
2012/03/11(日) 10:44:50.32-exec は fork するから良くないと言われてた。
+ は SVR4 に入っているのなら俺のもだいたい動くね。
でも俺まだ Tower の SVR2 や SVR3 とも格闘してるから。
ファイル名の長さが 14 文字までのやつ。
0469名無しさん@お腹いっぱい。
2012/03/11(日) 10:44:55.572つの違い
-print0や xargs -0は使えないOSがある。
>パイプで繋がってしまっているrmを画面にも
tee
0470名無しさん@お腹いっぱい。
2012/03/11(日) 10:55:09.821 find -exec \; 構文ではファイル一つ毎に別プロセスが起動されるので効率が悪い。
2 そこでまとめて処理できるようxargsが作られた。初出はPWBだからかなり古い
find -print | xargs
3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
find -print0 |xargs -0
4 そんな面倒な事しなくて済むように-exec {} + 構文が作られた
-exec \; 構文と違い、別プロセスは(MAX_ARGSを考慮して)まとめて実行される。
> あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
find ほにゃらら -delete -print |tee /dev/tty| wc -l
find ほにゃらら -exec rm -v {} + |tee /dev/tty| wc -l
0471名無しさん@お腹いっぱい。
2012/03/11(日) 10:56:05.20例えば?
どっちも相当昔からある気がするけど
0472名無しさん@お腹いっぱい。
2012/03/11(日) 10:58:21.95ちょっとは自分で調べろよ。Solarisで-print0等が使えないのは常識。
0474名無しさん@お腹いっぱい。
2012/03/11(日) 11:06:35.90相当昔といえば言えなくはないが。
http://www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.5-RELEASE&arch=default&format=html
http://www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.6.1-RELEASE&arch=default&format=html
0475名無しさん@お腹いっぱい。
2012/03/11(日) 11:22:05.200476名無しさん@お腹いっぱい。
2012/03/11(日) 11:29:54.60SVR[23]のような骨董環境前提の回答なんか意味ない。
0477名無しさん@お腹いっぱい。
2012/03/11(日) 11:38:38.97自分はタイプ数の多いxargsは使わないけどね。
無用な-exec \;と-0無しのxargsさえ避ければ良い。
そもそも今回は-deleteが使えるならxargsも-exec +も要らないし。
0478名無しさん@お腹いっぱい。
2012/03/11(日) 11:42:53.84だから、使える方法を使えばいいってことでしょ?
結論見えてないの?
0479名無しさん@お腹いっぱい。
2012/03/11(日) 11:51:09.25できました!!ありがとうございましたm(_ _)m
0480名無しさん@お腹いっぱい。
2012/03/11(日) 15:05:46.64> 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
改行というか、広い意味での空白($IFS)だな。
0481名無しさん@お腹いっぱい。
2012/03/11(日) 15:27:32.53シングルクォート/ダブルクォートも解釈しちゃうという問題がある。
it_don't_mean_a_thing.mp3
とかのファイル名もそのまま通らない
0482名無しさん@お腹いっぱい。
2012/03/11(日) 20:30:34.37コロン(:)が含まれてるファイル名なんか最悪。。
FILES = $(wildcard *.mp3)
$ make hoge
Makefile:〓: *** multiple target patterns. Stop.
0483名無しさん@お腹いっぱい。
2012/03/11(日) 22:43:26.33基本的な歴史としては>>470の通りなんだが
現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる
だから 5. としてxargsを-n付きで使うようになったわけ
>>481みたいな問題にもちゃんと解法はある、つーかググレカス
ゆえに{} +はファイルを渡す先が確実に処理できると確信できる場合だけ使うべきで
癖をつけるなら-print0 | xargs -0の流れが正しい
何か問題が起きてもxrgsにオプション足すだけで解決する
つーか、初期の頃はちゃんとそう説明する奴が居たはずだけどな…
■ このスレッドは過去ログ倉庫に格納されています