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


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

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



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:07:26.41 .net]
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
echo.2ch.net/test/read.cgi/unix/1439563321/

704 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:02:30.98 .net]
壊れた動画探しに
ffmpeg -i input -f null /dev/null 2>&1 | grep -m 1 -Ii error
ffmpeg -i input -f null /dev/null 2>&1 | grep -q -i error
とやったのですけれど、grepにヒットしてもffmpegの動画読み込みが止まりません。
grepにヒットしたらffmpegを止めるにはどうすればいいのか。
いいアイデアはないですか。

705 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:45:03.71 .net]
この手が使えるのではないか
https://stackoverflow.com/questions/7178888/grep-q-not-exiting-with-tail-f

706 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 14:52:10.70 .net]
ffmpeg -xerror は使えないんだっけ
‘-xerror (global)’
Stop and exit on error

707 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 00:41:07.30 .net]
bashがどうしても使えない化石サーバは廃品回収へ

708 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 01:44:18.89 .net]
新Mac板から来ました。
カレントディレクトリ内にaacファイルがあれば、mediainfoでHE-AACかLC-AACか調査して、
l-smash muxerを使ってHE-AACとLC-AACでは別のコマンドにてm4aに詰め込みたいです。

以下のままだと、aacが無い場合は
-----
aacファイルはありません.
-----
iTunes MP4 muxing mode
./test.sh: 3 行: 27777 Segmentation fault: 11 muxer -i $file 〜
と表示されてしまいます。

AACファイルがない場合はmuxerのコマンドに進まないようにするにはどう書くといいん

709 名前:でしょうか?

続く
[]
[ここ壊れてます]

710 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 01:44:57.18 .net]
続き

#!/usr/bin/env bash

for file in *.aac; do
if [ -e $file ] ; then
# aacファイルが存在する場合
mediainfo $file | grep '^Format profile *: LC$' >/dev/null 2>&1
#es=$?
else
echo "-----"
# aacファイルが存在しない場合
echo "aacファイルはありません."
fi
#------------------------------------
# HE-AACだった場合
if [ $? = 1 ] ; then
echo "-----"
muxer -i $file?sbr --file-format m4a -o ${file%.aac}.m4a
fi
#------------------------------------
#AACの場合
if [ $? = 0 ] ; then
echo "-----"
muxer -i $file --file-format m4a -o ${file%.aac}.m4a
fi
# .aacで終わるファイル名だけど、HEでもLEでもどちらでも無い場合はどうやるんだろうか
done

711 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 06:10:19.91 .net]
$1は本当に直前に実行したのコマンドのステータスしか入らないから注意
ifで比較する前にecho $1で何が入ってるか確かめてごらん
それをふまえて論理構造組み直しな

712 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 08:25:32.50 .net]
「AACの場合」の前後の fi と if ... の2行を else に置き換えた上で、mediainfo コマンドの直後に
「HE-AAC だった場合」以降の if/else 文を移動、ではだめかな。

$? はすぐに別のコマンドの結果を格納してしまうので、
. mediainfo ...
. MEDIAINFO_RET=$?
. ...
. if [ $MEDIAINFO_RET = 0 ] ; then ...
みたいにコマンド実行直後に別の変数に回収してみるといいかもね。



713 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 10:06:24.97 .net]
>>690,>>692
ありがとう
早速試してみる

714 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 11:43:54.77 .net]
>>695
>>696
どうもありがとうございます
試してみます

ググっていたら、同じようにエラーが出る人がいて、testの[]を二重のカッコ[[]]にしてるようでした

今見返したら、es=$?でやってみようと思ってたのに途中になってたっぽいです

715 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/20(火) 12:10:20.27 .net]
for文脱出したいだけならbreak

716 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 02:19:38.65 .net]
>>695
>>696
うまくいきました。
どうもありがとうございます。

>>699
書き換え前のスクリプトで試しましたが、こちらもエラーが出ませんでした。
どうもありがとうございます。

オライリーの入門bashには、ループの終了にbreakを使うのは良くないと書いてありました。
それはなぜでしょうか?

717 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 02:54:50.71 .net]
>>700
今回みたいなエラー処理の場合はexitした方が良いかもね

718 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 09:34:02.98 .net]
>>701
なるほどです

719 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/21(水) 23:13:42.44 .net]
>>693
>>694
>>696

上の場合は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にはどう書けばいいんでしょうか?

720 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:30:54.25 .net]
>>703
HOGE=$(mediainfo $FILE | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/‘)

mediainfoの出力をgrepでFormat profileの行だけに絞って
それをsedで必要な箇所だけ置換して変数に入れてる
円マークはバックスラッシュに変換してね

721 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:40:17.02 .net]
sedじゃなくbashのstring manipulationを使いたければ

HOGE=$(mediainfo “$FILE” | grep -E '^Format profile')
case ${HOGE##*:} in


${HOGE##*:} はHOGE内の文字列を先頭から”:”まで最長一致で取り除く

722 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 00:59:34.53 .net]
自己レス

HOGE=`mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'`
case $HOGE in

これで大丈夫



723 名前:サうですね []
[ここ壊れてます]

724 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:02:19.80 .net]
>>704
>>705
どうもありがとうございます
今触れないので、あとでやってみます!

725 名前:700 mailto:sage [2018/03/22(木) 01:05:43.95 .net]
>>703
>>706
>>707
の3つは私です

726 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:26:33.69 .net]
文字列を1文字ずつ処理するってどうやれば良いのかな?

727 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:26:58.52 .net]
なるべく速い方法で

728 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:40:38.44 .net]
先頭の一文字を削除するっていうのはできるんだけどなぁ。
一文字削除したらな、その削除した一文字を取りたいものだ
あ、POSIXの話ね

729 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:43:14.01 .net]
あ、これでいけるのか

str=abcdefg
last=${a##?}
echo ${str%%$last}

730 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 01:43:57.68 .net]
exprが柔軟かな

731 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:17:21.19 .net]
grep -o .

732 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:28:14.30 .net]
>>709
速いかどうか分からんけど 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



733 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:37:08.12 .net]
間違えてた

str=abcdefg
last=${str##?}
echo ${str%%$last}

734 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:39:35.06 .net]
>>715
後出しだけど、意外と改行まで1文字として扱うのは大変なんだよね

735 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:48:27.27 .net]
改行を扱いたい場合は 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}'

736 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/24(土) 18:09:58.40 .net]
公開するようなシェルスクリプトって--helpオプションくらいは付けたほうがいいかな。
問答無用で第一引数をファイル名やらURLやらだと解釈するほうがはるかに楽だし簡潔になるんだけども。

737 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/24(土) 18:17:47.94 .net]
オプションで思い出した。
オプションの解析めんどくせーとか思って他の言語のライブラリを参考に
オプション解析のライブラリを作ろうかと思ってるんだが、
getoptやgetopts程度だと使いやすくなった気がしないし、
作った所でそんなに簡単に書けるようなもんでもなさそうで、
何のためにコレが必要なんだ?って思いなした結果
他言語にあるようなライブラリは、--helpを半自動で
生成してくれるものだと思ってたりする
でももう少しオプションの解析楽にならないかな?
どうすればいいんだろう

738 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 01:51:02.53 .net]
ある文字列のハッシュ値を求めたいんですけど
どのLinux/UNIX/FreeBSDでも標準ではいってる
ハッシュ化コマンドって何がありますかね?

それからPOSIX標準コマンド?みたいなものってあるんですか?
どこでも絶対はいっていなければいけないコマンドとか

739 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:25:15.03 .net]
POSIXってこれ?
pubs.opengroup.org/onlinepubs/9699919799/

740 名前:700 mailto:sage [2018/03/25(日) 02:29:04.48 .net]
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が出来ないんですがどこが間違えていますか?

741 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:29:55.81 .net]
ない

742 名前:700 mailto:sage [2018/03/25(日) 02:34:52.38 .net]
最後の行は
cp -rfp /home/atashi/doc $BAKDIR/docです



743 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:41:09.90 .net]
>>723
3行目の%が間違ってるよね?

あと
4行目でデバッグ用にechoすべきは$BAKDIR
5行目はmkdir “$BAKDIR”
一つ一つ確認したほうがいいよ

744 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:44:00.47 .net]
>>723
BAKDIR='$TMPDIR/backup_%DATE'

こうじゃない?

BAKDIR='$TMPDIR/backup_$DATE'

745 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 02:44:27.17 .net]
あ、かぶったw

746 名前:700 mailto:sage [2018/03/25(日) 03:03:57.65 .net]
>>726
>>727
ほんとだ。
$に直したんですが、

DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR='$TMPDIR/backup_$DATE'

echo "$TMPDIR"
#mkdir "$BAKDIR"
echo "$BAKDIR"

を実行すると、
$ ./hoge.sh
/tmp
$TMPDIR/backup_$DATE

になってしまって、ダメでした。

mkdir "$BAKDIR"
を入れると、カレントディレクトリに「$BAKDIR」というフォルダが出来てしまいました

747 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 03:13:28.38 .net]
>>729
シェル シングルクォートとダブルクォートの違い 辺りでググってみて

748 名前:700 mailto:sage [2018/03/25(日) 03:17:52.62 .net]
DATE=`date '+%Y%m%d%H%M'`
TMPDIR='/tmp'
BAKDIR="$TMPDIR/backup_$DATE"

echo "$TMPDIR"
mkdir "$BAKDIR"
echo "$BAKDIR"

>>730
出来ました!
どうもありがとうございました。

$ ./test.sh
/tmp
/tmp/backup_201803250316

749 名前:700 mailto:sage [2018/03/25(日) 04:07:06.26 .net]
上の後に
cp -rfp /home/hoge/doc $BAK_DIR/doc
zip -r $BAK_DIR.zip $BAK_DIR
をやるとzipを解凍してみたら
tmpフォルダが出来てその中にbackup_201803250348フォルダが出来ているんですが、
zipを解凍したらbackup_201803250348フォルダが出来るようにするにはどうしたらいいですか?

750 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 09:39:54.86 .net]
( cd $TMPDIR ; zip -r backup_$DATE.zip backup_$DATE )

751 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 16:41:32.60 .net]
すみません、timeoutコマンドのうまい使い方を教えてください

シェルの中でtimeoutでタイムアウトさせた場合、シェル丸ごとごと落ちてしまいます
タイムアウトさせた上で処理を分岐させて継続して処理させるにはどう制御したら良いのでしょうか

timeout unzip || func_hoge
といった感じで一応回避できたのですが、関数処理が終わると丸ごとプロセスキルされる事には変わらず、綺麗に終わらすことができません

752 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 16:54:52.07 .net]
timeoutコマンドを実行したシェルは落ちないよ
$ timeout 1 unzip … としたときに
タイムアウト後にunzipのプロセスがキルされると困るって話??



753 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 17:56:56.40 .net]
https://linuxjm.osdn.jp/html/GNU_coreutils/man1/timeout.1.html
コマンドがタイムアウトした場合で、かつ --preserve-status が設定されていない場合、 終了ステータスは 124 になります。

754 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 19:03:35.42 .net]
>>735
紛らわしい書き方をしてすみませんでした
シェルスクリプトです

今環境がないので具体的な結果を示せませんが、例えば以下のような処理を実行するとtimeoutがプロセスを落とした(?)メッセージがコンソール出力された後、後続のechoは何も表示されません

#/bin/bash
timeout 1 unzip piyo.zip
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata

755 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 19:19:17.27 .net]
>>737
んー。こっちでは表示されるけれども…
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秒

756 名前:700 mailto:sage [2018/03/25(日) 21:40:43.57 .net]
>>733
どうもありがとうございます

757 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:27:12.96 .net]
ていうか
BAKDIR
がいつから
BAK_DIR
になったんだ

758 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:38:36.41 .net]
このコードって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

759 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:53:06.94 .net]
>>738
なんででしょうね(´;ω;`)
もう一度見直してみます

760 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 08:52:17.43 .net]
くだらないtypoしていたに一票。
変だと思ったら、
sh -x スクリプト名
でなにやってるか眺めてみることをオススメする。
勿論、

761 名前:標準エラーを /dev/null に捨てたりするのもナシで。 []
[ここ壊れてます]

762 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:04:26.16 .net]
再確認してきました
実際にはリンク先の48,49行目のログ整形のための処理で問題が起こっているようです
timeout自体の問題ではないので一旦取り下げます、ご協力ありがとうございました

https://pastebin.com/F5QC2Yu5



763 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:13:47.05 .net]
ワロタ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
}

764 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:16:57.86 .net]
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 ****"

765 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:20:23.93 .net]
おお、是非原因と対処法も書いてってください

766 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:22:56.42 .net]
failなのにsuccessなのか…

767 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:47:56.48 .net]
>>747
原因・・・他人のコードを理解せずにパクって、行き当たりばったりにコード書き加えて、終わらすこと
対処法・・・ちゃんとコード読んで理解して無駄なものをなくせ

768 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 12:55:45.54 .net]
>>749
全く耳が痛い、実際そういうレベルだけど頑張るよ(´・ω・`)
> >は実際わけわからずに使ってるし

769 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 02:35:57.99 .net]
あー、ちくしょ、
ローカルでもリモートでも使うスクリプトを
置くディレクトリ名が決まらない

ローカルだけで使うスクリプト
リモートだけで使うスクリプト
両方で使うスクリプト

どういうディレクトリ構成にしよう
Windowsも考慮したいから
シンボリックリンクは使いたくない

770 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 02:56:48.81 .net]
またお前か

771 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 19:30:16.58 .net]
>>751
~/share/public/
に置いてる。

772 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 20:19:33.81 .net]
なんか冗長な感じ



773 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 21:50:15.67 .net]
うちは~/share/public/sbin/

774 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/27(火) 22:20:21.84 .net]
あんまり良くないのかもしれんが……
/srvを特定の一般ユーザに対して書込可にして、
/srv/git/github.com/<account name>/dotfiles (GitHubで管理するなら)
にしてる。

775 名前:名無しさん@お腹いっぱい。 [2018/03/27(火) 23:56:34.98 .net]
>>753そんなことしてまで/srvに置く意味あんの

776 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/28(水) 14:37:11.36 .net]
>>751
なぜ/usr/remote/binじゃダメなのか 理由を知りたい

777 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 01:01:26.37 .net]
>>758
逆になぜ/usr/remote/binなのかの理由が知りたい。
なにかのアプリケーションが使うの?

778 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 02:51:11.17 .net]
findのprint0やった、NULL文字区切りのファイル名一覧って
POSIXのreadじゃ読み取れないんだな-dオプションがないから

つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
考慮するとPOSIXの範囲じゃ対応不可能ってことなのか

779 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 03:44:39.70 .net]
>>760
なんで対応不可能だと思うんだよw
じゃあどうして「POSIXが」ファイル名に改行含め制御文字を許可してるんだよって話。
C99どころかシェルコマンド(awk)レベルで余裕で扱えますが

780 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 09:47:58.90 .net]
>>761
ひねくれた回答はいらないよ
ここはシェルスクリプト
POSIX shが対応してないって言ってんの

781 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 09:57:03.22 .net]
\0区切りもshそのものの機能じゃなくね?

782 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) ]
[ここ壊れてます]



783 名前:10:03:19.16 .net mailto: 空白制御文字入りファイル名は
for i in *
で扱えるので、工夫次第だな。
findと組み合わせるには-print0は役に立たんから-execで頑張るしかないけど。
[]
[ここ壊れてます]

784 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 10:30:24.37 .net]
\0区切りがなんのコマンドによる出力かどうかは
今は関係ないんだよ。
いろんなコマンドでよく使われる\0区切りのデータに
shが対応していないって話をしているんだから

で調べてみたらawkもポータブルな方法では
\0区切りには対応してないようだな

785 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:35:38.17 .net]
>>765
> いろんなコマンドでよく使われる\0区切りのデータ
って何がある?

786 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:37:07.53 .net]
>>765
shはポータブルな方法で対応してるぞ。
xargsは確かに対応してないが。
findについては>>764が書いてるように、遅くはなるもののポータブルな解はある。

xargs と sh の区別はつけようぜ。

787 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:39:23.23 .net]
MacOSのsed (bsd)も\0扱えないっぽい
まあもともと\0はC言語の終端文字だしな
そんなのが扱えるほうがおかしいか

788 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:44:03.16 .net]
>>767
xargsの話は誰もしてない
shは\0を変数に入れられない
shがポータブルな方法で\0文字に対応してるってのは嘘
(forは\0を使わない)

789 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:51:22.35 .net]
>>769
改行じゃなくて \0 の話をしてるのか。
POSIXではシステムコールの仕様上、 \0 をファイル名に入れることは決してできない。
だから、ファイル名に \0 を使う話をすること自体が、POSIX的にナンセンス。

790 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:55:53.07 .net]
>>770
> ファイル名に \0 を使う話
はお前しかしていないよ。

791 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 11:59:26.26 .net]
>>771
発端の>>761はファイル名に改行を入れる話だろう。
ファイル名中の改行をポータブルに扱う方法はshにある。
みんなちゃんとそう指摘してるのに君だけ勘違いしてる。

792 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:20:16.06 .net]
は?バカなのかこいつ?



793 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:38:36.81 .net]
なんで改行の入ったファイル名を扱うために、シェルが \0 を文字列の一部として
扱う必要があるなんていうアサッテの発想にいたるのか…
(まあプログラミングができないせいで分かってないんだろうけど)

もうちょっと態度がまともなら、ポータブルなやり方を具体的に教えてやっても
いいが、 >>773 みたいな煽りは嫌いなので教えてやらないw

794 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:40:47.01 .net]
findのprint0で出てくる/0区切りのファイル名一覧がreadで読み取れないンゴ…

795 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:50:37.16 .net]
そもそも -print0 の出力をそのままの形でポータブルに
read で読めるんじゃないかと考えること自体が間違い。
POSIXで規定されている read のオプションは -r だけで
-d はないので、改行を含む文字列をそのままで read だけを
使って単一の文字列変数に取り込むことは、ポータブルには
できない。

もちろん、だからといって sh で改行を含む文字列を扱えない
なんてことにはならないのは言うまでもない。

796 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:54:44.85 .net]
>>774
無知ごくろうさんw

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 12:56:17.18 .net]
やっと>>760が言ったことに追いついたのか?

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:05:43.31 .net]
773って757が言ったことを冗長に言い換えただけだなw

799 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:11:26.76 .net]
>>774
>なんで改行の入ったファイル名を扱うために、シェルが \0 を文字列の一部として
>扱う必要があるなんていうアサッテの発想にいたるのか…
find作ったやつに言えw

800 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:21:49.15 .net]
> findのprint0やった、NULL文字区切りのファイル名一覧って
> POSIXのreadじゃ読み取れないんだな-dオプションがないから

ここまでは正しい。しかし、

> つーことはファイル名に改行、そのた制御文字が入るかもしれないことを
> 考慮するとPOSIXの範囲じゃ対応不可能ってことなのか

これが xargs の文章であれば、その通り。
しかしこれが sh についての文章であれば、完璧に間違い。

これだけ繰り返し指摘されてもいまだに理解できないような奴でも
Bourne shell でスクリプトを書くようになったんだなという変な感慨があるな。

801 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:24:21.25 .net]
>>781
>これが xargs の文章であれば、その通り。
だれもxargsの話なんかしてない。(2回目) []
[ここ壊れてます]



803 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:26:26.64 .net]
>>781はxargsが\0扱えることも知らなそうw

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:30:47.80 .net]
これだけヒント書いてるのに、いまだに
「そのままの形だと read で扱えない」

「sh だとできない」
が等価だと主張しているのは、アホの子なのか、
煽れば答を教えてもらえると期待しているのか、
どっちなんだろうね。






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

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

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