シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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.illumos.org/source/xref/illumos-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
http://echo.2ch.net/test/read.cgi/unix/1439563321/
シェルスクリプト総合 その26 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/03/20(月) 12:07:26.41
2018/03/20(火) 08:25:32.50
「AACの場合」の前後の fi と if ... の2行を else に置き換えた上で、mediainfo コマンドの直後に
「HE-AAC だった場合」以降の if/else 文を移動、ではだめかな。
$? はすぐに別のコマンドの結果を格納してしまうので、
. mediainfo ...
. MEDIAINFO_RET=$?
. ...
. if [ $MEDIAINFO_RET = 0 ] ; then ...
みたいにコマンド実行直後に別の変数に回収してみるといいかもね。
「HE-AAC だった場合」以降の if/else 文を移動、ではだめかな。
$? はすぐに別のコマンドの結果を格納してしまうので、
. mediainfo ...
. MEDIAINFO_RET=$?
. ...
. if [ $MEDIAINFO_RET = 0 ] ; then ...
みたいにコマンド実行直後に別の変数に回収してみるといいかもね。
2018/03/20(火) 10:06:24.97
2018/03/20(火) 11:43:54.77
2018/03/20(火) 12:10:20.27
for文脱出したいだけならbreak
2018/03/21(水) 02:19:38.65
2018/03/21(水) 02:54:50.71
>>697
今回みたいなエラー処理の場合はexitした方が良いかもね
今回みたいなエラー処理の場合はexitした方が良いかもね
2018/03/21(水) 09:34:02.98
>>698
なるほどです
なるほどです
2018/03/21(水) 23:13:42.44
>>690
>>691
>>693
上の場合はmediainfoの終了ステイタスで判断して次にさらにif〜と進んでいるんですが、
LCかHE-AACかそのどっちでも無いかをcace〜muxer〜っとやるほうが確実なのかなと思いました。
その場合、
mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'
で出てきた文字列をcaseに渡したいんですが、
case HOGE in
"*: LC" ) muxer〜;;
"*: HE-AAC / LC" ) muxer〜;;
* ) "AACではない";;
ecase
だった場合、HOGEにはどう書けばいいんでしょうか?
>>691
>>693
上の場合はmediainfoの終了ステイタスで判断して次にさらにif〜と進んでいるんですが、
LCかHE-AACかそのどっちでも無いかをcace〜muxer〜っとやるほうが確実なのかなと思いました。
その場合、
mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'
で出てきた文字列をcaseに渡したいんですが、
case HOGE in
"*: LC" ) muxer〜;;
"*: HE-AAC / LC" ) muxer〜;;
* ) "AACではない";;
ecase
だった場合、HOGEにはどう書けばいいんでしょうか?
2018/03/22(木) 00:30:54.25
>>700
HOGE=$(mediainfo $FILE | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/‘)
mediainfoの出力をgrepでFormat profileの行だけに絞って
それをsedで必要な箇所だけ置換して変数に入れてる
円マークはバックスラッシュに変換してね
HOGE=$(mediainfo $FILE | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/‘)
mediainfoの出力をgrepでFormat profileの行だけに絞って
それをsedで必要な箇所だけ置換して変数に入れてる
円マークはバックスラッシュに変換してね
2018/03/22(木) 00:40:17.02
sedじゃなくbashのstring manipulationを使いたければ
HOGE=$(mediainfo “$FILE” | grep -E '^Format profile')
case ${HOGE##*:} in
…
${HOGE##*:} はHOGE内の文字列を先頭から”:”まで最長一致で取り除く
HOGE=$(mediainfo “$FILE” | grep -E '^Format profile')
case ${HOGE##*:} in
…
${HOGE##*:} はHOGE内の文字列を先頭から”:”まで最長一致で取り除く
2018/03/22(木) 00:59:34.53
自己レス
HOGE=`mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'`
case $HOGE in
これで大丈夫そうですね
HOGE=`mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'`
case $HOGE in
これで大丈夫そうですね
2018/03/22(木) 01:02:19.80
2018/03/22(木) 01:26:33.69
文字列を1文字ずつ処理するってどうやれば良いのかな?
2018/03/22(木) 01:26:58.52
なるべく速い方法で
2018/03/22(木) 01:40:38.44
先頭の一文字を削除するっていうのはできるんだけどなぁ。
一文字削除したらな、その削除した一文字を取りたいものだ
あ、POSIXの話ね
一文字削除したらな、その削除した一文字を取りたいものだ
あ、POSIXの話ね
2018/03/22(木) 01:43:14.01
あ、これでいけるのか
str=abcdefg
last=${a##?}
echo ${str%%$last}
str=abcdefg
last=${a##?}
echo ${str%%$last}
2018/03/22(木) 01:43:57.68
exprが柔軟かな
2018/03/22(木) 02:17:21.19
grep -o .
2018/03/22(木) 02:28:14.30
>>706
速いかどうか分からんけど awk でやるなら
printf 'Hello\nWorld\n' | awk -F '' '{for(i=1;i<=NF;i++) print $i}'
とかかなぁ。grep -Eo '.' ってのもあるけど
for c in $(printf 'Hello\nWorld\n' | grep -Eo '.')
do
echo "$c"
done
あとは fold コマンドとかで。
printf 'Hello\nWorld\n' | fold -w1
速いかどうか分からんけど awk でやるなら
printf 'Hello\nWorld\n' | awk -F '' '{for(i=1;i<=NF;i++) print $i}'
とかかなぁ。grep -Eo '.' ってのもあるけど
for c in $(printf 'Hello\nWorld\n' | grep -Eo '.')
do
echo "$c"
done
あとは fold コマンドとかで。
printf 'Hello\nWorld\n' | fold -w1
2018/03/22(木) 02:37:08.12
間違えてた
str=abcdefg
last=${str##?}
echo ${str%%$last}
str=abcdefg
last=${str##?}
echo ${str%%$last}
2018/03/22(木) 02:39:35.06
>>712
後出しだけど、意外と改行まで1文字として扱うのは大変なんだよね
後出しだけど、意外と改行まで1文字として扱うのは大変なんだよね
2018/03/22(木) 02:48:27.27
改行を扱いたい場合は bash か zsh の read かな。
printf 'Hello\nWorld\n' | while read -r -n 1 c;do echo "$c"; done
awk の場合は RS に '\0' をセットすればいいかも
printf 'Hello\nWorld\n' | awk -vRS='\0' -F '' '{for(i=1;i<=NF;i++) print $i}'
printf 'Hello\nWorld\n' | while read -r -n 1 c;do echo "$c"; done
awk の場合は RS に '\0' をセットすればいいかも
printf 'Hello\nWorld\n' | awk -vRS='\0' -F '' '{for(i=1;i<=NF;i++) print $i}'
2018/03/24(土) 18:09:58.40
公開するようなシェルスクリプトって--helpオプションくらいは付けたほうがいいかな。
問答無用で第一引数をファイル名やらURLやらだと解釈するほうがはるかに楽だし簡潔になるんだけども。
問答無用で第一引数をファイル名やらURLやらだと解釈するほうがはるかに楽だし簡潔になるんだけども。
2018/03/24(土) 18:17:47.94
オプションで思い出した。
オプションの解析めんどくせーとか思って他の言語のライブラリを参考に
オプション解析のライブラリを作ろうかと思ってるんだが、
getoptやgetopts程度だと使いやすくなった気がしないし、
作った所でそんなに簡単に書けるようなもんでもなさそうで、
何のためにコレが必要なんだ?って思いなした結果
他言語にあるようなライブラリは、--helpを半自動で
生成してくれるものだと思ってたりする
でももう少しオプションの解析楽にならないかな?
どうすればいいんだろう
オプションの解析めんどくせーとか思って他の言語のライブラリを参考に
オプション解析のライブラリを作ろうかと思ってるんだが、
getoptやgetopts程度だと使いやすくなった気がしないし、
作った所でそんなに簡単に書けるようなもんでもなさそうで、
何のためにコレが必要なんだ?って思いなした結果
他言語にあるようなライブラリは、--helpを半自動で
生成してくれるものだと思ってたりする
でももう少しオプションの解析楽にならないかな?
どうすればいいんだろう
2018/03/25(日) 01:51:02.53
ある文字列のハッシュ値を求めたいんですけど
どのLinux/UNIX/FreeBSDでも標準ではいってる
ハッシュ化コマンドって何がありますかね?
それからPOSIX標準コマンド?みたいなものってあるんですか?
どこでも絶対はいっていなければいけないコマンドとか
どのLinux/UNIX/FreeBSDでも標準ではいってる
ハッシュ化コマンドって何がありますかね?
それからPOSIX標準コマンド?みたいなものってあるんですか?
どこでも絶対はいっていなければいけないコマンドとか
2018/03/25(日) 02:25:15.03
720700
2018/03/25(日) 02:29:04.48 DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR='$TMPDIR/backup_%DATE'
#echo "$DATE"
mkdir $TMPDIR/backup_$DATE
cp -rfp /home/atashi/doc $BAKDIR
これだとcpが出来ないんですがどこが間違えていますか?
TMPDIR='/tmp'
BAKDIR='$TMPDIR/backup_%DATE'
#echo "$DATE"
mkdir $TMPDIR/backup_$DATE
cp -rfp /home/atashi/doc $BAKDIR
これだとcpが出来ないんですがどこが間違えていますか?
2018/03/25(日) 02:29:55.81
ない
722700
2018/03/25(日) 02:34:52.38 最後の行は
cp -rfp /home/atashi/doc $BAKDIR/docです
cp -rfp /home/atashi/doc $BAKDIR/docです
2018/03/25(日) 02:41:09.90
2018/03/25(日) 02:44:00.47
2018/03/25(日) 02:44:27.17
あ、かぶったw
726700
2018/03/25(日) 03:03:57.652018/03/25(日) 03:13:28.38
>>726
シェル シングルクォートとダブルクォートの違い 辺りでググってみて
シェル シングルクォートとダブルクォートの違い 辺りでググってみて
728700
2018/03/25(日) 03:17:52.62 DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR="$TMPDIR/backup_$DATE"
echo "$TMPDIR"
mkdir "$BAKDIR"
echo "$BAKDIR"
>>727
出来ました!
どうもありがとうございました。
$ ./test.sh
/tmp
/tmp/backup_201803250316
TMPDIR='/tmp'
BAKDIR="$TMPDIR/backup_$DATE"
echo "$TMPDIR"
mkdir "$BAKDIR"
echo "$BAKDIR"
>>727
出来ました!
どうもありがとうございました。
$ ./test.sh
/tmp
/tmp/backup_201803250316
729700
2018/03/25(日) 04:07:06.26 上の後に
cp -rfp /home/hoge/doc $BAK_DIR/doc
zip -r $BAK_DIR.zip $BAK_DIR
をやるとzipを解凍してみたら
tmpフォルダが出来てその中にbackup_201803250348フォルダが出来ているんですが、
zipを解凍したらbackup_201803250348フォルダが出来るようにするにはどうしたらいいですか?
cp -rfp /home/hoge/doc $BAK_DIR/doc
zip -r $BAK_DIR.zip $BAK_DIR
をやるとzipを解凍してみたら
tmpフォルダが出来てその中にbackup_201803250348フォルダが出来ているんですが、
zipを解凍したらbackup_201803250348フォルダが出来るようにするにはどうしたらいいですか?
2018/03/25(日) 09:39:54.86
( cd $TMPDIR ; zip -r backup_$DATE.zip backup_$DATE )
2018/03/25(日) 16:41:32.60
すみません、timeoutコマンドのうまい使い方を教えてください
シェルの中でtimeoutでタイムアウトさせた場合、シェル丸ごとごと落ちてしまいます
タイムアウトさせた上で処理を分岐させて継続して処理させるにはどう制御したら良いのでしょうか
timeout unzip || func_hoge
といった感じで一応回避できたのですが、関数処理が終わると丸ごとプロセスキルされる事には変わらず、綺麗に終わらすことができません
シェルの中でtimeoutでタイムアウトさせた場合、シェル丸ごとごと落ちてしまいます
タイムアウトさせた上で処理を分岐させて継続して処理させるにはどう制御したら良いのでしょうか
timeout unzip || func_hoge
といった感じで一応回避できたのですが、関数処理が終わると丸ごとプロセスキルされる事には変わらず、綺麗に終わらすことができません
2018/03/25(日) 16:54:52.07
timeoutコマンドを実行したシェルは落ちないよ
$ timeout 1 unzip … としたときに
タイムアウト後にunzipのプロセスがキルされると困るって話??
$ timeout 1 unzip … としたときに
タイムアウト後にunzipのプロセスがキルされると困るって話??
2018/03/25(日) 17:56:56.40
https://linuxjm.osdn.jp/html/GNU_coreutils/man1/timeout.1.html
コマンドがタイムアウトした場合で、かつ --preserve-status が設定されていない場合、 終了ステータスは 124 になります。
コマンドがタイムアウトした場合で、かつ --preserve-status が設定されていない場合、 終了ステータスは 124 になります。
2018/03/25(日) 19:03:35.42
>>732
紛らわしい書き方をしてすみませんでした
シェルスクリプトです
今環境がないので具体的な結果を示せませんが、例えば以下のような処理を実行するとtimeoutがプロセスを落とした(?)メッセージがコンソール出力された後、後続のechoは何も表示されません
#/bin/bash
timeout 1 unzip piyo.zip
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
紛らわしい書き方をしてすみませんでした
シェルスクリプトです
今環境がないので具体的な結果を示せませんが、例えば以下のような処理を実行するとtimeoutがプロセスを落とした(?)メッセージがコンソール出力された後、後続のechoは何も表示されません
#/bin/bash
timeout 1 unzip piyo.zip
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
2018/03/25(日) 19:19:17.27
>>734
んー。こっちでは表示されるけれども…
Script started on 2018年03月25日 19時18分12秒
testuser@debian:~/var/tmp/temp$ cat ./to.sh
#! /bin/sh -
timeout 1 sleep 10
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
testuser@debian:~/var/tmp/temp$ ./to.sh
hoge
owata
testuser@debian:~/var/tmp/temp$ exit
exit
Script done on 2018年03月25日 19時18分30秒
んー。こっちでは表示されるけれども…
Script started on 2018年03月25日 19時18分12秒
testuser@debian:~/var/tmp/temp$ cat ./to.sh
#! /bin/sh -
timeout 1 sleep 10
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
testuser@debian:~/var/tmp/temp$ ./to.sh
hoge
owata
testuser@debian:~/var/tmp/temp$ exit
exit
Script done on 2018年03月25日 19時18分30秒
2018/03/25(日) 22:27:12.96
ていうか
BAKDIR
がいつから
BAK_DIR
になったんだ
BAKDIR
がいつから
BAK_DIR
になったんだ
2018/03/25(日) 22:38:36.41
このコードってvalidですよね?
やってること・・・foo関数が最初に呼ばれた時に
OS判定(相当)のことをして、OS毎に処理を切り替えて実行
関数を上書きすることで、次回以降は判定することなく処理実行
#!/bin/sh
foo() {
echo first call
os_type=linux
[ $os_type = linux ] && \
foo() {
echo linux
}
[ $os_type = mac ] && \
foo() {
echo mac
}
foo
}
foo
foo
やってること・・・foo関数が最初に呼ばれた時に
OS判定(相当)のことをして、OS毎に処理を切り替えて実行
関数を上書きすることで、次回以降は判定することなく処理実行
#!/bin/sh
foo() {
echo first call
os_type=linux
[ $os_type = linux ] && \
foo() {
echo linux
}
[ $os_type = mac ] && \
foo() {
echo mac
}
foo
}
foo
foo
2018/03/25(日) 22:53:06.94
2018/03/26(月) 08:52:17.43
くだらないtypoしていたに一票。
変だと思ったら、
sh -x スクリプト名
でなにやってるか眺めてみることをオススメする。
勿論、標準エラーを /dev/null に捨てたりするのもナシで。
変だと思ったら、
sh -x スクリプト名
でなにやってるか眺めてみることをオススメする。
勿論、標準エラーを /dev/null に捨てたりするのもナシで。
2018/03/26(月) 11:04:26.16
再確認してきました
実際にはリンク先の48,49行目のログ整形のための処理で問題が起こっているようです
timeout自体の問題ではないので一旦取り下げます、ご協力ありがとうございました
https://pastebin.com/F5QC2Yu5
実際にはリンク先の48,49行目のログ整形のための処理で問題が起こっているようです
timeout自体の問題ではないので一旦取り下げます、ご協力ありがとうございました
https://pastebin.com/F5QC2Yu5
2018/03/26(月) 11:13:47.05
ワロタw
fail() {
case "$1" in
0)
echo "Info :$2"
;;
1)
echo "Warn :$2"
;;
2)
echo "Error:$2"
;;
3)
echo "Success :$2"
exit 0
;;
4)
echo "Fatal:$2"
exit 1
;;
略
esac
}
fail() {
case "$1" in
0)
echo "Info :$2"
;;
1)
echo "Warn :$2"
;;
2)
echo "Error:$2"
;;
3)
echo "Success :$2"
exit 0
;;
4)
echo "Fatal:$2"
exit 1
;;
略
esac
}
2018/03/26(月) 11:16:57.86
failwww ひどいなw
fail 0 " **** test start ****"
WAIT_SEC=5
time timeout -sKILL ${WAIT_SEC} unzip -t /home/xxxx/crypto.zip
if [ $? -ne 0 ]; then
fail 2 "hage"
else
fail 0 "hoge"
fi
fail 3 "**** test end ****"
fail 0 " **** test start ****"
WAIT_SEC=5
time timeout -sKILL ${WAIT_SEC} unzip -t /home/xxxx/crypto.zip
if [ $? -ne 0 ]; then
fail 2 "hage"
else
fail 0 "hoge"
fi
fail 3 "**** test end ****"
2018/03/26(月) 11:20:23.93
おお、是非原因と対処法も書いてってください
2018/03/26(月) 11:22:56.42
failなのにsuccessなのか…
2018/03/26(月) 11:47:56.48
2018/03/26(月) 12:55:45.54
2018/03/27(火) 02:35:57.99
あー、ちくしょ、
ローカルでもリモートでも使うスクリプトを
置くディレクトリ名が決まらない
ローカルだけで使うスクリプト
リモートだけで使うスクリプト
両方で使うスクリプト
どういうディレクトリ構成にしよう
Windowsも考慮したいから
シンボリックリンクは使いたくない
ローカルでもリモートでも使うスクリプトを
置くディレクトリ名が決まらない
ローカルだけで使うスクリプト
リモートだけで使うスクリプト
両方で使うスクリプト
どういうディレクトリ構成にしよう
Windowsも考慮したいから
シンボリックリンクは使いたくない
2018/03/27(火) 02:56:48.81
またお前か
2018/03/27(火) 19:30:16.58
2018/03/27(火) 20:19:33.81
なんか冗長な感じ
2018/03/27(火) 21:50:15.67
うちは~/share/public/sbin/
2018/03/27(火) 22:20:21.84
あんまり良くないのかもしれんが……
/srvを特定の一般ユーザに対して書込可にして、
/srv/git/github.com/<account name>/dotfiles (GitHubで管理するなら)
にしてる。
/srvを特定の一般ユーザに対して書込可にして、
/srv/git/github.com/<account name>/dotfiles (GitHubで管理するなら)
にしてる。
754名無しさん@お腹いっぱい。
2018/03/27(火) 23:56:34.98 >>753そんなことしてまで/srvに置く意味あんの
2018/03/28(水) 14:37:11.36
>>748
なぜ/usr/remote/binじゃダメなのか 理由を知りたい
なぜ/usr/remote/binじゃダメなのか 理由を知りたい
2018/03/29(木) 01:01:26.37
2018/03/29(木) 02:51:11.17
findのprint0やった、NULL文字区切りのファイル名一覧って
POSIXのreadじゃ読み取れないんだな-dオプションがないから
つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
考慮するとPOSIXの範囲じゃ対応不可能ってことなのか
POSIXのreadじゃ読み取れないんだな-dオプションがないから
つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
考慮するとPOSIXの範囲じゃ対応不可能ってことなのか
2018/03/29(木) 03:44:39.70
2018/03/29(木) 09:47:58.90
2018/03/29(木) 09:57:03.22
\0区切りもshそのものの機能じゃなくね?
2018/03/29(木) 10:03:19.16
空白制御文字入りファイル名は
for i in *
で扱えるので、工夫次第だな。
findと組み合わせるには-print0は役に立たんから-execで頑張るしかないけど。
for i in *
で扱えるので、工夫次第だな。
findと組み合わせるには-print0は役に立たんから-execで頑張るしかないけど。
2018/03/29(木) 10:30:24.37
\0区切りがなんのコマンドによる出力かどうかは
今は関係ないんだよ。
いろんなコマンドでよく使われる\0区切りのデータに
shが対応していないって話をしているんだから
で調べてみたらawkもポータブルな方法では
\0区切りには対応してないようだな
今は関係ないんだよ。
いろんなコマンドでよく使われる\0区切りのデータに
shが対応していないって話をしているんだから
で調べてみたらawkもポータブルな方法では
\0区切りには対応してないようだな
2018/03/29(木) 11:35:38.17
2018/03/29(木) 11:37:07.53
2018/03/29(木) 11:39:23.23
MacOSのsed (bsd)も\0扱えないっぽい
まあもともと\0はC言語の終端文字だしな
そんなのが扱えるほうがおかしいか
まあもともと\0はC言語の終端文字だしな
そんなのが扱えるほうがおかしいか
2018/03/29(木) 11:44:03.16
2018/03/29(木) 11:51:22.35
>>766
改行じゃなくて \0 の話をしてるのか。
POSIXではシステムコールの仕様上、 \0 をファイル名に入れることは決してできない。
だから、ファイル名に \0 を使う話をすること自体が、POSIX的にナンセンス。
改行じゃなくて \0 の話をしてるのか。
POSIXではシステムコールの仕様上、 \0 をファイル名に入れることは決してできない。
だから、ファイル名に \0 を使う話をすること自体が、POSIX的にナンセンス。
2018/03/29(木) 11:55:53.07
2018/03/29(木) 11:59:26.26
2018/03/29(木) 12:20:16.06
は?バカなのかこいつ?
2018/03/29(木) 12:38:36.81
なんで改行の入ったファイル名を扱うために、シェルが \0 を文字列の一部として
扱う必要があるなんていうアサッテの発想にいたるのか…
(まあプログラミングができないせいで分かってないんだろうけど)
もうちょっと態度がまともなら、ポータブルなやり方を具体的に教えてやっても
いいが、 >>770 みたいな煽りは嫌いなので教えてやらないw
扱う必要があるなんていうアサッテの発想にいたるのか…
(まあプログラミングができないせいで分かってないんだろうけど)
もうちょっと態度がまともなら、ポータブルなやり方を具体的に教えてやっても
いいが、 >>770 みたいな煽りは嫌いなので教えてやらないw
2018/03/29(木) 12:40:47.01
findのprint0で出てくる/0区切りのファイル名一覧がreadで読み取れないンゴ…
2018/03/29(木) 12:50:37.16
そもそも -print0 の出力をそのままの形でポータブルに
read で読めるんじゃないかと考えること自体が間違い。
POSIXで規定されている read のオプションは -r だけで
-d はないので、改行を含む文字列をそのままで read だけを
使って単一の文字列変数に取り込むことは、ポータブルには
できない。
もちろん、だからといって sh で改行を含む文字列を扱えない
なんてことにはならないのは言うまでもない。
read で読めるんじゃないかと考えること自体が間違い。
POSIXで規定されている read のオプションは -r だけで
-d はないので、改行を含む文字列をそのままで read だけを
使って単一の文字列変数に取り込むことは、ポータブルには
できない。
もちろん、だからといって sh で改行を含む文字列を扱えない
なんてことにはならないのは言うまでもない。
2018/03/29(木) 12:54:44.85
>>771
無知ごくろうさんw
無知ごくろうさんw
2018/03/29(木) 12:56:17.18
やっと>>757が言ったことに追いついたのか?
2018/03/29(木) 13:05:43.31
773って757が言ったことを冗長に言い換えただけだなw
2018/03/29(木) 13:11:26.76
2018/03/29(木) 13:21:49.15
> findのprint0やった、NULL文字区切りのファイル名一覧って
> POSIXのreadじゃ読み取れないんだな-dオプションがないから
ここまでは正しい。しかし、
> つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
> 考慮するとPOSIXの範囲じゃ対応不可能ってことなのか
これが xargs の文章であれば、その通り。
しかしこれが sh についての文章であれば、完璧に間違い。
これだけ繰り返し指摘されてもいまだに理解できないような奴でも
Bourne shell でスクリプトを書くようになったんだなという変な感慨があるな。
> POSIXのreadじゃ読み取れないんだな-dオプションがないから
ここまでは正しい。しかし、
> つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
> 考慮するとPOSIXの範囲じゃ対応不可能ってことなのか
これが xargs の文章であれば、その通り。
しかしこれが sh についての文章であれば、完璧に間違い。
これだけ繰り返し指摘されてもいまだに理解できないような奴でも
Bourne shell でスクリプトを書くようになったんだなという変な感慨があるな。
2018/03/29(木) 13:24:21.25
2018/03/29(木) 13:26:26.64
>>778はxargsが\0扱えることも知らなそうw
2018/03/29(木) 13:30:47.80
これだけヒント書いてるのに、いまだに
「そのままの形だと read で扱えない」
と
「sh だとできない」
が等価だと主張しているのは、アホの子なのか、
煽れば答を教えてもらえると期待しているのか、
どっちなんだろうね。
「そのままの形だと read で扱えない」
と
「sh だとできない」
が等価だと主張しているのは、アホの子なのか、
煽れば答を教えてもらえると期待しているのか、
どっちなんだろうね。
2018/03/29(木) 13:36:00.29
>>780
POSIX の xargs に -0 オプションは規定されてないので、
「ポータブル」という条件下ではできない。
まあ POSIX の find に -print0 オプションが入ったのもわりと最近なので、
そのうち xargs でも待ってればそのうち -0 が追加されるとは思うが。
POSIX の xargs に -0 オプションは規定されてないので、
「ポータブル」という条件下ではできない。
まあ POSIX の find に -print0 オプションが入ったのもわりと最近なので、
そのうち xargs でも待ってればそのうち -0 が追加されるとは思うが。
2018/03/29(木) 13:39:13.18
答えはfor in * を使うこと
俺が代わりに答えておいてやるよ
なおshで\0を使うと言う答えではない
俺が代わりに答えておいてやるよ
なおshで\0を使うと言う答えではない
2018/03/29(木) 13:41:04.45
POSIXはprint0に対応する前に
ファイル名に制御文字を使用できないようにしろ
ファイル名に制御文字を使用できないようにしろ
2018/03/29(木) 13:53:52.47
賛成
2018/03/29(木) 14:01:21.67
for使ってfindっぽいものを自作したとして
それをパイプで別コマンドに流そうとした時に
またファイル名に改行が含まれていた時問題が発生するんだよな
それをパイプで別コマンドに流そうとした時に
またファイル名に改行が含まれていた時問題が発生するんだよな
2018/03/29(木) 15:15:24.81
for で書くのなら、その結果のファイル名をわざわざ
他のプロセスにパイプで渡すなんてことはせずに、
そのシェル自身で処理するか、
あるいは他のプロセスに渡すなら引数を使え
ってだけの話だな。
>>761 が既に書いてる話なのに、なんでそこから
35コメも無駄に費やされてるんだか。
他のプロセスにパイプで渡すなんてことはせずに、
そのシェル自身で処理するか、
あるいは他のプロセスに渡すなら引数を使え
ってだけの話だな。
>>761 が既に書いてる話なのに、なんでそこから
35コメも無駄に費やされてるんだか。
2018/03/29(木) 15:18:45.25
ちなみに for で書く以外のやりかたもあるけど、
これも >>761 が既に最後の文で書いてる。
これも >>761 が既に最後の文で書いてる。
2018/03/29(木) 15:30:33.97
posixの範囲じゃ改行が含まれたファイル名を
パイプでつなげられないってことかな
パイプでつなげられないってことかな
2018/03/29(木) 15:56:18.36
>>789
「POSIXの範囲内じゃ」は誤解を招く表現で、正確には
「POSIX Shell & Utilities の範囲内じゃ」だな。
「POSIX System Interfaces」を使えば問題なくできるからな。
まあシェルのスレなわけで「POSIXの範囲内じゃ」でも間違いとまでは言えないが。
あと、find -print0 が POSIX で規定されたってのは間違いだった。
そういう拡張もあることも言及はされてるが、規定には追加されていない。
でもって POSIX 的には「find -print0 | xargs -0」じゃなくて、
「find -exec コマンド {} +」を使えってことになってる。
「POSIXの範囲内じゃ」は誤解を招く表現で、正確には
「POSIX Shell & Utilities の範囲内じゃ」だな。
「POSIX System Interfaces」を使えば問題なくできるからな。
まあシェルのスレなわけで「POSIXの範囲内じゃ」でも間違いとまでは言えないが。
あと、find -print0 が POSIX で規定されたってのは間違いだった。
そういう拡張もあることも言及はされてるが、規定には追加されていない。
でもって POSIX 的には「find -print0 | xargs -0」じゃなくて、
「find -exec コマンド {} +」を使えってことになってる。
2018/03/29(木) 16:20:44.05
でも、find -exec じゃシェル関数に渡せないからなぁ
findは諦めろってことかな
findは諦めろってことかな
2018/03/29(木) 16:44:16.87
find を諦めるんじゃくて、シェル関数の方をあきらめて、独立したシェルスクリプトにしろってことだよ。
find -exec コマンド {} \;
だとコマンドの起動回数が多いからシェルスクリプトにすると遅いのが問題になるけど、
find -exec コマンド {} +
ならコマンド起動回数は相当に減るから、独立したシェルスクリプトにしても特に問題はない。
find -exec コマンド {} \;
だとコマンドの起動回数が多いからシェルスクリプトにすると遅いのが問題になるけど、
find -exec コマンド {} +
ならコマンド起動回数は相当に減るから、独立したシェルスクリプトにしても特に問題はない。
793名無しさん@お腹いっぱい。
2018/03/29(木) 21:07:16.05 AWKの区切り記号をヌル文字にすればいいんでは。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 働いて働いて働いても生活は…円安に歯止めが掛からず生活は苦しくなるばかり…サナエノミクスの限界で「高市不況」がやってくる ★6 [ぐれ★]
- 小林よしのり 日中関係、来年は「ますます日本は不利に」「加害者の分際で被害者ぶって、中国が横暴だと毅然と振る舞っても滑稽なだけ」 [冬月記者★]
- 日中対立、打開策見えず 高市氏答弁1カ月、影響拡大 ★2 [蚤の市★]
- 2026年はゲーム機やPC、スマホが一斉値上げか メモリ大手ブランド「Crucial」廃止の衝撃 [樽悶★]
- 【サッカー】カズ・三浦知良、現役続行を表明 SNSで『引退勧告』殺到も… 対戦した選手「スピード、キレはないが体の使い方はうまい」 [冬月記者★]
- 『DOWNTOWN+』2回目生配信で松本の実兄・松本隆博が登場し共演 [jinjin★]
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap613
- 【DAZN】フォーミュラGP【F1 2 3 SF P】Lap1821
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap614
- とらせんIP ★3
- こいせん 全レス転載禁止
- ハム専 サヨナラ石井
- 【画像】兎田ぺこーら主催マイクラ企画の参加メンバーwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- 参政党神谷「日本は領土が狭いのに人口1億2500万人はかなり多いんですよ!江戸時代なんて3000万人だったんですよ!」 [931948549]
- 生活保護者「今月35万円振り込まれた。この税金で人生やり直す」→底辺労働層ブチギレ [834922174]
- おバカなリズム🎶とおバカなダンス💃で、サタデーナイト🌃にバカテンポ🏡
- 国民・玉木雄一郎「日本は台湾を国家として正式に承認していないため、台湾への攻撃だけでは存立危機事態にはなりません」と世界に発信 [594040874]
- マルフォイ役俳優「今でも髪の毛があるのは奇跡」役のため9日ごとにブリーチ [498389267]
