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

このエントリーをはてなブックマークに追加
1名無しさん@お腹いっぱい。
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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.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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
2名無しさん@お腹いっぱい。:2013/11/03(日) 03:04:59.12
おつ
3名無しさん@お腹いっぱい。:2013/11/03(日) 08:20:00.06
bash なら exponent は ** なのにな
4名無しさん@お腹いっぱい。:2013/11/04(月) 13:06:48.63
case文を抜け出す方法はbashには無かったけど
ほかのシェルでcase文から抜け出す方法はある?
5名無しさん@お腹いっぱい。:2013/11/04(月) 15:04:59.50
;;でcaseから抜けるけど
6名無しさん@お腹いっぱい。:2013/11/05(火) 11:03:36.55
if [ $? -eq 0 ]; then

みんな、$? は""で囲う派? 囲わない派?
7名無しさん@お腹いっぱい。:2013/11/05(火) 18:10:47.33
普段は囲まないけど、誰かの書いたのをいじるときはそれに合わせるよ派
8名無しさん@お腹いっぱい。:2013/11/06(水) 07:06:35.01
数値なので囲わない派
9名無しさん@お腹いっぱい。:2013/11/06(水) 08:25:01.88
$前に0付ける派
10名無しさん@お腹いっぱい。:2013/11/06(水) 11:17:00.72
$の前に0つけるのってファイナルビューティ醸してるな。
この発送はなかった。
11名無しさん@お腹いっぱい。:2013/11/08(金) 15:58:55.00
>>9
8進数になることない?
12名無しさん@お腹いっぱい。:2013/11/08(金) 16:21:43.15
>>11
あるねw
13名無しさん@お腹いっぱい。:2013/11/08(金) 16:57:46.84
$ test 12 -eq 12; echo $?
0
$ test 012 -eq 12; echo $?
0
14名無しさん@お腹いっぱい。:2013/11/08(金) 17:49:27.80
>>13
あ、使ってる関数は自動変換するけど、10進数限定にもできて、testは限定されてた。
だからやっぱりないw
15名無しさん@お腹いっぱい。:2013/11/09(土) 13:58:50.12
マイナス
"負数"が返ってきたらアウトだな

と思ったけど実行結果は必ず0か自然数なので問題なかった
16名無しさん@お腹いっぱい。:2013/11/10(日) 17:23:11.15
あるファイルが、実行可能な設定ファイルであることを
チェックして保証したいんだけど、なんかいい方法ある?

手抜きなんかしないで、ひとつひとつちゃんと
HOGE="PIYO"
みたいなフォーマットにのっとってることを
文法チェックして確認しないとだめ?
17名無しさん@お腹いっぱい。:2013/11/10(日) 19:40:09.82
実行可能って、エラーを発生させることなくパース可能という意味?
任意の書式だと困難だと思うけど。
18名無しさん@お腹いっぱい。:2013/11/11(月) 01:57:30.15
>>16
何の設定ファイル?
19名無しさん@お腹いっぱい。:2013/11/11(月) 09:45:35.56
それは秘密
20名無しさん@お腹いっぱい。:2013/11/11(月) 10:08:05.71
それがわからないと答えにくい。
21名無しさん@お腹いっぱい。:2013/11/11(月) 15:43:09.06
そのファイルでどこまでの記述を許すかによるんじゃない?
a="b" の範囲内ならgrepでできるかもしれない。
a=${hoge:=piyo} とかも許すなら、俺しらね。
さらにシェルで書けることならなんでもOKとするなら、
本気でパーズしなきゃだめだろ。
22名無しさん@お腹いっぱい。:2013/11/11(月) 19:30:27.56
シンタックスが正しくてもセマンティクスが正しくなければ
「実行可能」ではないのでは?
23名無しさん@お腹いっぱい。:2013/11/11(月) 20:16:49.22
16はもう来ないのか?
24名無しさん@お腹いっぱい。:2013/11/12(火) 21:21:47.34
bashがデカ過ぎる…。そして重過ぎる…。
25名無しさん@お腹いっぱい。:2013/11/13(水) 12:42:19.69
>>17
そうだね

>>21
設定ファイルとして使いたいけど実装は面倒なので実行で済ませたい
って横着な話が起点なので、いい方法がなければ自力でチェックします。

bash -r とか使えるかなと思ったけど無意味っぽかった
26名無しさん@お腹いっぱい。:2013/11/13(水) 13:08:08.67
ならスクリプトとして完全なチェックは必要ないよね。
自力でもそんなに難しくないんでは。
27名無しさん@お腹いっぱい。:2013/11/20(水) 19:52:35.18
一定時間、何度か繰り返しコマンドを実行したくて、

for i in `seq 1 10`
do
 何かのコマンド
 sleep 1h
done
echo "finished" | write username

といったスクリプトを書いているのですが、このやり方だと
最後にコマンドを実行してから一時間、無駄に sleep してしまいます。
最後の sleep だけ実行しない方法はないでしょうか。
28名無しさん@お腹いっぱい。:2013/11/20(水) 19:58:50.00
再編集の時が恐いけど
変数 i<=9 のときにsleep 1h

i/=10の時に sleep 1h
29名無しさん@お腹いっぱい。:2013/11/20(水) 20:00:40.20
>>27

i=10
while
 何かのコマンド
 ((--i)) &amp;&amp; sleep 1h
do :; done
echo "finished" | write username
3027:2013/11/20(水) 20:07:56.43
おお! 素早い回答、ありがとうございます。
ですが、たびたびすいません。

実際に使っているスクリプトだと、ループの実行回数が不定な場合があるのです。
(行数が特定できないファイルからの読み込みとか)
最後のループでは sleep しない、という手段はあるでしょうか。
3127:2013/11/20(水) 20:19:58.58
よく考えたらファイルからの読み込みも終了判定できますね。
何とか工夫すれば、判定できないループってないかも……。
どうもお騒がせしました。
32名無しさん@お腹いっぱい。:2013/11/20(水) 23:30:36.92
>>29
((--i)) でiが0になる時、返り値1なんだ。
iが負の値になる時でも返り値0なのに、0になる時だけ特別なんですね。
33名無しさん@お腹いっぱい。:2013/11/21(木) 00:11:48.01
If the value of the expression is non-zero, the
return status is 0; otherwise the return status is 1.
34教えてくだしあ:2013/11/21(木) 23:17:15.63
pingを打って 成功⇒次のping 失敗⇒EXIT
もっかい別のとこにping 成功⇒ログ出力 失敗⇒コマンド実行
こんな感じのスクリプト作りたいんだけど
pingの結果って$?に入るんだよね
これって複数あった場合どうすれば良いの?
35名無しさん@お腹いっぱい。:2013/11/21(木) 23:18:56.88
>>34
どういうこと?
36名無しさん@お腹いっぱい。:2013/11/21(木) 23:21:59.47
>>34
直前のコマンドの結果で毎回 $? が上書きされるだけ。
3734:2013/11/21(木) 23:26:22.05
わかり難くてすません

1.ping打つ 成功⇒2へ 失敗⇒終了
 ↑ココの$?
2.ping打つ 成功⇒ログ書き込み 失敗⇒コマンド実行
 ↑ココの$?

で結果を分けて処理しようと考えてます。
根本的に考え方が違うなら考えを改めるよ
3834:2013/11/21(木) 23:28:11.31
>>36 それが知りたかった エスパーありがとう
39名無しさん@お腹いっぱい。:2013/11/21(木) 23:29:46.92
>>38
>>36 の回答は理解できないの?

hoge=$? でコピーしておいてもいいし
4034:2013/11/21(木) 23:47:57.56
期待通り動いたわ ありがとな
ちなこれって、ここの住人はどんな感じで書くん?
ping -c 3 192.168.43.1 >/dev/null
PING1=$?
if
[ ${PING1} -eq "0" ];then
ping -c 1 192.168.254.100 >/dev/null
PING2=$?
if
[ ${PING2} -eq "0" ];then
echo Status=OK
exit
else
/etc/script/wol 192.168.254.255 10:78:D2:4B:D6:55
echo WAKE-ON-LAN
fi
else
echo NoThanks
exit
41名無しさん@お腹いっぱい。:2013/11/22(金) 00:01:34.93
if ping -c 3 192.168.43.1 >/dev/null; then
 if ping -c 1 192.168.254.100 >/dev/null; then
  echo Status=OK
 else
  /etc/script/wol 192.168.254.255 10:78:D2:4B:D6:55
  echo WAKE-ON-LAN
 fi
else
 echo NoThanks
fi

全角空白は置換してくれ。
4234:2013/11/22(金) 00:08:55.90
おいおい条件要らないとかマジかよ
意外とスクリプト面白いな
43名無しさん@お腹いっぱい。:2013/11/22(金) 00:09:42.94
条件要らない?
どういうこと?
44名無しさん@お腹いっぱい。:2013/11/22(金) 01:55:31.53
ifが変数に入れなくてもそのまま戻り値でいけるってとこじゃね?
45名無しさん@お腹いっぱい。:2013/11/22(金) 08:48:23.24
ifに条件は要るだろ。
46名無しさん@お腹いっぱい。:2013/11/22(金) 09:22:12.61
ping -c 3 192.168.43.1 >/dev/null && { ping -c 1 192.168.254.100 >/dev/null && echo Status=OK || { /etc/script/wol 192.168.254.255 10:78:D2:4B:D6:55; echo WAKE-ON-LAN; }; } || echo NoThanks
47名無しさん@お腹いっぱい。:2013/11/22(金) 22:29:53.59
if使わない方法もあるのね。なかなか勉強になるぜ
>>43 [ ${PING1} -eq "0" ];これってpingの変数が0だったらって条件じゃないの?
1とか他の値だったら条件に合わないよね?
でも>>41のを見るとそんな条件なく成功=次へって感じに見えるけど
何処に条件が書いてあるん?
分かり易く教えてくだしあ
48名無しさん@お腹いっぱい。:2013/11/22(金) 22:46:39.23
if は、条件がどうこうじゃなく、コマンドの戻り値で判断する文法。
[ ... ] の [ は、ifの文法じゃなくて [ という名前のコマンド。
49名無しさん@お腹いっぱい。:2013/11/23(土) 00:18:20.98
testコマンドじゃなかったか? => []
50名無しさん@お腹いっぱい。:2013/11/23(土) 00:33:47.23
test と [ は同じ物。
コピーかリンク。
] は関係ない。
51名無しさん@お腹いっぱい。:2013/11/23(土) 00:41:18.75
test を [ という名前で起動するときは、
最後に ] という引数を要求するようになっている、という仕組み。
52名無しさん@お腹いっぱい。:2013/11/23(土) 01:22:07.55
ping文が条件じゃん。
53名無しさん@お腹いっぱい。:2013/11/23(土) 19:24:30.28
f=
if [ -f "$f" ]; then
echo "ファイル$fはある"
else
echo "ファイル$fはない"
fi

を実行すると、
ファイルはない

f=
if [ -f $f ]; then
echo "ファイル$fはある"
else
echo "ファイル$fはない"
fi

を実行すると、
ファイルはある

"$f" でないと「ある」になるんですが、
そんなファイルはないのに、なぜなんでしょう?
54名無しさん@お腹いっぱい。:2013/11/23(土) 19:33:31.33
[ -f $f ] は [ -f ] と同じ意味になって、
[ コマンドがそれを真とみなすから。
55名無しさん@お腹いっぱい。:2013/11/23(土) 19:34:30.39
[ -f "" ] && echo hoge

[ -f ] && echo hoge
ってことだな。

>>54
なぜ真とみなされるのか、という疑問では。
56名無しさん@お腹いっぱい。:2013/11/23(土) 19:39:50.36
-f が単なる文字列として解釈されているのでは

`-n STRING'
`STRING'
True if the length of STRING is nonzero.
57名無しさん@お腹いっぱい。:2013/11/23(土) 19:39:51.89
マニュアルには -f file の場合しかないんで、-f だけだと未定義。
ということは、真になろうが偽になろうが利用者は文句を言えない。
最初の実装上たまたま真にしたんじゃね?
で、その実装がそのまま引き継がれていると。

以上、想像。
58名無しさん@お腹いっぱい。:2013/11/23(土) 19:41:30.39
>>56
あぁ、それが合理的だな
5953:2013/11/23(土) 19:57:40.35
さすがこのスレは物知りが多いですね

$ test hoge
$ echo $?
0

だから

$ test -f
$ echo $?
0

も同じってことですか なるほど
しかし、わかりにくいってか間違いやすいなー
60名無しさん@お腹いっぱい。:2013/11/23(土) 21:04:08.90
>>57
ああ、なるほど。鼻から悪魔が出てくるアレと同じ構図なのか。
61名無しさん@お腹いっぱい。:2013/11/23(土) 22:44:39.50
>>56
おまえあたまいいな
62名無しさん@お腹いっぱい。:2013/11/25(月) 08:44:31.22
opencobolでプログラムを書いて、bashシェルで実行させています
その時、シェルでファイルを定義する必要があるんですが、
AAAAAA=./work/AAAAAA.txt ; export AAAAAA
echo AAAAAA=$AAAAAA

を複数書く必要があるんですが、
AAAAAAを何ヵ所も書き換えるのが大変です
皆さんならどう定義しますか?
63名無しさん@お腹いっぱい。:2013/11/25(月) 10:14:29.37
どういうこと?
64名無しさん@お腹いっぱい。:2013/11/25(月) 10:27:09.96
下のTEST001プログラムを実行するときに、IN1FILE,IN2FILE,OUT1FILEを定義する必要があります。
もっとわかりやすくて、書きやすい方法ないのかと思い、相談させてもらいました。

現在下のような感じです。
IN1FILEを定義するのに何箇所もIN1FILEとコピペするのが面倒で・・・

Pname=TEST001
echo $Pname START

IN1FILE=${mastpass}IN1FILE.txt ;export IN1FILE
IN2FILE=${mastpass}IN2FILE.txt ;export IN2FILE
OUT1FILE=${mastpass}OUT1FILE.txt ;export OUT1FILE
echo "IN1FILE " $IN1FILE
echo "IN2FILE " $IN2FILE
echo "OUT1FILE " $OUT1FILE

./LINUX/bin/$Pname.bin
ReturnCD=$?
if [ $ReturnCD -eq 0 ] ; then
echo $Pname "NOMAL END (" $ReturnCD ")"
else
echo $Pname "ABNOMAL END !!!!! (" $ReturnCD ")"
exit 1
fi
echo " "
65名無しさん@お腹いっぱい。:2013/11/25(月) 10:37:44.35
echo が必要なら書くしかないんじゃね。
bash 前提なら
export IN1FILE=${mastpass}IN1FILE.txt で済む。
66名無しさん@お腹いっぱい。:2013/11/25(月) 10:40:53.46
こんな感じで、一か所変更すれば良い様にしたいんですが、
いまいちshellがわかってなくて・・・

FIL=IN1FILE ; '$FIL=${mastpass}$FIL.txt ;export $FIL ;echo $FIL = $FIL
67名無しさん@お腹いっぱい。:2013/11/25(月) 10:47:59.24
eval使え
68名無しさん@お腹いっぱい。:2013/11/25(月) 10:51:08.10
>>65 ありがとございます
参考にいろいろやってみてます。
最後の'$'$FILの所がうまく行きませんでした。

FIL=KANFIL ; export $FIL=${mastpass}$FIL.isam ; echo $FIL = '$'$FIL
69名無しさん@お腹いっぱい。:2013/11/25(月) 10:53:18.96
>>67
かえってややこしくなりそう。
70名無しさん@お腹いっぱい。:2013/11/25(月) 10:57:21.15
↓で出来ました。ありがとうございます。
もっといい方法ありますか?

FIL=IN1FILE ; export $FIL=${mastpass}$FIL.txt ; eval echo $FIL = '$'$FIL

汎用機からマイグレをしようと思ってます。
JCLが出力しているような情報は出力させたいので、
echoは必要だと考えています。
71名無しさん@お腹いっぱい。:2013/11/25(月) 11:02:38.40
あと、プログラム終わった後、環境変数を解放してあげる必要があるかと思うんですが、
その場合は、配列にして、
@配列定義
A配列を使ってexport定義
Bプログラム実行
C配列を使ってunsetで解放
って感じが良いのでしょうか
72名無しさん@お腹いっぱい。:2013/11/25(月) 11:03:54.23
>>71
> あと、プログラム終わった後、環境変数を解放してあげる必要があるかと思うんですが、
そうなん?
73名無しさん@お腹いっぱい。:2013/11/25(月) 11:13:38.62
>>72
汎用機ばっかりだったので、
ファイルを使いたいときは定義、使い終わったら解放ってのが一般的だと思ってたので・・・

次のプログラムでは、定義してないファイルは使えない感じの方がいいのかと思ってますが、
そんな考え方は、必要ないのでしょうか?
74名無しさん@お腹いっぱい。:2013/11/25(月) 11:42:36.01
define_file()
{
local FIL=$1
eval "$FIL=${mastpass}$FIL.txt ;export $FIL ;echo $FIL = \$$FIL"
}

define_file IN1FILE
define_file IN2FILE
define_file OUT1FILE

環境変数はシェルスクリプトに閉じているからシェルスクリプトが終了すれば消えてなくなる
あとpassってなんだよ。pathの事か?
75名無しさん@お腹いっぱい。:2013/11/25(月) 11:43:45.62
パスワードのことじゃね?
76名無しさん@お腹いっぱい。:2013/11/25(月) 11:56:32.79
にゃんぱすー
7764:2013/11/25(月) 12:01:10.93
>>74
pass=pathです

恥ずかしいから誰にも言わないで下さい
7864:2013/11/25(月) 12:34:00.24
>>74さん
ありがとうございます。

理想的な感じです!!
define_fileを外部ファイル(外部シェル)とする事もできますか?

将来的には、ファイル名、属性、フォルダを渡したいと考えています
define_file IN1FILE mast txt
79名無しさん@お腹いっぱい。:2013/11/25(月) 13:46:12.01
> define_fileを外部ファイル(外部シェル)とする事もできますか?
そのシェルの中でevalしないとダメ
別ファイルに記述しといて ドットコマンドで定義を読み込むことは出来る
. define_file.inc
8064:2013/11/25(月) 16:31:39.03
出来ました。みなさんありがとうございました。


論理ファイルと物理ファイルが違う場合が出てきたので、
結局JCLに似た形式にしました。

. ${shelpath}ASCFILE.inc #ファイルアロケート

ASCFILE IN1FILE ${mastpath}IN1FILE.sf
ASCFILE IN2FILE ${tranpath}tran.sf
ASCFILE OUT1FILE ${workpath}OUT1FILE.sf

ASCFILE()
{
local DDNAME=$1 #論理ファイル
local DSNAME=$2 #物理ファイル

export $DDNAME=${DSNAME}
eval echo $DDNAME = '$'$DDNAME
81名無しさん@お腹いっぱい。:2013/11/26(火) 00:50:42.83
なんつうか、COBOLはもともとの発想というか方法論が違うんだな…
82名無しさん@お腹いっぱい。:2013/12/04(水) 13:08:09.83
cshは関数作れなかったり、各種制御がお粗末だったり色々問題ありなので、shでスクリプトを書こうとしています。

しかし、一部の設定でcshの文法で書かれたファイルをsourceする必要があります。
(cshスクリプトファイルで設定される$pathや環境変数などの設定情報が必要)

shスクリプト内で単純にsourceするとファイルがshで解釈されてエラーになります。

どのようにすれば、shスクリプトでcshスクリプトファイルの設定を引き継げますでしょうか。
shに書き起こすのは無しで、ファイルそのものを使えるのが理想です。
83名無しさん@お腹いっぱい。:2013/12/04(水) 13:21:02.17
>>82
cshで読んで、子プロセスとして起動したshに環境変数として渡す。
前処理が必要ならsh→csh→shの入れ子にして動かす。
84名無しさん@お腹いっぱい。:2013/12/04(水) 14:05:38.91
すみませんがcshがインストールされていないLinuxの前提でお願いします
85名無しさん@お腹いっぱい。:2013/12/04(水) 14:14:56.23
既読スルー
86名無しさん@お腹いっぱい。:2013/12/04(水) 14:46:50.02
>>84
変数代入に相当する構文をgrepで抽出して解釈。
ifブロック内での変数操作を拾う点については諦める。

それも嫌ならcshを無理矢理でもいいから突っ込んで動かせ。
87名無しさん@お腹いっぱい。:2013/12/04(水) 14:50:40.08
csh2sh と名のつく変換スクリプトもいろいろあるようだよ。
88名無しさん@お腹いっぱい。:2013/12/04(水) 14:50:48.60
csh2shみたいのじゃだめなんかな。
89名無しさん@お腹いっぱい。:2013/12/04(水) 22:10:17.84
すみませんが若い女性の方のみお願いします。
90名無しさん@お腹いっぱい。:2013/12/11(水) 19:06:34.35
dashはうんこだと思う
91名無しさん@お腹いっぱい。:2013/12/11(水) 19:11:03.06
既読スルー
92名無しさん@お腹いっぱい。:2013/12/14(土) 05:11:38.01
若い女性がダッシュでウンコの動画マダー?
93名無しさん@お腹いっぱい。:2013/12/21(土) 10:57:05.23
Software Design 2014年1月号

シェル特集だぞ。

なんか、良いこと書いてる?
94名無しさん@お腹いっぱい。:2013/12/27(金) 13:24:08.23
冬休みにシエルを始めたいのですがどのアプリを入れればいいのかいっぱいあってわかりません。オーエスはアンドロイドです。よろしく教えてください。
95名無しさん@お腹いっぱい。:2013/12/27(金) 13:48:23.63
釣りにしか見えない
96名無しさん@お腹いっぱい。:2013/12/27(金) 14:02:56.75
97名無しさん@お腹いっぱい。:2013/12/27(金) 15:10:37.86
すみませんがプレイのアプリでお願いします
98名無しさん@お腹いっぱい。:2013/12/27(金) 15:11:17.22
>>93
付録狙いで買ってくる
99名無しさん@お腹いっぱい。:2013/12/27(金) 15:17:46.67
100名無しさん@お腹いっぱい。:2013/12/27(金) 15:38:28.36
>>99
ありがとうございます。いま環境がないので姉が帰ってきたら試してみます。
101名無しさん@お腹いっぱい。:2013/12/27(金) 17:31:10.29
urlくらいまじめに見ろよ
102名無しさん@お腹いっぱい。:2013/12/28(土) 13:09:48.31
釣りのような気もするがマジレスすると、ConnectBotでいいと思う。
こいつはsshクライアントなんだが、デフォルトだとプロトコルsshって
表示されてるとこでプロトコルlocalを選ぶと、Androidの
一般ユーザー権限でシェルが使えるので。
103名無しさん@お腹いっぱい。:2013/12/28(土) 13:10:20.83
釣りっていうかすべったネタ。
104名無しさん@お腹いっぱい。:2013/12/28(土) 13:22:08.91
Androidだとふつーにシェルが使えるから、釣り/ネタにならんのよね。
iOSならネタになるかな?
iOSの公式ストアにあるアプリで、ローカルのシェルが使える奴ってある?
105名無しさん@お腹いっぱい。:2013/12/28(土) 13:28:06.54
釣りにしか見えない
106名無しさん@お腹いっぱい。:2013/12/28(土) 13:50:33.34
まあデフォルトだとsedもawkも入ってないので、
だいぶ厳しい。(grepは入ってる)
でもシェルはkshで行編集やファイル名補完は効くぞ。
なぜかmoreがあるなあと思ったら、これksh組み込みの奴だったのね。
107名無しさん@お腹いっぱい。:2014/01/11(土) 12:07:28.33
標準入力(od -xが出力した文字列)の文字列を4バイトごと切り取り、
それをforループで処理させたい思っており、現在はこんな感じのスクリプト作ってます
OSはCentOS、シェルはbashです

#!/bin/sh
for STR in `4バイトごとに切り取る処理`
do
hogehoge $STR
done

この「4バイトごとに切り取る処理」ですが、現在はsplitで4バイト単位に切り取り、
分割後のファイルを順次読み込ませるということにしているのですが、
分割後のファイルが沢山作られるので遅くなり、またやりたい事の割にやってることが
複雑すぎるので、なんとか改善したいと思ってます

そういうことをしてくれる、いい方法はありますでしょうか
標準出力を、指定したバイト数単位にセパレータを挟んで出力してくれるコマンド、みたいな

cutでやってみようと思ったのですが、これだとオフセットを4バイトずつずらしながら
切り出していく処理となりそうで、これもまた複雑だなぁ、と…
108名無しさん@お腹いっぱい。:2014/01/11(土) 12:14:05.59
$ echo 'hogefugapiyo' | while read -N 4 STR; do echo $STR; done
109名無しさん@お腹いっぱい。:2014/01/11(土) 12:38:48.75
ふらっと通りがかったが感動した!
110名無しさん@お腹いっぱい。:2014/01/11(土) 13:01:14.29
107です

>>108
なるほどreadでやるのですね
バイト数も任意で変更できそうで、柔軟性もありますね

ありがとうございました
111名無しさん@お腹いっぱい。:2014/01/11(土) 13:41:30.36
>>108
つfold
じゃだめなんだっけ?
forをwhileに書き換えるのはおすすめしない。
112名無しさん@お腹いっぱい。:2014/01/11(土) 14:35:27.41
>>108
read: Illegal option -N
113名無しさん@お腹いっぱい。:2014/01/11(土) 15:13:02.47
dd bs=1 count=切り出しバイト数 skip=オフセットバイト数
でなんとかならんかい?
114名無しさん@お腹いっぱい。:2014/01/11(土) 15:16:16.51
> 標準出力を、指定したバイト数単位にセパレータを挟んで出力

fold だとセパレータの指定はできないんじゃない?

 $ sep="@"; echo 'hogefugapiyo' | while read -N 4 str; do echo -en "${str}${sep}";done

とかしたいのかと思ったけど…

# 最後にセパレータがくっついちゃうけどね
115名無しさん@お腹いっぱい。:2014/01/11(土) 19:21:56.73
read に -N オプション付けてるプログラマーorシス管見つけたら
社史編纂室に異動させるわ
116名無しさん@お腹いっぱい。:2014/01/11(土) 19:26:19.16
>>115
なんで?
保険でつけるでしょ?
117名無しさん@お腹いっぱい。:2014/01/11(土) 20:27:26.03
echo 1 2 3 | read k1 k2 k3 | echo $k1 $k2 $k3
1 2 3

echo 1 2 3 | read k1 k2 k3 | echo $k1 $k2 $k3 | read kk1 kk2 kk3 | echo $kk1 $kk2 $kk3

パイプって何本までできる?
118名無しさん@お腹いっぱい。:2014/01/11(土) 20:46:56.09
>>115
sed に -r つけたり grep に -P オプション付けてたりしたら
どこへ異動させられるやらw
119名無しさん@お腹いっぱい。:2014/01/11(土) 20:53:12.98
>>117
シェルがあえて限界を設定していないなら
1コマンドとして処理できる文字数以内で
単一プロセスが開けるパイプの限界数まで
じゃね?
120名無しさん@お腹いっぱい。:2014/01/13(月) 06:37:06.28
>>117
これって動く?サブシェルになりそうな気がするんだけど
121名無しさん@お腹いっぱい。:2014/01/13(月) 07:44:33.04
>>117 みたいなスクリプト書くプログラマーorシス管見つけたら
社史編纂室に異動させるわ
122名無しさん@お腹いっぱい。:2014/01/13(月) 11:25:05.94
>>107
odじゃ無いけどhexdumpの-fフォーマット辺りで何とかならんかのー
123名無しさん@お腹いっぱい。:2014/01/13(月) 22:06:10.23
>>120
動かなかった…
124名無しさん@お腹いっぱい。:2014/01/18(土) 00:30:36.30
ln -s original linked
ln -s linked linked_linked

みたいにリンクのリンク状態になっている場合、
シェルスクリプト内で、最後の linked_linked から大元のファイル
(この場合は original)を探り出す簡便な方法ってありますか?
125名無しさん@お腹いっぱい。:2014/01/18(土) 00:36:07.02
$ readlink -f linked_linked
126124:2014/01/18(土) 00:38:34.41
>>125
ありがとうございます!
そんなコマンドがあったとは!
127名無しさん@お腹いっぱい。:2014/01/18(土) 14:08:09.48
bash -c "test.sh 1 2 3"
とコマンド文字列を引用符で囲うところで引用符を忘れて
bash -c test.sh 1 2. 3
としてしまった場合、 1 2 3 はどこに行ってしまうのでしょうか。
気になって仕方がないので教えてくださいー
128名無しさん@お腹いっぱい。:2014/01/18(土) 14:10:54.08
>>127
bash -c 'echo $0 $@' 1 2 3

ってやってみるとわかる
129名無しさん@お腹いっぱい。:2014/01/18(土) 14:38:07.29
シェルから、端末のビープ音を鳴らすまたはバイブする方法を教えてください。
通常端末と違って echo -e '\a' では駄目です。Androidです。
130名無しさん@お腹いっぱい。:2014/01/18(土) 14:49:19.13
127です。
おおお凄い引数として扱える、、、、ってでもこれはナンダ?
-c で生成したプロセスのbashに対して引数を与えられる、ってことでいいのかな?
まだよく理解できていませんが、色々と試してみようと思います。
128さん、ありがとうございました!
131名無しさん@お腹いっぱい。:2014/01/19(日) 02:14:50.20
a.txt には CHINKO=BIG というテキストが入っています

IFS='=' read A B < a.txt
なら思ったとおりに AにCHINKO、BにBIG が入るんだけど

cat a.txt | IFS='=' read A B
だと入ってくれません

これって何が原因に考えられますか?
132名無しさん@お腹いっぱい。:2014/01/19(日) 02:17:08.79
入ったけど。

$ IFS='=' read A B < a.txt; echo $A; echo $B
CHINKO
BIG
$ cat a.txt | IFS='=' read A B; echo $A; echo $B
CHINKO
BIG
$
133名無しさん@お腹いっぱい。:2014/01/19(日) 02:21:50.04
わかった。
Debianだとうまくいかないんだ、shがdashだから。

>>132
ありがとうございました
134名無しさん@お腹いっぱい。:2014/01/19(日) 02:40:36.32
dashでも入ったけど。
135名無しさん@お腹いっぱい。:2014/01/19(日) 03:14:26.33
えー・・・
136名無しさん@お腹いっぱい。:2014/01/19(日) 03:42:02.64
>>129
\aとかのビープを鳴らすってことならターミナルエミュレータが\aでビープなりバイブなりを再現すればいい
ので、ターミナルエミュレータの開発元に物申せばいいと思うよ。

普通に鳴らすコマンドが有るかは・・・知らん。
137名無しさん@お腹いっぱい。:2014/01/19(日) 08:20:07.33
プログラムのファイル入出力はシェルでどう指定したらいいの?
138名無しさん@お腹いっぱい。:2014/01/19(日) 08:34:17.39
>>136
いま、ConnectBot 上で echo Control-V Control-G したら、ちゃんと
ビープしたな。
139名無しさん@お腹いっぱい。:2014/01/19(日) 08:45:56.29
>>137
やりたいことをもうちょい具体的に。
140名無しさん@お腹いっぱい。:2014/01/19(日) 09:32:15.00
プログラムを作成する上で、ファイルを入力または出力するには、シェルでどのような指定を行なえばいいですか?
141名無しさん@お腹いっぱい。:2014/01/19(日) 09:46:37.45
プログラムってのがシェルスクリプトで
文字列なら入力はcatとかで変数にいれたらいい
var=`cat hoge.txt`

出力は標準出力からリダイレクト
hoge.sh > hoge.txt

バイナリならxxdとか使って16進数に変えてから使えばいい
142141:2014/01/19(日) 09:51:46.11
やりたいことがわからないからこれでいいかは知らないが。
143名無しさん@お腹いっぱい。:2014/01/19(日) 13:21:53.00
>>140
何を言いたいのかよくわからんが、
もしシェルをJCLのようなイメージでとらえているのであれば、
プログラムを作成する上で、シェルは必要ないです。
プログラムの中で指定すればいい。
144名無しさん@お腹いっぱい。:2014/01/19(日) 14:03:22.37
ファイル名いろいろあるやん。
145名無しさん@お腹いっぱい。:2014/01/20(月) 10:51:58.59
>>134
最新のDebianだと入らない
146名無しさん@お腹いっぱい。:2014/01/24(金) 08:44:32.88
Cシェルで変数$hogeにAAAをセットし、さらにAAAの先頭にタブ文字を挿入して<タブ文字>AAAと表示させる方法を教えて下さい。
147名無しさん@お腹いっぱい。:2014/01/24(金) 09:42:05.75
Cシェル使こてるプログラマーorシス管見つけたら
社史編纂室に異動させるわ
148名無しさん@お腹いっぱい。:2014/01/24(金) 10:51:15.62
もうそれ飽きた。
149名無しさん@お腹いっぱい。:2014/01/25(土) 00:19:11.43
千行以上あるUNIXTIMEを変換するのに一番効率のいいやりかたって、ありますか?

いまのところwhileにリダイレクトで食わせてreadで1行ずつperlで変換させてます。
もとはBINDのnamed.statsで、UNIXTIMEだけ抽出したものなんですけど、
えっらい時間をとられるもので…
ちなみにHP-UXだからか、dateにstrf表示させられなかったです。
150名無しさん@お腹いっぱい。:2014/01/25(土) 01:29:52.23
>>149
うーん、perl で直接ループ回しちゃえばいいんじゃないかな

$ perl -pe 's/\d+/localtime $&/e' < named.stats

named.stats のフォーマットが分からないから "\d+" が別の文字列に
マッチしちゃうかもしれないけど。
151名無しさん@お腹いっぱい。:2014/01/25(土) 08:21:46.09
そこで全部perlで回すかと思わず
2ちゃんねるで聞こうとなる思考がどうかしてる
152名無しさん@お腹いっぱい。:2014/01/25(土) 08:33:51.18
そこで全部シェルで書こうかと思わず
perl(笑)に逃げちゃう思考がどうかしてる
153名無しさん@お腹いっぱい。:2014/01/25(土) 11:06:49.43
「自分、perlに逃げたりしないで全部シェルで書くんで待ってください」

辞令
史編纂室勤務ヲ命ズ
154名無しさん@お腹いっぱい。:2014/01/25(土) 11:19:26.34
シェルでそんなことしたらスループットすげー低そう
155名無しさん@お腹いっぱい。:2014/01/25(土) 12:35:08.03
>>150
ありがとうございます。
別にスクリプト書いてそっちで回すか、Excelで計算するか…しかなさそうですね。

やってることは、こんな感じです。
grep "+++ Statistics Dump +++" named.stats | awk 'BEGIN{FS="("}{print $2}' | sed 's/)//' > days.txt
(他にもグラフ化したい値を抽出してテキスト化(略))
paste -d, days.txt hoge.txt fuga.txt > data.csv

>>154
すごく…… 低いです……
ン万行あってもgrepであっさりと情報をぶっこ抜けるので、ここだけ、
days.txtのUNIXTIMEを変換する、ここだけ遅いんですよ…
perlで全部解析するスクリプト組むとか面倒で
156名無しさん@お腹いっぱい。:2014/01/25(土) 13:03:03.82
全部解析するスクリプトもなにも
いまの1行変換処理をループで囲うだけでしょ
while(<>){ 処理; }
157名無しさん@お腹いっぱい。:2014/01/25(土) 13:07:32.99
>>155
他が問題ない速度なら変換する部分だけをperlに置き換えればいいでしょ
158名無しさん@お腹いっぱい。:2014/01/25(土) 13:08:25.67
>>155
>grep "+++ Statistics Dump +++" named.stats | awk 'BEGIN{FS="("}{print $2}' | sed 's/)//' > days.txt

せっかく awk 使っているんだからこれで↓

awk -F'[()]' '/^\+\+\+ Statistics Dump \+\+\+/{print $2}' named.stats > days.txt
159名無しさん@お腹いっぱい。:2014/01/25(土) 13:20:44.21
>>155
perl でやるならこれで↓

perl -ne 'if(/^\+\+\+ Statistics Dump \+\+\+ \((\d+)\)$/){print localtime($1) . "\n";}' named.stats > days.txt
160名無しさん@お腹いっぱい。:2014/01/25(土) 13:26:11.86
>>158
awk には strftime() が使えるからこれで↓

awk -F'[()]' '/^\+\+\+ Statistics Dump \+\+\+/{print strftime("%Y/%m/%d %H:%M:%S",$2)}' named.stats

# もしかすると strftime() は GNU awk だけでしか使えないかも…
161名無しさん@お腹いっぱい。:2014/01/25(土) 13:26:14.88
ところでなんでperlなの?
162名無しさん@お腹いっぱい。:2014/01/25(土) 13:29:26.28
python: ワンナイナーの敵
awk: 実装が沢山あり、動作が異なる場合がある
r***: 論外
163名無しさん@お腹いっぱい。:2014/01/25(土) 13:44:18.27
rexx ?
164名無しさん@お腹いっぱい。:2014/01/25(土) 14:23:44.21
なんで論外なの?
165名無しさん@お腹いっぱい。:2014/01/25(土) 14:49:39.47
>>162 が使えないから
166名無しさん@お腹いっぱい。:2014/01/26(日) 03:18:53.50
>>157-160
そんなに早くレスを頂けるとは思っておらず、お礼が遅くなりました。
ありがとうございます。

そうか。awkやperlでgrepと同じことが出来るんですね…勉強になりました。
167名無しさん@お腹いっぱい。:2014/01/28(火) 22:58:27.17
変数$aaaの中身を右寄せし、半角スペースを5つ付けて合計10桁の固定長にし、これを別の変数$bbbに代入した場合にちゃんと10桁にするにはどうすればよいですか?
168名無しさん@お腹いっぱい。:2014/01/28(火) 23:07:36.20
>>149
待て待て、gnu dateなら複数行入力の一括変換とか出来るぞたしか
169名無しさん@お腹いっぱい。:2014/01/28(火) 23:47:55.54
>>167
昔、似たようなことをやりたくて探したことがあるけど…
あきらめて${#aaa}とかで文字数をカウントして、欲しい桁数からその数値を引き、
付け足すべき半角スペースをループで作って継ぎ足しただよ。

例外処理とかめんどくさかったので、いなかもんのおらも知りてぇだ。
170名無しさん@お腹いっぱい。:2014/01/28(火) 23:51:39.80
>>167
レスありがとう。
やはり、ループで足すしかないですかねぇ。
171名無しさん@お腹いっぱい。:2014/01/29(水) 00:00:56.29
#!/bin/bash
aaa="hoge"
bbb="$(printf "%10s" "$aaa")"
echo "$bbb"
172名無しさん@お腹いっぱい。:2014/01/29(水) 00:05:22.17
IFSいじっちゃえw
173名無しさん@お腹いっぱい。:2014/01/29(水) 00:18:47.53
>>168
どうやんの?
174名無しさん@お腹いっぱい。:2014/01/29(水) 00:30:18.06
ふつーに>>171だろ。
printf(1)とか、シェルのクオーティングの振るまいとか、
基本なので理解しとくべき。
175名無しさん@お腹いっぱい。:2014/01/29(水) 02:19:51.45
いやいや、GNU date を使うやり方。
176名無しさん@お腹いっぱい。:2014/01/29(水) 23:57:44.84
>>175
すまん、たまたまかなり新しいバージョンのdateだった8.15
-fでファイルを読み込める。
バージョンいくつから出来るのかは知らん
177名無しさん@お腹いっぱい。:2014/01/30(木) 01:01:14.41
178名無しさん@お腹いっぱい。:2014/01/30(木) 15:36:42.60
「str表示すらできないHP-UXのdate」って書いてあるしGNU dateじゃないんじゃないの
FreeBSDのdate確認したらファイル読み込んで1行ごとにって機能はなさそう
179名無しさん@お腹いっぱい。:2014/01/30(木) 19:21:21.34
入れるだけじゃん許されるならばだけど
180名無しさん@お腹いっぱい。:2014/01/30(木) 20:24:02.53
許されないほうがなんかきもちいい。
181名無しさん@お腹いっぱい。:2014/01/30(木) 22:10:02.56
hoge="(株)ほげほげの売上は%1です。"
の%1をsedで置換したいのですが、(でエラーとなってしまいます。
特殊記号の()を読み飛ばして置換するにはどうすればよいですか?
182名無しさん@お腹いっぱい。:2014/01/30(木) 22:15:21.86
>>181
" " ではなく ' ' でくくるといい
183名無しさん@お腹いっぱい。:2014/01/31(金) 10:14:18.23
>>179
入れられるのならもう入れてるだろう。
184名無しさん@お腹いっぱい。:2014/01/31(金) 16:11:13.16
一生に一度くらいは入れてみたいものである。
185名無しさん@お腹いっぱい。:2014/02/03(月) 21:48:36.77
シェルスクリプトにてSQLの結果をメール送信するプログラムを作ろうと思います。
以下のようにやると$resultの結果が取れないのですが、どのようにしたらよいでしょうか?

sendMail() {
from=$1
to=$2
inputEncoding="utf-8"
outputEncoding="iso-2022-jp"
subjectHead="=?${outputEncoding}?B?"
subjectBody="`echo "$3" | iconv -f $inputEncoding -t $outputEncoding | base64 | tr -d '\n'`"
subjectTail="?="
subject="$subjectHead$subjectBody$subjectTail"
contents="`echo -e $4 | iconv -f $inputEncoding -t $outputEncoding`"
echo "$contents" | mail -s "$subject" "$to" -- -f "$from"
return $?
}
PSQL=`echo -e "\
〜〜〜SQL文〜〜〜
`

from="[email protected]"
to="[email protected]"
subject="件名を入力"
contents="SQLの結果"

result = echo "$PSQL" | psql -U hogehoge
contents=”結果です"
sendMail "$from" "$to" "$subject" "$contents$result"
186名無しさん@お腹いっぱい。:2014/02/03(月) 23:03:00.25
>>185

> result = echo "$PSQL" | psql -U hogehoge
result =$( echo "$PSQL" | psql -U hogehoge)
187185:2014/02/04(火) 13:38:46.35
>>186
ありがとうございます
しかし、それだと改行がされないんですよね

A 152
B 585
C 209

と出したいところが

A 152B 585C 209

のようになってしまいます
188名無しさん@お腹いっぱい。:2014/02/04(火) 15:50:22.05
>>187
こんな感じ?もっといい方法ないのかな

echo "$PSQL" | psql -U hogehoge | while read line;do
result="$result\n$line"
done
189名無しさん@お腹いっぱい。:2014/02/04(火) 16:03:23.99
シェルでやるよりperlか何かでやる方が楽そう。
190名無しさん@お腹いっぱい。:2014/02/04(火) 16:49:38.80
>>187
規制くらってたわ。
改行を保持したいのなら、引数でわたすのではなくsendMailの標準入力に渡したほうが楽だろ。
echo "$PSQL" | psql -U hogehoge | "$from" "$to" "$subject" "$contents"
にして、sendMailのmailコマンドを
{echo "$contents" ; cat - } | mail -s "$subject" "$to" -- -f "$from"
のようにして呼べばいい
191185:2014/02/04(火) 21:26:43.93
ありがとうございました!
192名無しさん@お腹いっぱい。:2014/02/08(土) 01:47:24.71
シェルでやれる範囲を超える場合はperlって人多いみたいけど、python派が少ないのは何でなの?
世の中的には最近やたらとpython流行ってるじゃないですか
193名無しさん@お腹いっぱい。:2014/02/08(土) 02:01:25.65
シェルスクリプトって one linerで書いてテストしながら組み合わせてく
ってよくやるけど、pythonは多くの構文が改行を要求するので、ふだんと
違う改行なしの書き方使うことに
なって違和感があるとか?

まあクオートの中に改行入れられるから、そうするって手もあるんだけど、
シェルによっては編集が不便になるし。
194名無しさん@お腹いっぱい。:2014/02/08(土) 02:25:02.21
echo $(( $RANDOM 55555 ))で55555までの乱数が出せますが、
55500から55555までと規制したい場合はどのようにすればいいのでしょうか?
195名無しさん@お腹いっぱい。:2014/02/08(土) 03:30:05.65
echo $(( (RANDOM % 56) + 55500 ))
196名無しさん@お腹いっぱい。:2014/02/08(土) 03:33:17.60
なるほど、そんなやり方があったんですね
参考になりました
197名無しさん@お腹いっぱい。:2014/02/08(土) 07:52:07.56
>>192
pythonは正規表現の使い勝手が良くないのとワンライナー書くのが実質的に無理
198189:2014/02/08(土) 11:22:11.44
perl以外でやっても別にいいよ。
だから「perlか何か」と書いている。
199189:2014/02/08(土) 11:28:02.40
perl使う人が多いのは
歴史が古いってのと他に乗り換える理由がないってだけじゃないかね。
ワンライナーにこだわる必要はないし、
いきなりpythonスクリプトのファイル書き始めても別にいいんじゃね。
好きな言語で好きなように書けばいい。
200名無しさん@お腹いっぱい。:2014/02/08(土) 15:19:08.22
>>196
それ自力で思いつかないとすると、相当センス悪いよ
201名無しさん@お腹いっぱい。:2014/02/08(土) 15:51:57.61
$RANDOMってたかだか 0〜32767 の値しかとらないから、
% 56 とかで剰余とったら値が小さい方に偏るから一様乱数にならないよ。
% 64 とか、2^n で剰余とった上で、値がはみ出した場合は再試行する方がいい。
202名無しさん@お腹いっぱい。:2014/02/08(土) 16:04:25.61
おおおおそういうことだったのか俺のバカ野郎!
横からだけど、ありがとう201さん!
203名無しさん@お腹いっぱい。:2014/02/08(土) 20:12:06.32
>>201
俺は言ってることがわからんけどw
コードでいうとどういう事?
204名無しさん@お腹いっぱい。:2014/02/08(土) 20:32:31.53
>>203
while (((i = RANDOM % 64) >= 56)); do :; done; echo $((i + 55500))
205名無しさん@お腹いっぱい。:2014/02/08(土) 20:58:46.89
>>192
デフォで入ってないから
206名無しさん@お腹いっぱい。:2014/02/08(土) 21:21:03.42
>>204
じゃぁ今思い付いたけど、ポート番号なんかのように数が大きい場合はどうするの?
49152&#8211;65535が自由に使えるけど、以下の場合は{$NUM}はどうするの?

while (((i = RANDOM % {$NUM}) >= 16384)); do :; done; echo $((i + 49152))

16384は2^nだけど、となるとi = RANDOM % 16384のままでいいの?
207名無しさん@お腹いっぱい。:2014/02/08(土) 21:22:59.32
というか、
echo $(( (RANDOM % 16384) + 49152 ))
のままでいいと言うことになるのかな?
208名無しさん@お腹いっぱい。:2014/02/08(土) 21:50:12.57
そういうことでしょ
2^nなら一様乱数になるんだから
209名無しさん@お腹いっぱい。:2014/02/08(土) 22:09:57.81
シェルスクリプトで実行したコマンド結果の標準出力、標準エラーをログファイルに出力するにはどうすればよいですか?

command > log.log

とひとつづつ書かないとだめなのでしょうか。
210名無しさん@お腹いっぱい。:2014/02/08(土) 22:15:11.27
#!/bin/bash
exec 1> log.txt
exec 2>&1

echo hoge
echo fuga >&2

ファイルにも標準出力にも出したい時は
exec 1> >(tee log.txt)
211名無しさん@お腹いっぱい。:2014/02/09(日) 16:46:34.97
>>209
スクリプト内のコマンド実行結果すべての標準出力/標準エラー出力を
まとめて同じログに送っていいなら、スクリプトの結果をリダイレクトすればよろし。
$ script.sh > log.log 2>&1

細かく制御したいなら、>>210 がよろし。
212名無しさん@お腹いっぱい。:2014/02/11(火) 11:30:01.58
>exec 1> log.txt
>exec 2>&1
なんで2行に分ける? basherは頭が悪いな
213名無しさん@お腹いっぱい。:2014/02/11(火) 18:09:26.52
exec 1> log.txt; exec 2>&1
こうか?
214名無しさん@お腹いっぱい。:2014/02/11(火) 18:14:28.58
xec >log.txt 2>&1

これかね 引数の順番を逆にすると駄目
215名無しさん@お腹いっぱい。:2014/02/12(水) 01:12:42.76
basherとかひとくくりにされてもな。
216名無しさん@お腹いっぱい。:2014/02/12(水) 01:20:04.91
バッシャー板前
217名無しさん@お腹いっぱい。:2014/02/12(水) 06:08:29.88
シェラー同士仲良くしろよ
218名無しさん@お腹いっぱい。:2014/02/12(水) 07:25:04.97
ゼットエスエッシャー
219名無しさん@お腹いっぱい。:2014/02/12(水) 08:43:11.54
今日も元気にシェルでワンタイマーしましょう
220名無しさん@お腹いっぱい。:2014/02/12(水) 16:58:41.44
>>215
> #!/bin/bash
こういうおバカはひとくくりでかまわない
221名無しさん@お腹いっぱい。:2014/02/12(水) 17:30:14.30
>>220
>>210 の最終行で named pipeの文法使ってるから #!/bin/bashにする必要がある。
#!/bin/sh で起動すると(たとえ実体はbashでも) sh互換モードになって named pipeの文法がエラーになる。
222名無しさん@お腹いっぱい。:2014/02/12(水) 18:31:03.25
>>221
bash固有機能は使うなよ
ということを言いたいのでは?
223名無しさん@お腹いっぱい。:2014/02/12(水) 18:46:49.62
>>222
使ってもいいじゃん、と言いたいのでは。
224名無しさん@お腹いっぱい。:2014/02/12(水) 19:07:56.04
tcsher涙目

・・・きっともう、シェルスクリプトはshやbashで書くtcshユーザも肩身が狭いんだろうな・・・
225名無しさん@お腹いっぱい。:2014/02/12(水) 20:22:10.38
zsherも忘れないで
226名無しさん@お腹いっぱい。:2014/02/12(水) 20:26:12.20
fisherさんかっこいい
227名無しさん@お腹いっぱい。:2014/02/12(水) 21:03:28.97
てっきり#!/usr/bin/env bashって書けって話しかと思ってた
228名無しさん@お腹いっぱい。:2014/02/12(水) 21:51:15.94
tcsh使う奴死ねと言われてからもう10年はたつだろ
もはやtcshユーザなんてどうしようもない偏執狂しか居ないはずだが
229名無しさん@お腹いっぱい。:2014/02/12(水) 22:03:29.03
HP-UXとかAIXとかはcsh標準らしいが
絶対使いたくないわ
230名無しさん@お腹いっぱい。:2014/02/12(水) 22:10:04.50
>>228
ホントスンマセン。by tcshユーザー

スクリプトは勿論Bourneシェルで書くんだけどねえ。
231名無しさん@お腹いっぱい。:2014/02/12(水) 22:10:16.14
そもそもHP-UXとかAIXとかいまさら使いたくない。
232名無しさん@お腹いっぱい。:2014/02/12(水) 22:16:18.78
>>230
それならいいんじゃね。
スクリプトのスレなんだから。
233名無しさん@お腹いっぱい。:2014/02/12(水) 22:26:25.01
>>232
あんがと。

企業で稀に見かけるcshスクリプト書きって、偏執狂というより
単なる物知らずって気がするよ。
bash登場以前、newcshとかあった頃は、対話的シェルはcsh系が
主流で、よく分かってない人の中には、なんとなくスクリプトもcshで
書くって人がいた(俺はその頃からスクリプトはBourneシェルだったけど)。
で、その頃に書かれたスクリプトを秘伝のたれみたいに直し直し
使ってるのを2000年頃に見て驚いたことがある。
俺のまわりでは、そういうのもさすがに滅んだけど。
234名無しさん@お腹いっぱい。:2014/02/12(水) 22:39:05.82
>>233
企業とか大学とかでもまだ見るよ、代々cshスクリプトをなおすところ。
基本 csh しかわからない人しかいないから sh に移行できない/しても指導できる人が居ない。
235224:2014/02/12(水) 23:00:07.35
>>230
同じく
つってもプロンプトを移植するのが面倒でtcsh使ってるだけのニワカだけど・・・
236名無しさん@お腹いっぱい。:2014/02/12(水) 23:13:14.98
俺も2000年ごろにcshスクリプトに遭遇したな
ログインシェルもcsh系だった気がする
今となってはcshしかわからない人なんていないでしょ
わざわざコストをかけて書き直すほどのものじゃないって

そういやFreeBSD鯖のログインシェルはtcshのままにしてるな
デフォルトから変更するほどシェルに思い入れが無いだけかも
237名無しさん@お腹いっぱい。:2014/02/13(木) 00:09:22.64
bashのスクリプトを標準出力に吐き出すスクリプトを作ったのですが、この結果を一時ファイルに保存せずに
そのまま実行する方法があったら教えてください。
吐き出すスクリプトは具体的にはffmpegを複数行実行するものです。
bash -s とかやってみたのですが、うまくいきませんでした。
238名無しさん@お腹いっぱい。:2014/02/13(木) 03:59:27.39
>>237
echo ls | bash -s
とかで動くけど? (この場合は -s は省略可)
239名無しさん@お腹いっぱい。:2014/02/13(木) 07:46:40.27
>>221
>>>210 の最終行で named pipeの文法使ってるから #!/bin/bashにする必要がある。
「named pipeの文法」ってなんだよ
これだからbasherは… w
240名無しさん@お腹いっぱい。:2014/02/13(木) 08:29:17.43
>>237
/dev/nullにリダイレクトしては駄目なの?
241名無しさん@お腹いっぱい。:2014/02/13(木) 11:03:48.37
>>237
eval `echo ls`
242237:2014/02/13(木) 12:55:37.44
>>238
そのやり方ですと、1行目で実行したffmpegが2行目以降を
キー入力として受け取ってしまうようなんです。。。
一度リダイレクトでファイルに出して、
bash tmp.sh
みたいにすれば問題なく逐次実行されます。
よく分かってないのですが、標準入力とttyの関係とかでしょうか
243名無しさん@お腹いっぱい。:2014/02/13(木) 13:17:07.98
>>242
ffmpeg </dev/tty
みたいにして、キー入力を端末に強制する方法と、
bash <(スクリプト)
みたいにして標準入力を使わずに済ます手がある。

だが、最初にキー入力の問題だと、ちゃんと書くように!w
244237:2014/02/13(木) 14:38:09.52
>>243
どちらの方法も完全にうまくいきました、ありがとうございました!
後者のやり方がなぜうまくいくのかまだピンときていませんが、
いろいろ調べてみようと思います。
あと最初からキチンと書かなくてすみませんでした
245名無しさん@お腹いっぱい。:2014/02/13(木) 16:42:41.00
>>244
プロセス置換でググってみな
246237:2014/02/13(木) 17:03:46.98
>>245
なるほど、こういう機能ってzshにある感じはしていたのですが、
bashにもあるんですね!
bashの ( ) はサブシェルだと思っていました…
247名無しさん@お腹いっぱい。:2014/02/13(木) 22:47:07.79
確かにzshにしかない機能と思ってたのがbashにあって驚くことあるな
少しずつ入れてんのかね
248名無しさん@お腹いっぱい。:2014/02/13(木) 22:49:59.70
入ってるね。
個人的には {1..30}が入ったのは地味に大きい。
それでもzsh使ってるけど。
249名無しさん@お腹いっぱい。:2014/02/13(木) 23:12:09.87
ヒストリの共有(share_history)が bash にも欲しい
250名無しさん@お腹いっぱい。:2014/02/13(木) 23:16:17.55
日々使うインタラクティブシェルとしてはzshが良いけど
バッチ処理させるスクリプトとしてならbashの方が使いやすい
というかzshは機能多すぎドキュメント多すぎで訳ワカメ
251名無しさん@お腹いっぱい。:2014/02/13(木) 23:39:34.45
スクリプトでもzshにしてる
どの機能がbashがサポートしてるか調べるのめんどい
252名無しさん@お腹いっぱい。:2014/02/14(金) 00:11:56.32
zshは.zshrc等をてんこ盛りにしてると、zshスクリプトが読み込みに超長時間かかる
かといって #!/bin/zsh -f にするとめちゃ使いづらいし・・・痛し痒し
253名無しさん@お腹いっぱい。:2014/02/14(金) 03:53:13.33
zshはバグ多い。

#!/bin/zsh
echo hoge >file1 >file2 >/dev/stdout

↑これだけで固まるw
254名無しさん@お腹いっぱい。:2014/02/14(金) 07:49:53.20
zshでスクリプト書くぐらいならperlでいいじゃんと思う
255名無しさん@お腹いっぱい。:2014/02/14(金) 07:55:46.01
>>249
PROMPT_COMMANDを仕込むことで実現してる人はいるよ。
http://iandeth.dyndns.org/mt/ian/archives/000651.html
でも標準機能としてほしいのは同意。
256名無しさん@お腹いっぱい。:2014/02/14(金) 10:23:51.87
>>138
ConnectBot、メモリ食い杉だ。他のシェル端末の方がいい。
257名無しさん@お腹いっぱい。:2014/02/14(金) 12:03:01.25
>>253
それバグじゃなくね。
258名無しさん@お腹いっぱい。:2014/02/14(金) 14:58:36.75
どうみてもバグだった
259名無しさん@お腹いっぱい。:2014/02/14(金) 15:23:01.77
>>256
オススメってある?
260名無しさん@お腹いっぱい。:2014/02/14(金) 23:52:33.86
>>253
何これ誰か解説して
261名無しさん@お腹いっぱい。:2014/02/15(土) 00:24:21.36
社史編纂室くんの出番や
262名無しさん@お腹いっぱい。:2014/02/17(月) 00:17:17.98
編纂の「纂」の字書ける人どんくらいいるだろう
263名無しさん@お腹いっぱい。:2014/02/17(月) 16:13:15.32
chassisのスペルと発音ちゃんと覚えてる人どんくらいいるだろう
264名無しさん@お腹いっぱい。:2014/02/17(月) 20:52:24.81
chassis hen sun shits
265名無しさん@お腹いっぱい。:2014/02/19(水) 16:43:38.09
初めてbashでスクリプト組んでるんですが、
. ./hoge.sh fuga.txt
みたいに引数渡して起動してるシェルを、引数変えて再起動するにはどうすればいいですか?
シェル内で
. ./hoge.sh $fuga
みたいに変数いれたらダメで、
. ./hoge.sh fuga2.txt
みたいに指定したら行けます。
266名無しさん@お腹いっぱい。:2014/02/19(水) 17:15:31.06
なんでsourceするの? ちょっと間違うと無限sourceループになるよ。
267名無しさん@お腹いっぱい。:2014/02/19(水) 17:18:00.48
>>265
その $fuga というのがスクリプト起動時にはまだ値がないんだろ? それなら駄目。
hoge.sh の中で fugaに値が代入されるとしても、それを起動時に指定することはできない。
268名無しさん@お腹いっぱい。:2014/02/19(水) 17:29:23.50
>>266
同じ構成の画面を、設定ファイルを指定して使い回すためです

>>267
ありがとうございます。
テキストにでも書き出して、そこから読み直してみます。
269名無しさん@お腹いっぱい。:2014/02/19(水) 17:49:40.79
>>267
だから、なぜ普通に起動せずにsourceで実行するのかを聞いてるんだが。
270名無しさん@お腹いっぱい。:2014/02/19(水) 18:00:57.53
>>268
init.dとかのスクリプト見て真似てみたら。
関数にして呼び出す。
271名無しさん@お腹いっぱい。:2014/02/19(水) 22:59:42.02
普通に出来るけど

$ cat hoge.sh
echo "hoge.sh is called with $1"
if [ "$1" = "fuga.txt" ] ; then
fuga="fuga2.txt"
. ./hoge.sh $fuga
fi

$ . ./hoge.sh fuga.txt
hoge.sh is called with fuga.txt
hoge.sh is called with fuga2.txt
272265:2014/02/20(木) 09:12:57.78
みなさんありがとうございます。

どうやら変数の入れ方の様です。

fuga.txtに
trans_2=fuga2.txt
があって、

read input_key #ここで2を入力
eval input_trans='$trans_'input_key
echo $input_trans

これで
fuga2.txt
と出力されるのですが、
. ./hoge.sh $input_trans
とすると、引数を読まない感じです。
直前に
$input_trans=”fuga2.txt”
といれると動きます。

端末から直接書き込めないので、スマホで打ってるので、
読みにくくて申し訳ないです。
273名無しさん@お腹いっぱい。:2014/02/20(木) 11:48:12.75
なんでman見ないんだ?
. にはオプショナル引数は渡せない。無視される。

>>271
basherは「普通に」と言うな
274265:2014/02/20(木) 13:03:57.32
>>273
なるほど。ありがとうございます。

manはききませんでした。
cygwinなので、インストールをスキップされてるのかもしれないです。
275名無しさん@お腹いっぱい。:2014/02/20(木) 14:55:50.29
>fuga.txtに
>trans_2=fuga2.txt
>があって、

もしかしてfuga.txtもsourceする?
そこに原因がある気がする
276名無しさん@お腹いっぱい。:2014/02/20(木) 19:07:54.76
>>273
でも、今は「普通=bash」だから仕方ないですよね・・・
277名無しさん@お腹いっぱい。:2014/02/20(木) 19:23:08.95
ログインシェルとシェルスクリプトシェルを混同すんな
ログインシェルならtcshユーザだってそこそこ居るんだぞ
278名無しさん@お腹いっぱい。:2014/02/20(木) 19:40:30.63
さすがに今はいないよ
279名無しさん@お腹いっぱい。:2014/02/20(木) 20:02:25.81
そもそもtcshがまだ存在するということに驚くというか
動いているところを見たことはない
280名無しさん@お腹いっぱい。:2014/02/20(木) 20:04:39.54
冬だからな
281名無しさん@お腹いっぱい。:2014/02/20(木) 20:54:06.58
>>278
俺 csh なんだけど…。
実体は tcsh の csh モード。
282名無しさん@お腹いっぱい。:2014/02/20(木) 20:56:14.43
そもそもみんなログインシェルは
何をきっかけに乗り換えるものなんだ?

俺にはまだきっかけが来ない。
283名無しさん@お腹いっぱい。:2014/02/20(木) 21:23:05.80
>>282
俺は最初に与えられたのが tcsh で、暫くそれ使ってたが、人の書いたシェルスクリプトを修正したり
しているうちに sh の文法の方が詳しい状態になったから bash に移行したわ。
部屋の模様替えみたいな気分でやってみればいいんじゃね?
284名無しさん@お腹いっぱい。:2014/02/20(木) 21:34:22.21
ふと思いたってbashからzshに乗り換えた。今ではもう戻れない
285名無しさん@お腹いっぱい。:2014/02/20(木) 21:41:08.58
csh->tcsh->bash->zsh->csh
堂々巡りでもうどうでも良く
286名無しさん@お腹いっぱい。:2014/02/20(木) 21:44:27.47
なんか俺は多分 csh の全機能の 10 分の 1 くらい
しか使ってないだろうから、csh は機能が足りないと
か不便だとか言えなくてなあ。
287名無しさん@お腹いっぱい。:2014/02/20(木) 22:02:13.11
.cshrcが50kBもあるw
288名無しさん@お腹いっぱい。:2014/02/21(金) 00:01:47.64
>>278
な?そこそこ居るだろ?
289名無しさん@お腹いっぱい。:2014/02/21(金) 00:31:42.46
このスレ、この板にいてなおcsh使いがいるとか・・・tcshならともかく
自分で使う分には勝手だけど、くれぐれも後輩に広めんなよ
290名無しさん@お腹いっぱい。:2014/02/21(金) 00:34:46.45
ログインシェルとしての欠点を教えてくれ
欠点って.cshrcがcshスクリプトだから.cshrcのカスタムに拘ると死ぬくらいじゃねーの?
291名無しさん@お腹いっぱい。:2014/02/21(金) 00:37:33.91
実行結果の違いでも出して論じてくれるなら見てて楽しい
でも、そうでないなら・・
292名無しさん@お腹いっぱい。:2014/02/21(金) 00:39:27.04
cshって補完機能をカスタムできるんですか?
293名無しさん@お腹いっぱい。:2014/02/21(金) 00:42:49.85
うーん?cshもけっこういろいろあって、オリジナルのcshはかなり低機能だったけど、
最後にみたcshは補間機能とかけっこう充実してた記憶が
294名無しさん@お腹いっぱい。:2014/02/21(金) 01:03:08.94
>>293
すいません、csh系のシェルについて聞いたつもりでした。
tcshとかだとできるんですかね?
295名無しさん@お腹いっぱい。:2014/02/21(金) 04:20:50.14
ログインシェル云々の話が出てるけど、ログインシェルを普段使うシェルとは
別ものにしてる人っていんの?ログイン後にわざわざ切り替えてんの?ありえねー
俺なんか$HOME下にビルドした最新のzshを躊躇なくログインシェルにしてるわ
296名無しさん@お腹いっぱい。:2014/02/21(金) 08:14:31.18
>>290
stderrだけをリダイレクト出来ない
297名無しさん@お腹いっぱい。:2014/02/21(金) 08:25:11.31
foreachを1行で書けない
298名無しさん@お腹いっぱい。:2014/02/21(金) 16:10:18.18
>>295
zshのログインシェルでviをたちあげcshスクリプトを書く、とかそういうことじゃないの
299名無しさん@お腹いっぱい。:2014/02/21(金) 16:59:25.85
chshでシェル変えちゃうとそのシェルがないときにログイン不能になるから
.bashrcに/usr/bin/zshって書くべし
みたいなことをFreeBSDのマニュアルかなんかに書いてた気がする
300名無しさん@お腹いっぱい。:2014/02/21(金) 17:07:53.80
俺は/etc/shellsにzshがないから仕方なくcshrcにexec zshしてる鯖があるな
301名無しさん@お腹いっぱい。:2014/02/21(金) 17:16:01.62
>>295
俺は毎日他社の違うサーバにrootアカウントで入る日々だから
ログインしたら1発目のコマンドが
# /bin/csh ; exit
だ。
元のログインシェルが何か調べもしない。
OSの素性を調べるのもそれから。
そのあと好みの環境変数等を全部手打ちして
それからOSの素性を調べてから作業に入る。
302名無しさん@お腹いっぱい。:2014/02/21(金) 17:29:18.58
今どきLinux系なら/bin/cshがないことも多いと思うけど
あと/bin から /usr/bin に移行しつつあるし
303名無しさん@お腹いっぱい。:2014/02/21(金) 17:37:06.32
>>301
# exec /bin/csh でいーんじゃないの
304名無しさん@お腹いっぱい。:2014/02/21(金) 17:45:24.20
>>299
今どきそんなケースほぼないだろ。
305名無しさん@お腹いっぱい。:2014/02/21(金) 17:58:45.34
chshが存在と/etc/shellsの確認するだろ
306名無しさん@お腹いっぱい。:2014/02/21(金) 18:11:52.15
NIS使ってるときとかの話じゃね。
あるマシンでchshした後別のマシンに入ったらうんぬんとか。
307名無しさん@お腹いっぱい。:2014/02/21(金) 19:30:24.72
>>301
cshがデフォルトでインストールされてる環境ってどこのやつ?
ちょっと気になったので雑学として聞いておきたいです
308名無しさん@お腹いっぱい。:2014/02/21(金) 20:22:59.07
手元のマシンだと /bin/csh は
CentOS, FreeBSD -> ある
Debian, Ubuntu, Arch, Gentoo -> ない
だな Debian は minimal から構築したもので Ubuntuはサーバ版
CentOSはVPNとして借りてるものだから俺がセットアップしたのではないが
309名無しさん@お腹いっぱい。:2014/02/21(金) 20:36:14.42
とてつもなく古い製品で無ければ、
(正統な意味での)UNIXのライセンスを受けてるUNIX系のOSならば、
ほぼcsh入ってるんじゃないかな
310301:2014/02/21(金) 20:49:22.89
>>307
RHELとSolarisがほとんどで
他はだいたいCentOSかFreeBSDかUbuntu。
/bin/cshが無いOSがあるって
まだ気づいてなかった。
311名無しさん@お腹いっぱい。:2014/02/21(金) 21:38:14.73
まあ会社のサーバなら管理者が
そーゆー人のためにcsh入れておいてくれるだろうね
312名無しさん@お腹いっぱい。:2014/02/21(金) 21:42:31.39
>>304
現在稼働しているあらゆるUnix系OSではzshがデフォルトでインストールされてるの?
313名無しさん@お腹いっぱい。:2014/02/21(金) 22:09:32.28
>>308
デフォルトでインストールされてるかの答えになってなくね。
314名無しさん@お腹いっぱい。:2014/02/21(金) 23:13:18.36
>>313
zshのことなら、ない環境一杯あるでしょ。
RHELあたりでも、ミニマムだと入らないはず。
いわんや商用UNIXをや。
315名無しさん@お腹いっぱい。:2014/02/21(金) 23:17:19.51
>>302
ん?/binがないってこと?
シェル系が/usr/binに移ったってこと?
316名無しさん@お腹いっぱい。:2014/02/21(金) 23:58:38.37
>>314
商用UNIXだと入ってないことがスパコンで何度もあったよ
去年某大学の共用スパコンでも入っていなかった
317名無しさん@お腹いっぱい。:2014/02/22(土) 00:12:01.18
>>316
スパコンとかこの手の環境だとよくあるね
下手するとcsh推奨とか言い出す
死ね
318316:2014/02/22(土) 00:16:16.51
>>317
csh推奨というかtcshなしbashなしで
sh,csh,kshしか入ってなかった前の職場orz
319名無しさん@お腹いっぱい。:2014/02/22(土) 00:28:48.57
そりゃ、商用UNIXの製品にオープンソース系のコードをほいほい取り込めないからなあ。
sh、csh、kshあたりは商用UNIXのコードに標準で取り込まれてるんだよ。
320316:2014/02/22(土) 00:40:44.56
>>319
それは分かってるんだけど
/usr/localや/optなんかにソフトが大量に入ってるのに
シェルだけはインストールしてくれないんだよ
頼んでもその三つを使えってことで
321名無しさん@お腹いっぱい。:2014/02/22(土) 01:10:22.94
コンパイラあるんだったら自分でビルドするのはどうなんだろう
あーでも癖のある商用UNIXじゃbashやzshのビルドは難しいのかな
322名無しさん@お腹いっぱい。:2014/02/22(土) 01:30:17.61
>>321
bashやzshだけのビルドはうまくいかなかったおぼえがある
ビルドの失敗だけじゃなくで実行時にfatal errorとか
GNU iconvみたいな依存するライブラリも含めてビルドすれば問題なかったけど
323名無しさん@お腹いっぱい。:2014/02/22(土) 04:40:21.34
コンパイラ自体がそれらのコードを受け付けない場合も辛いが、
自分でビルドってのはその辺の面倒まで見ることを言うんじゃね?
324名無しさん@お腹いっぱい。:2014/02/22(土) 09:11:42.61
>>314
zshの話じゃなくcshの話だよ。
325名無しさん@お腹いっぱい。:2014/02/22(土) 09:13:40.98
>>315
Solaris とかは /bin は /usr/bin へのシンボリックリンクだね。
326名無しさん@お腹いっぱい。:2014/02/22(土) 09:17:42.37
イマドキは /system/bin/sh だったり、、
327名無しさん@お腹いっぱい。:2014/02/22(土) 11:01:57.40
>>324
「Debian,Ubuntu,Gentoo,Archはない」って書いてあるのでは?
328名無しさん@お腹いっぱい。:2014/02/22(土) 12:06:00.19
>>325
>>326
個人的に、そういう構成、マジで誰得なんだ?って思う
329名無しさん@お腹いっぱい。:2014/02/22(土) 13:21:23.93
>>325
Archも/binと/sbinが/usr/binになってるな
330名無しさん@お腹いっぱい。:2014/02/22(土) 13:24:08.27
/binが/usr/binのシンボリックリンクになってるのは過去の互換性というか
#!/bin/bash って書いちゃってるスクリプトへの対処療法的な措置だろ
331名無しさん@お腹いっぱい。:2014/02/22(土) 15:09:58.51
>>330
そんなおまぬけの救済なんてしなくていいのに
332名無しさん@お腹いっぱい。:2014/02/22(土) 16:57:37.93
しかし
#! /usr/bin/env bash
だとPATHに自分でコンパイルしたbashとかあった時にそっちが実行されちゃう罠
333名無しさん@お腹いっぱい。:2014/02/22(土) 18:12:16.67
$ type env
env is /usr/local/bin/env
334名無しさん@お腹いっぱい。:2014/02/22(土) 19:08:02.27
bashも/usr/local/binへインストールされているのがおにあい。
335名無しさん@お腹いっぱい。:2014/02/22(土) 19:15:41.79
FreeBSDでは実際/usr/local/bin/bashに入るしね
336名無しさん@お腹いっぱい。:2014/02/22(土) 19:48:12.61
#! /usr/bin/env PATH=/bin:/usr/bin:/usr/local/bin bash
337名無しさん@お腹いっぱい。:2014/02/22(土) 21:11:31.17
>>328
嫌なら rm /bin しとけばいいんじゃね。
338名無しさん@お腹いっぱい。:2014/02/22(土) 22:35:54.11
rmは怖いからunlink使うことにしてる
339名無しさん@お腹いっぱい。:2014/02/22(土) 23:22:31.91
ミッションクリティカルな分野とかスパコンとかでも、徐々にLinuxが浸透しつつあるし
商用Unixが駆逐される日も遠くないだろうな
そのときは晴れてシェルがbashとzshに統一されるわけだ
340名無しさん@お腹いっぱい。:2014/02/23(日) 01:06:17.56
>>314>>327
>>308はデフォルト環境じゃない状態でのサーバだから参考程度

>>324
>>301>>307はcshの話だけど>>299>>304-306>>312はzshの話
301の場合入ってなくても弾かれるだけだが、299,304-306の場合ログイン不能になるからまじでヤバイ
341名無しさん@お腹いっぱい。:2014/02/23(日) 22:40:39.22
bashはGPLだしそのあたりがまずいこともあるはず何だよな。
ところで、/usr/binって、/binへ移行していく風潮なかったけ?

その話を見たとき、数年後にはまた、パス関係ではまるのかーと少し意識した記憶がある。
342名無しさん@お腹いっぱい。:2014/02/23(日) 22:44:06.71
少なくともFedoraとArchは逆だな
最近/binがなくなって/usr/binになった
一応シンボリックリンクとして残っているけど
343名無しさん@お腹いっぱい。:2014/02/23(日) 23:06:55.05
>>341
基本は /usr/ 以下に移そう、ほんとに必要なのだけ / 直下に置こう、
っていう方向じゃないの。
344名無しさん@お腹いっぱい。:2014/02/24(月) 02:25:20.47
rootが何かしないと変更されないものはusrだっけ。usrをnfsでmountする時はどうするんだろ。
345名無しさん@お腹いっぱい。:2014/02/24(月) 08:35:23.83
その辺はFHSでも読んでくれ。
346名無しさん@お腹いっぱい。:2014/02/24(月) 08:39:49.50
FHSだとNFSまでの最低限は/binに入れるだったのでは。
347名無しさん@お腹いっぱい。:2014/02/24(月) 09:06:15.40
>>346
それは /sbin
348名無しさん@お腹いっぱい。:2014/02/24(月) 11:07:05.89
/sbin/sh がないので /sbin だけじゃ NFS マウントできないのでは?
solaris は /sbin/sh があるので可能だけど。
349名無しさん@お腹いっぱい。:2014/02/24(月) 11:10:08.04
>>348
> /sbin/sh がないので
それどのOSの話?
350名無しさん@お腹いっぱい。:2014/02/24(月) 11:20:46.09
>>349
たいていの OS。
起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
/bin は少なくともローカルになければならない。
solaris はそうなっていないので、/sbin だけローカルにあれば /bin も NFS に置ける。
というか、/bin -> /usr/bin の symlink だけど。
351名無しさん@お腹いっぱい。:2014/02/24(月) 11:25:45.58
>>350
> 起動時に NFS マウントするためのスクリプトが #!/bin/sh で書かれているので
それ思い込みじゃね?
352名無しさん@お腹いっぱい。:2014/02/24(月) 11:41:04.26
手元のUbuntu見ると、確かに/sbin/shは無いな
何故無いんだろう。まずいことでもあるんかな
353名無しさん@お腹いっぱい。:2014/02/24(月) 17:17:57.92
/etc/fstabに書かれたNFSなどは初回は無視されて、それマウントするのがinit.dのnetfsとかのシェルスクリプトだっけか
確かUbuntuでnetfs自体行方不明だったから仕方なくrc.localだかにmount -aを書いた覚えがあるけど、
最近はその手の初期化周りを制御するinitdを置き換えるlaunchdとかも出てきてるし今はどうなってるんだろうな?
354名無しさん@お腹いっぱい。:2014/02/24(月) 17:22:15.07
もういいかげんスレ違いじゃね。
355名無しさん@お腹いっぱい。:2014/02/24(月) 22:05:45.65
/sbin/shは昔はもっと意味があったのだよ
今は/usr何かを別のファイルシステムでマウントするとかほとんどないからな、さして重要な意味がないのでlinux何かでは一緒くた。
solarisでも今は形骸化してる。
/binだけローカルにあったって、実行できないんだぜ?
356名無しさん@お腹いっぱい。:2014/02/25(火) 01:07:06.24
>>343
ありゃ、逆でしたか失礼。
シェルの先頭で変数に入れちゃうから、かわってもそこを変えるだけですむようにはなっているのですがね。
バージョン違いでパスがかわるとめんどうだなぁ。
357名無しさん@お腹いっぱい。:2014/02/25(火) 01:17:07.19
シェルで@はOKですが、AがNGです。 シェルの中でfindコマンドは*(アスタリ スク)は使用できないのでしょうか? echoで表示は出来ているのですが。。。

# @ これはOK
find /log/*/*/*.log -type f

# A これがNG
set target="/log/*/*/*.log"
echo ${target}
find "${target}" -type f
358名無しさん@お腹いっぱい。:2014/02/25(火) 01:23:50.19
引用符外してみたらどうでしょ
359名無しさん@お腹いっぱい。:2014/02/25(火) 01:30:20.87
target='./log/*/*/*.log'
echo "$target"
find ${target} -type f

setって何だよ
360名無しさん@お腹いっぱい。:2014/02/25(火) 01:42:43.84
cmd.exeっていうシェルの環境変数設定コマンド
361名無しさん@お腹いっぱい。:2014/02/25(火) 01:44:55.10
これが社史編纂室系か
362名無しさん@お腹いっぱい。:2014/02/25(火) 02:02:27.91
社史を編纂しながらシェルスクリプトを作っていく、か

どうすればそんなうらやましい立場になれるんだ
363名無しさん@お腹いっぱい。:2014/02/25(火) 02:03:13.53
>>355
うちのDebianの/binで調べたら、/usrにリンクしてるのは、ping6だけだった。普通、/libに入れるんじゃないか。
364名無しさん@お腹いっぱい。:2014/02/25(火) 06:49:13.36
オレあと3年で定年だから社史編纂室みたいなところで平穏無事に時間だけ早く3年経って欲しいわ
365名無しさん@お腹いっぱい。:2014/02/25(火) 08:03:02.89
>>364
老い先短いんだから平穏無事はともかく時間を急いては勿体無いですよ、先輩。
366名無しさん@お腹いっぱい。:2014/02/25(火) 17:27:12.85
bashで、メールが来た時 You have mailって出ますよね。
これを、特定の相手からのメールのみ表示するとか、相手によって表示メッセージ変えることとかできますか?
367名無しさん@お腹いっぱい。:2014/02/25(火) 17:33:51.26
できません。
368名無しさん@お腹いっぱい。:2014/02/25(火) 22:15:55.65
bashじゃなくてもいいんですが、メールが来た時 You have mailって出るのを、
ウェブメールにも対応させることってできますか?
369名無しさん@お腹いっぱい。:2014/02/25(火) 22:21:28.60
できません。
370名無しさん@お腹いっぱい。:2014/02/25(火) 22:49:28.41
bashかzshで、ウェブサイトにhttpsでアクセスして、
認証させて、ページ内容のHTMLを取得して、
解析したり加工したりして前回との差分を取る関数を作って、
その結果でプロンプトを変えることはできますか?
371名無しさん@お腹いっぱい。:2014/02/25(火) 22:55:36.70
できる
372名無しさん@お腹いっぱい。:2014/02/26(水) 08:11:52.00
優しいやつめ
373名無しさん@お腹いっぱい。:2014/02/26(水) 12:17:53.68
できるとは思うけど、ネットの都合によっては、
プロンプト出すたびに10秒とか1分とかかかりそう。
バックグラウンドで数分おきに監視して、
ファイルに蓄積していくとかすればいいのかな。
374名無しさん@お腹いっぱい。:2014/02/28(金) 11:38:51.59
bash で書いたスクリプトって、そのままでzshでも動きますか?
375名無しさん@お腹いっぱい。:2014/02/28(金) 11:55:22.31
とりあえずword splitでハマる
376名無しさん@お腹いっぱい。:2014/02/28(金) 12:09:17.24
posix準拠のみの機能しか使ってなければ大丈夫
377名無しさん@お腹いっぱい。:2014/02/28(金) 12:25:19.32
posix準拠のみの機能しか使ってなくてもword splitでハマる
378名無しさん@お腹いっぱい。:2014/02/28(金) 14:48:39.14
zshってcsh並に絶滅寸前だよね・・・
379名無しさん@お腹いっぱい。:2014/02/28(金) 14:49:38.13
いっしょにすんなw
380名無しさん@お腹いっぱい。:2014/02/28(金) 15:51:59.28
ビル・ジョイに失礼だ。
381名無しさん@お腹いっぱい。:2014/02/28(金) 18:30:50.64
すみませんでした
cshはまだまだ減益ですね
382名無しさん@お腹いっぱい。:2014/02/28(金) 18:36:01.06
いいえcshが原液だったことはありません
383名無しさん@お腹いっぱい。:2014/02/28(金) 19:54:21.74
1
ターミナルから青空文庫など文章サイトの特定のhtmlにアクセスして、タグを除いた文章のみを抽出し、それをテキストファイルにして保存。
(出来ればそれをTeX文書にして、事前に決めた設定でPDF出力)

2
ターミナルから音楽視聴サイトなどのhtmlにアクセスして視聴できる曲のタイトルを抽出したのちプロンプトに表示。
その後入力を促し、入力に応じてプレイヤーで特定の曲を聴く、もしくはなにもしない。
(そのサイトではタイトルからmp3のurlが推測可能で、タイトルさえ取れればいい)

ということをやるために勉強をしたいのですが、
こういうことをやる為にはシェルスクリプトを勉強すれば大丈夫ですか?
それともCとかPythonとかPerlとかを勉強した方がいいですか?
384名無しさん@お腹いっぱい。:2014/02/28(金) 19:58:10.34
ちょっと質問いいですか
if文でこんなふうに x とかの文字を挟むスクリプトをよく見かけるんですが
if [ "x$hoge" == "xYes" ]
なんでこうするんですかね?普通に
if [ "$hoge" == "Yes" ]
じゃまずい場合があるとか?
385名無しさん@お腹いっぱい。:2014/02/28(金) 20:05:26.65
>>383
htmlのパーサはbashじゃちと辛いからPerlとかPythonとかが一番向いてると思う
その用途ならCは要らんな
386名無しさん@お腹いっぱい。:2014/02/28(金) 20:45:34.67
>>385
ありがとうございます。
いずれにしろ使える知識なので少しは勉強するつもりですが
上の目的の為にはPerlかPythonを使います。
387名無しさん@お腹いっぱい。:2014/02/28(金) 21:01:20.16
>>384
$hoge に空白が入ってきた場合や何も入っていない場合に

if [ "$hoge" == "Yes" ]
だと
if [ == Yes ]
こうなり、

if [ "x$hoge" == "xYes" ]
だと
if [ x == xYes ]
こうなる。

なので、
388名無しさん@お腹いっぱい。:2014/02/28(金) 21:13:35.45
ワロタw
389名無しさん@お腹いっぱい。:2014/02/28(金) 21:34:57.30
>>387
変数をダブルクォートで囲ってあれば、xとか前につけなくても平気じゃないの?
昔、つけないとヤバイ場合があった記憶があるんだけど思い出せない
390名無しさん@お腹いっぱい。:2014/02/28(金) 22:03:37.81
俺は "-x" のようにハイフンで始まるとオプションとして扱われるからだったような気がするけど
手元で試したら普通にハイフンで始まっても大丈夫だったな
391名無しさん@お腹いっぱい。:2014/02/28(金) 22:23:09.55
あと [ ] 内って == 使えたっけ?
392名無しさん@お腹いっぱい。:2014/02/28(金) 22:26:08.16
うちの環境だと
/usr/bin/[ は == がOK
bashの組み込みの[も == がOK
sh(dashだった)の組み込みの[は == がNG
393384:2014/02/28(金) 23:21:24.48
>>387
いや、>>389の言う通り、普通は未定義変数でもダブルクォートしてれば空文字扱いになるよね?
おそらくそうはならない環境のための配慮かと思ったんだけど・・・
誰かこの辺詳しい人いません?
394名無しさん@お腹いっぱい。:2014/02/28(金) 23:45:51.04
395名無しさん@お腹いっぱい。:2014/03/01(土) 00:00:04.36
>>394
おードンピシャなページですわthx
なるほど、[ がビルトインじゃない時代の互換性のためだったのね
じゃあ今の時代では必要なシーンなんてほぼ皆無だろうね
396名無しさん@お腹いっぱい。:2014/03/01(土) 08:47:18.39
未だに if [ "x$hoge" = "xYes" ] とか書いてるプログラマーorシス管見つけたら
社史編纂室に異動させるわ
397名無しさん@お腹いっぱい。:2014/03/01(土) 14:12:39.58
>>383
連番のH画像/動画を一気にダウンロードする6
http://toro.2ch.net/test/read.cgi/unix/1349257148/

スレ2個目ぐらいまでが参考になる。
398名無しさん@お腹いっぱい。:2014/03/01(土) 15:45:04.91
既存ファイルの特定文字列にマッチした行の下に、任意の文字列を挿入する一般的な方法ってないですか?
ここで言う任意の文字列というのは、$'"/などの記号文字や改行も含む複数行から成る文字列です。
できれば

str="
文字列1
文字列2
・・・
文字列n
"

というstrを作った上、sedなどで一発でできればいいのですが。
399名無しさん@お腹いっぱい。:2014/03/01(土) 16:38:27.39
>>395
ビルトインでない [ はビルトインの [ を持っていないシェルのために存在するものちゃうの?
将来的には消してビルトインの方に統一するんちゃうの?

やったら逆やと思うんやけど。
400名無しさん@お腹いっぱい。:2014/03/01(土) 16:45:16.38
>>398
sed '/hoge/a --foo--\n--bar--' -i file
401名無しさん@お腹いっぱい。:2014/03/01(土) 17:00:58.86
ここのスレレベル低いから質問しても知ったかのバカが適当に答えてるだけだよw
見ててわかるからおもろいw
402名無しさん@お腹いっぱい。:2014/03/01(土) 19:15:34.15
と、低レベルがうなってます
403名無しさん@お腹いっぱい。:2014/03/01(土) 21:37:01.64
>>400
変数strを使う場合はどうですか?
sed '/hoge/a $str' -i file だとstrの中身が返らないし
sed "/hoge/a $str" -i file だとエラーになるんですよね。
結局strの中身の特殊文字をうまくエスケープしておかないと駄目みたいで、面倒だなぁと前から思ってまして。

別にsedに拘っているわけではないです。とりあえず今はこんなふうにして凌いでいます。

cat > file2 <(sed -n "1,/hoge/ p" file) <(cat << EOF
文字列1
文字列2
・・・
文字列n
EOF
) <( sed -n "/hoge/,$ p" file | tail -n +2 ) ; mv file2 file

いまいちカッコ悪くて気に入りません。
それに file が巨大な場合は2回sedをかますのは非効率的だろうし。。。

この手の挿入処理はよくあるテクだと思うので、他にもっと良い方法があるんだろうと思ってたのですが。
404名無しさん@お腹いっぱい。:2014/03/01(土) 21:51:22.31
sedが駄目ならawk使えば

hoge='ho$ge
fu/g"a
piyo'

echo "apple
banana
orange" | awk -v hoge="$hoge" '{print}/banana/{print hoge}'
405名無しさん@お腹いっぱい。:2014/03/01(土) 22:04:11.17
>>404
おぉ、そんな方法が!awkに変数をまるっと渡せるのがミソですね。
ありがとうございました。
406名無しさん@お腹いっぱい。:2014/03/01(土) 23:48:56.90
shでechoの出力先をデフォルト標準出力、ファイル指定されてたらそのファイルと言うことをしたいのだけど。
/dev/stdoutがsuした後だと使えません。

出力先が指定されているかいないかで分岐して同じechoすればいいだけなのだけど、
分岐なしでいけるクールなやり方ありませんか?
407名無しさん@お腹いっぱい。:2014/03/02(日) 00:07:17.74
良く分からんが exec 1> file とかじゃ駄目なのか
408名無しさん@お腹いっぱい。:2014/03/02(日) 02:09:02.35
>>398
「できれば」以降がよくわからんけど・・・
Perlで全文読みきって正規表現で置換するワンライナー書けばいいと思う
Perlの正規表現なら改行文字を含んで複数行のマッチが書ける

sedでも出来る気はするけどsed使うの苦手なんで他の人にパス
409名無しさん@お腹いっぱい。:2014/03/02(日) 04:18:36.46
>>408
sed使うの得意じゃないが >>403 のように変数じゃなくて構わないなら
$ sed "/hoge/ {
a 文字列1
a 文字列2
a ・・・
a 文字列n
}" <file

とか,一旦ファイルに落としてこんな感じとか

tmpfile=`mktemp`
trap "rm -f $tmpfile" EXIT
echo -n "$str" >$tmpfile
sed "/hoge/ r $tmpfile" <file

それも嫌ならこんな形?

sed "/hoge/ r /dev/stdin" -i f1 <<EOF
$(echo "$str")
EOF
410名無しさん@お腹いっぱい。:2014/03/02(日) 05:08:57.04
あー>>404さんの方法、マッチする/banana/の部分も変数で渡したい場合は駄目でした。
/ /の中身は正規表現で解釈されちゃうからエスケープが必要ですねorz

hoge2='hoge$hoge'

echo "apple
banana
orange" | awk -v hoge="$hoge" -v hoge2="$hoge2" '{print}/hoge2/{print hoge}'


>>408
「できれば」というのは、挿入したい文字列をそのままの形でスクリプトに書いておいて、
その後の挿入処理もsedなどで華麗にワンライナーで書きたい、という願望です。

perlならできるのでしょうか。ゴミみたいな知識しかないので少し勉強しなきゃ。。
411名無しさん@お腹いっぱい。:2014/03/02(日) 06:19:37.58
>>409
/dev/stdin からsedに流せるとは驚きました!
そして、これで目的の処理がsedでできました。ありがとうございます。
以下、テストスクリプト

#!/bin/sh
searchLine=$(cat << 'EOF'
hoge'"$&hoge
EOF
)
insertLines=$(cat << 'EOF'
#### insertLine ####
#### insertLine #### '"$&%=@+-*/[](){};:!
#### insertLine ####
EOF
)
cat > f1 << 'EOF'
1: fuga
2: hoge'"$&hoge
3: fuga
EOF
sed "/$searchLine/ r /dev/stdin" f1 << EOF
$(echo "$insertLines")
EOF

結局sedに戻ってしまった。。。
sedは行マッチの / / が正規表現ではなく固定文字列というのが、この場合丁度良かったということですね。
412名無しさん@お腹いっぱい。:2014/03/02(日) 06:26:32.79
>>411
一つ補足します。
sedに渡すための searchLine に / が含まれるとsedでこけてしまう。やはり万能ではないか。。。
というかこの手の処理を完璧に汎用的にするというのは、もしかして不毛な考えなのでしょうか。

さらにおまけの補足ですが、>>404さんのようにechoの標準出力を>>411のsedへ渡す場合は、
そっちも/dev/stdinだと解釈されてしまいますね。本筋の話ではないですが。
413408:2014/03/02(日) 06:47:52.02
399以降読まずに408を投稿してもうた・・・
>>410
なる。メタ文字含む複数行文字列が、挿入文字列じゃ無くて検索文字列だと勘違いしてたわ
perl -pe '$_=$_.$ENV{挿入文字列変数名} if index($_,$ENV{検索文字列変数名})>=0'
検索文字列も素の変数使うって事なら↑挟めばいいと思う
改行関連は↓にするとか「-pe」を「-lpe」にするとか挿入文字列の前後の改行で調節とか色々
perl -pe '(chomp,$_=$_.$ENV{挿入文字列変数名}) if index($_,$ENV{検索文字列変数名})>=0'

>>412
Perlなら環境変数にさえ値を入れられれば問題なく処理できるかとー
テストコード貼ろうかと思ったけどヒアドキュメント版は改行多すぎぃ!
414名無しさん@お腹いっぱい。:2014/03/02(日) 08:13:38.92
ここでは関数使ってブラックボックスにするのはアウトなんですか
415名無しさん@お腹いっぱい。:2014/03/02(日) 10:59:50.58
どうしようsedとAWKとPerl
Perl覚えたらsedとAWKでできるテキスト処理できるらしいじゃん
ワンライナーだけでも覚える価値あるかな?
416名無しさん@お腹いっぱい。:2014/03/02(日) 11:21:08.85
sedは s/hoge/fuga/ が用途の99%占めてるし
awkは {print $2} が用途の99%占めてるから憶えるまでもない
それを越える複雑な処理したい場合は素直にperlとか使うべし
417名無しさん@お腹いっぱい。:2014/03/02(日) 11:30:00.95
最近はxmlstarletも便利だけど、webだとパースできるページ少ない。
418名無しさん@お腹いっぱい。:2014/03/02(日) 14:51:52.22
>>398
特定文字列にマッチというのが正規表現なら
perl -e 'while (<STDIN>)
{
print;
if (/$ARGV[0]/)
{
print "$ARGV[1]";
}
}' "$pattern" "$insert" < file

文字列の比較なら
awk -v pattern="$pattern" -v insert="$insert" '{print} $0 == pattern {print insert}' file

て感じでどうだろう
419名無しさん@お腹いっぱい。:2014/03/02(日) 17:15:59.79
>>407
指定されてたら複製させる感じか。
明日試してみます。
420名無しさん@お腹いっぱい。:2014/03/02(日) 17:23:58.94
>>413
perl使うのなら
BEGIN{undef $/;} s/(??Q${検索文字列}?E)/$1${挿入文字列}/g
とかじゃダメなん?
421名無しさん@お腹いっぱい。:2014/03/02(日) 17:59:50.17
>>413,418,420
ありがとうございます。
perl全くの無知なんで勉強してみます。

# perlってなんか独特で敬遠してたのよね。。。sedやawkでできない場合に困るし、やっといたほうがいいな
422名無しさん@お腹いっぱい。:2014/03/02(日) 18:25:13.98
perlはもう10年書いてないけど困ったことはないな
rubyとpythonが書ければ何とかなる
423名無しさん@お腹いっぱい。:2014/03/02(日) 18:31:34.17
/usr/localのインストールは禁止されてるので、perlはあり得ない。
普通に sed awk あるいはシェルのみで書く。
424名無しさん@お腹いっぱい。:2014/03/02(日) 18:36:54.21
僕はnode.jsでいいです
425名無しさん@お腹いっぱい。:2014/03/02(日) 19:35:01.12
>>420
ダメじゃないと思うぞ、プログラム全般がそうだけど、Perlは特にTMTOWTDIとかいう標語まであるし
俺はそのやり方で\Eとか含んでても大丈夫って知らず、エスケープに悩みたくなくてああしただけ

>>423
そういう環境ならそうだけど…
そういう環境って組み込みとか起動中処理とかそういうケースだけのような気も…そうなるとsed awkも怪しい気がしなくもない
426名無しさん@お腹いっぱい。:2014/03/02(日) 23:51:00.24
最近はLinuxならperlはもちろんruby、pythonも入ってるのは当たり前なんだっけ?
427名無しさん@お腹いっぱい。:2014/03/02(日) 23:52:16.04
>>426
デフォルトでぜんぶ入ってるのは少ないんじゃないか
428名無しさん@お腹いっぱい。:2014/03/03(月) 01:14:07.15
FreeBSDで適当にPorts入れようとするとRubyやPython要求される
(つまりその時点では入ってない)ことが結構あった気が…Perlはどうだっけ
429名無しさん@お腹いっぱい。:2014/03/03(月) 01:50:22.24
m4もいれといて
430名無しさん@お腹いっぱい。:2014/03/03(月) 03:46:25.79
ruby入ってない@deb
431名無しさん@お腹いっぱい。:2014/03/03(月) 07:46:01.44
俺のイメージだと入ってる可能性が高い順に
python,perl,rubyだな
432名無しさん@お腹いっぱい。:2014/03/03(月) 10:51:17.61
>>431
perlが入っていないOSって何?
433名無しさん@お腹いっぱい。:2014/03/03(月) 10:56:01.93
python,perlは入ってるな大体
434名無しさん@お腹いっぱい。:2014/03/03(月) 11:00:43.61
>>432 FreeBSDだろ
435名無しさん@お腹いっぱい。:2014/03/03(月) 12:38:54.31
>>434
15年前には入っていたけど最近のバージョンには入っていないのか?
もしかしてperlはもう消えていきつつあるソフトウェアなのか?
436名無しさん@お腹いっぱい。:2014/03/03(月) 12:44:41.67
>>435
http://slashdot.jp/story/02/05/16/0611246/
この辺で外れたんじゃなかったっけ。
もちろん ports にはある。
437名無しさん@お腹いっぱい。:2014/03/03(月) 12:47:23.09
perlが消えていくってことは(今のところは)ないけど、
perl以外の選択肢は増えている。
438名無しさん@お腹いっぱい。:2014/03/03(月) 12:50:06.73
perlよりワンライナーが有用な言語ある?
439名無しさん@お腹いっぱい。:2014/03/03(月) 13:07:26.50
rubyやpythonかじったけど、普段のデータ処理は結局perl使ってるなあ
基本だけ知ってれば、いちいち調べなくても書けるのがいい
440名無しさん@お腹いっぱい。:2014/03/03(月) 13:35:31.63
>>434
NetBSDにもperlはない。
luaはあるが。
luaなのは、組み込み言語用途での実績かららしい。
441名無しさん@お腹いっぱい。:2014/03/03(月) 17:19:30.99
>>436
その記事だとカーネルビルドに必要なくなっただけでデフォルトインストールだと書かれてるけど…
442名無しさん@お腹いっぱい。:2014/03/03(月) 17:20:09.85
つーか、netbsdのカーネルに組み込まれたからね。
lrwx------ 1 root wheel 4 Feb 21 19:21 /dev/lua -> lua0
crw-rw-r-- 1 root wheel 209, 0 Feb 21 19:21 /dev/lua0
443名無しさん@お腹いっぱい。:2014/03/03(月) 22:49:22.36
最近猫も杓子もpythonな風潮が気に入らない
444名無しさん@お腹いっぱい。:2014/03/03(月) 22:57:48.86
>>443
シェルスクリプトと言い張る。

#!/bin/sh
python -c hogehoge...
EOF
445名無しさん@お腹いっぱい。:2014/03/04(火) 00:24:58.61
>>444
pythonなら

#!/bin/sh
python <<EOF
hogehogehoge
EOF

にしないとワンライナーで書くことになって死ぬ
446名無しさん@お腹いっぱい。:2014/03/04(火) 05:16:11.99
冷や毒は添付ファイル作るから、/tmpが書き込み不可(boot時など)の時動作しない。
豆な。
447名無しさん@お腹いっぱい。:2014/03/04(火) 08:37:46.65
当て字きもい
448名無しさん@お腹いっぱい。:2014/03/04(火) 09:10:08.09
そんなあなたに冷やすとリング
449名無しさん@お腹いっぱい。:2014/03/04(火) 11:04:27.79
2ch とはいえ技術系スレだもんな。

技術系スレとはいえ 2ch だもんな。

どっちが大勢?
450名無しさん@お腹いっぱい。:2014/03/04(火) 11:20:14.56
そういうのは別のスレで。
451名無しさん@お腹いっぱい。:2014/03/04(火) 11:39:52.72
そういう詰まらんオマエは別のスレへ。
452名無しさん@お腹いっぱい。:2014/03/05(水) 06:45:09.19
>>446,448 みたいな当て字書くプログラマーorシス管見つけたら
社史編纂室に異動させるわ
453名無しさん@お腹いっぱい。:2014/03/05(水) 06:52:27.27
当て字に塗れた社史とか読みたくないです
454名無しさん@お腹いっぱい。:2014/03/05(水) 08:13:05.63
>>448
冷やすとリングも添付ファイル作るから解決にならんよ。パイプで書き換えること。
455名無しさん@お腹いっぱい。:2014/03/06(木) 00:46:35.73
cshでは以下のようなことはできないのでしょうか。

set usage="usage : `basename $0` -hoge [A|B|C]"

[]でエラーになります。
456名無しさん@お腹いっぱい。:2014/03/06(木) 02:36:44.78
>>455
>>1
> ・csh/tcshのシェルスクリプトは推奨されません。
>  (理由は「csh-whynot」でググれ)
ログインシェルとして使うのはともかく、スクリプトにcsh系を使うべきではない
457名無しさん@お腹いっぱい。:2014/03/06(木) 06:26:36.56
社史編纂室に異動させてほしいです。

仕事なくても養ってくれるなんて、今どきあり得ない好待遇じゃないですか。
左遷される前にクビが飛ぶんですから。
458名無しさん@お腹いっぱい。:2014/03/06(木) 06:29:01.28
そのかわり人格破壊作業を施されるとか
459名無しさん@お腹いっぱい。:2014/03/06(木) 07:47:00.96
社史や社史編纂室を作る余裕があるような会社に就職したいです
460名無しさん@お腹いっぱい。:2014/03/06(木) 08:22:34.96
>>455
使ってないけど、
set usage="usage : `basename $0` -hoge "'[A|B|C]'
じゃダメなの?
461名無しさん@お腹いっぱい。:2014/03/09(日) 03:02:15.61
PS1やエイリアスを指定した状態でbashを起動し
対話操作できるようにできますか?
bashをヒアドキュメントを利用して起動してもbashが終了してしまい-cオプションでも同じことが起きます
-o ignoreeofでもダメでした
462名無しさん@お腹いっぱい。:2014/03/09(日) 09:24:16.63
>>461
環境変数だけなら env PS1="..." PS2="..." /bin/bash でいける。
別途ファイル用意していいなら bash --rcfile ファイル名 で .bashrc のかわりのファイルを指定するか。
(ファイルの先頭に . ${HOME}/.bashrc 書いておいて、追記分を2行目以降に記載)
463名無しさん@お腹いっぱい。:2014/03/09(日) 10:05:44.59
すみませんが詳しい方のみ回答をお願いします
464名無しさん@お腹いっぱい。:2014/03/09(日) 10:10:03.69
すみませんが2chに詳しい方のみ質問をお願いします
465名無しさん@お腹いっぱい。:2014/03/09(日) 23:13:53.66
こういうのってぼっとなのかな?
手でやってるのかな?
466名無しさん@お腹いっぱい。:2014/03/10(月) 06:29:01.50
超高性能ボットみのような人間がやってるんじゃね?
人工知能はいまだ自然言語の分解も怪しいってのに
質問と回答とその他が区別できる程の自然言語解釈とか無理だと思う
467名無しさん@お腹いっぱい。:2014/03/10(月) 06:48:59.22
そうだな。的を外してる回答のみを抽出する処理も要るしな。
468名無しさん@お腹いっぱい。:2014/03/10(月) 09:20:03.93
社なんとか室の仕事じゃね?w
469名無しさん@お腹いっぱい。:2014/03/10(月) 13:43:45.94
PS1はプロンプトでしょ?
PS2ってなんだっけか
470名無しさん@お腹いっぱい。:2014/03/10(月) 13:45:31.00
セカンダリプロンプト
471名無しさん@お腹いっぱい。:2014/03/10(月) 13:47:51.38
自動的にプログラム実行時の実時間を環境変数に入れるように
プロンプトを改造したいんだけど、うまくいきません。

bashで、プログラム実行直前の時刻を取得する方法ってあります?
bashで無理ならzshとかいうやつでもいいです。
472名無しさん@お腹いっぱい。:2014/03/10(月) 13:48:41.84
だからセカンダリプロンプトってなんだっけかって聞いてるんだろ。アスペかよw
473名無しさん@お腹いっぱい。:2014/03/10(月) 13:50:14.23
man読めよ。
474名無しさん@お腹いっぱい。:2014/03/10(月) 14:42:21.01
>>471
あるよ
475名無しさん@お腹いっぱい。:2014/03/10(月) 14:43:20.91
すみませんが詳しい方のみ回答をお願いします
476名無しさん@お腹いっぱい。:2014/03/10(月) 21:50:55.09
history-all | tail
あたり
477名無しさん@お腹いっぱい。:2014/03/11(火) 10:38:49.35
>>474
どうやって実現すればよいですか?
478名無しさん@お腹いっぱい。:2014/03/11(火) 10:56:29.86
ないよ
479名無しさん@お腹いっぱい。:2014/03/11(火) 13:17:02.19
historyじゃだめなの?
HISTTIMEFORMAT環境変数セットして
480名無しさん@お腹いっぱい。:2014/03/11(火) 14:36:12.29
プロンプトに時刻入らなきゃヤダ。
プロンプト表示時点の時刻じゃなくて、
コマンド実行時にそのコマンドをタイプした前の行のプロンプトに時刻を入れる
というところがポイントな。
481名無しさん@お腹いっぱい。:2014/03/11(火) 14:45:31.55
現在コマンド入力中のプロンプトは時計のように時刻を1秒毎にカウントアップしていて、
コマンドをタイプしたらその行プロンプトのの時計が止まってコマンド起動時刻を示す、
というのがいいな。
482名無しさん@お腹いっぱい。:2014/03/11(火) 15:11:12.45
historyに時刻入れた方が便利そう。
483名無しさん@お腹いっぱい。:2014/03/11(火) 15:48:25.57
>>479
HISTTIMEFORMATセットすると、
HISTCONTROL=ignoreboth が無効になる
当たり前なんだろうけどちょっとショック受けた
484名無しさん@お腹いっぱい。:2014/03/11(火) 16:31:57.44
実行直前の時刻って何なの?開始時刻とは違うの?
485名無しさん@お腹いっぱい。:2014/03/11(火) 16:54:41.94
呼ばれたコマンドが始まってしまったら
シェル側はどうこうできない。
呼ばれるコマンドが実行される直前に
シェル側で時刻を出す必要がある。
486名無しさん@お腹いっぱい。:2014/03/11(火) 18:11:36.64
>>484
違わない
実行直前の時刻とは、開始時刻のことである
必要ならば図解しようか?
487名無しさん@お腹いっぱい。:2014/03/11(火) 18:13:28.44
>>486
図解よろしく。
488名無しさん@お腹いっぱい。:2014/03/12(水) 08:46:30.76
tcshユーザやzshユーザはprecmd使えるから何も悩まずに出来そうなんだがなぁ…
bashでprecmdをググったらこんなのが引っかかった ttp://glyf.livejournal.com/63106.html
489名無しさん@お腹いっぱい。:2014/03/12(水) 23:40:38.94
パスワード認証のsshでログインを自動化したいのですが、どのようにすればよいでしょうか?
expectコマンドはインストールしない方法を考えています。

echo -e "password\n" | ssh -t -t [email protected]

上のスクリプトだとプロンプトが出てダメでした。よろしくお願いいたします。
490名無しさん@お腹いっぱい。:2014/03/13(木) 00:06:43.46
>>489
失礼な話だが、釣り/荒し臭い質問だな。
適当に回答させて、いつものお決まりの文を書き込むのかな?
491名無しさん@お腹いっぱい。:2014/03/13(木) 00:10:32.95
expectが何を出来るかしか知らないんだろうな。
expectが何をやってるか知っていればそんなマヌケな質問は出てこない。

回答:
expect入れたくなきゃexpectと同じ働きのプログラムを作る
492名無しさん@お腹いっぱい。:2014/03/13(木) 00:12:25.76
>>489
何故パスフレーズなし秘密鍵ではだめなの?
493名無しさん@お腹いっぱい。:2014/03/13(木) 00:17:52.08
>>492
Dockerのコンテナにsshでログインしようとしているのですが、秘密鍵を指定しても読み込んでくれずパスワード入力になりました。
それで秘密鍵なしで頑張ろうと試行錯誤している次第です。
494名無しさん@お腹いっぱい。:2014/03/13(木) 00:18:14.48
>>492
ぼくのかんがえたさいきょうのパスワードくらっかーで、にっくきあいつのホストにろぐいんしてやるんだー。
ってことだろ
495名無しさん@お腹いっぱい。:2014/03/13(木) 00:19:50.07
>>493
公開鍵方式で認証できるように試行錯誤しろよ。
496名無しさん@お腹いっぱい。:2014/03/13(木) 00:34:58.01
>>493
$HOME/.ssh/authorized_keysないし、その祖先ディレクトリの
どこかが、グループかotherに対して書き込みを許してるってのが
チョーありがち。
てゆーか、まずログを確認すべきだね。
CentOSなら/var/log/secureとか。
497名無しさん@お腹いっぱい。:2014/03/13(木) 00:54:40.58
>>496
$HOME/.sshフォルダがまるごと消えていたのが原因だったようです。。
きちんと確認しないといけないですね。ありがとうございました。
498名無しさん@お腹いっぱい。:2014/03/13(木) 01:43:17.07
何それww
499名無しさん@お腹いっぱい。:2014/03/13(木) 10:38:52.37
このスレには社史編纂室レベルの質問しかこないのか
500名無しさん@お腹いっぱい。:2014/03/13(木) 19:05:06.07
噴いた
501名無しさん@お腹いっぱい。:2014/03/14(金) 03:42:52.41
>>499
答えてるのも社史編纂室のおじちゃん達というオチか
502名無しさん@お腹いっぱい。:2014/03/14(金) 09:07:38.64
社史編纂室厨いい加減うざい
糞質問する奴ともども氏ねや
503名無しさん@お腹いっぱい。:2014/03/14(金) 09:43:44.60
bashで、プログラム実行後のカレントを保存する方法ってあります?
bashで無理ならzshとかいうやつでもいいです。
504名無しさん@お腹いっぱい。:2014/03/14(金) 10:14:10.84
老けたせいでギャグの質が低下してるのを気がつかないのだろう

社史編纂質
すみませんが詳しい方だけ答えてうんたら

これらギャグのつもりなんだろうが
面白くないし、寒いし、うざい
「ギャグは繰り返し」を勘違いしてる、寒くてうざいもんは寒くてうざい
505名無しさん@お腹いっぱい。:2014/03/14(金) 10:23:30.00
老化してるから
「ウざがられるためにやってるんですう」とか
小学生みたいにいってくるからヤメロ
506名無しさん@お腹いっぱい。:2014/03/14(金) 11:05:31.46
>>503
カレントってなに? 電流?
507名無しさん@お腹いっぱい。:2014/03/14(金) 11:37:04.63
カレントディレクトリか?
DIR=`pwd` とかそういう話かな。
508名無しさん@お腹いっぱい。:2014/03/14(金) 11:38:08.74
DIR=$PWD でいいか。
509名無しさん@お腹いっぱい。:2014/03/14(金) 11:48:40.69
>>504
> これらギャグのつもりなんだろうが
ギャグじゃなくて回答する人を弄ぶのが目的の荒しだと思うが。

> 社史編纂質
> すみませんが詳しい方だけ答えてうんたら

俺的には
「人を馬鹿にする事ばかりの虚栄心君」
もかな。
510名無しさん@お腹いっぱい。:2014/03/14(金) 11:56:21.66
弄ぶついでにギャグか照れ隠しではさむ言葉のセンスについてだろうが
511名無しさん@お腹いっぱい。:2014/03/14(金) 12:07:14.51
目的とか考えてもしょうがないよ。
それを理解できたら正気ではいられなくなる。
512名無しさん@お腹いっぱい。:2014/03/14(金) 12:16:23.40
小バカにしようとする態度は見て取れるが
書きかたが悪いせいで、そいつ自身バカに見える
513名無しさん@お腹いっぱい。:2014/03/14(金) 12:17:37.85
こんな感じの騒ぎを起こすのが目的だろ
この手のは完全スルーが一番
514名無しさん@お腹いっぱい。:2014/03/14(金) 15:39:00.00
>>489
sleep入れればおk
(sleep 3; echo -e "password\n") | ssh -t -t [email protected]
こんな感じな
515名無しさん@お腹いっぱい。:2014/03/14(金) 15:46:13.80
おっ、糞回答を自作自演してきたなw
516名無しさん@お腹いっぱい。:2014/03/14(金) 16:18:08.60
すみませんが詳しい方のみ回答をお願いします
517名無しさん@お腹いっぱい。:2014/03/14(金) 21:37:10.13
>>512
昔から言うよね バカのひとつ覚えってw
518名無しさん@お腹いっぱい。:2014/03/15(土) 17:14:02.96
シェル初心者です。

シェル実行ファイル内に、
TEMP=`コマンド結果`
の変数があって、外部ファイル(SQL文)内に同じ変数
${TEMP}
を記述して、外部ファイルを読み込ませてSQLを実行させたいのですが、
変数に値が入るような書き方が分かりませぬ。
519名無しさん@お腹いっぱい。:2014/03/15(土) 17:19:10.47
sed通すとか?
520名無しさん@お腹いっぱい。:2014/03/15(土) 17:20:44.24
>>503
その後どうすか。
521名無しさん@お腹いっぱい。:2014/03/15(土) 17:36:44.02
外部ファイルじゃなくてヒアドキュメントにするのがお手軽

予告しておこう
お前はSQLインジェクションを喰って死ぬほど後悔する。
522名無しさん@お腹いっぱい。:2014/03/15(土) 23:40:58.59
>>519
やはり置換が必要なんですかね。

>>521
ヒアドキュメントで動作することは確認できたのですが、
外部ファイルに持たせる処理をスマートにやってみたかっただけです。

セキュリティ的にまずいんですかね このやり方。
523名無しさん@お腹いっぱい。:2014/03/16(日) 00:57:51.00
>>522
回答でサニタイズが言及されていない時点で、(やり方もだが)
あなたの知識がセキュリティ的にまずいと思うわ。
SQLインジェクションは思いつきにくい方法でデータぶっこぬかれたり不正操作されるって
パターンなんで、どういう攻撃方法があるかを人とおり勉強することをオヌヌメする。
524名無しさん@お腹いっぱい。:2014/03/16(日) 03:25:40.44
SQLはプリペアードステートメント使用が鉄則なのでシェルスクリプトで
処理しようというのが間違い
525名無しさん@お腹いっぱい。:2014/03/16(日) 08:52:20.29
出た!サニタイズ!
526名無しさん@お腹いっぱい。:2014/03/16(日) 09:08:18.94
サニタイズ言うなキャンペーンはひろみちゅの(シロートが書いたセキュリティ
対策本への)言いがかりなので、適切な文脈で使うのは全く問題ない。
527名無しさん@お腹いっぱい。:2014/03/16(日) 15:41:16.64
適切な文章ではエスケープって単語が出てくるべきだしそれで十分だから、
サニタイズという単語が適切なケースなんてまず無いってのが根本にある。
劣化したエスケープにすぎないサニタイズで満足する考え方自体問題だし、
サニタイズなんて言葉使う考え方してるとそのうちエスケープ漏れで死ぬよ。

エスケープとサニタイズの関係はバグとセキュリティホールの関係に置き換えられる。
セキュリティホールとして悪用可能なバグじゃなくてもバグを肯定するのは駄目だろう。
528名無しさん@お腹いっぱい。:2014/03/16(日) 16:16:50.80
正当な文字だけで構成されていなかったら、そこでエラー終了するという方法
だってかまわない。
その場合もエスケープか? 確かにエスケープだが意味が全然違う。w

ところで、パブリックアクセス可能なdbを作成する際にセンシティブな情報や
個人情報を取り除く事もサニタイズと言うのだが、これも「サニタイズ言うな
キャンペーン」に引っかかるのかね? どうやってエスケープするんだろう。w
529名無しさん@お腹いっぱい。:2014/03/16(日) 16:59:02.56
話それまくってるな。
530名無しさん@お腹いっぱい。:2014/03/16(日) 17:17:31.70
>>528
「センシティブな文字列」というものをそもそも作り出さないのが
サニタイズ言うな運動の肝なんよ

まあシェルスクリプトだとなかなか難しい話なんだけど、
Cとかでたとえるなら
system使うとコマンドラインインジェクションの危険あるけど
forkしてexecなら原理的にインジェクションは無いでしょ?
そういう積み重ねのことね。
531名無しさん@お腹いっぱい。:2014/03/16(日) 17:26:45.65
セキュリティ言ってる人も
DBユーザの権限で制限するのあんまやんないよなぁ。
行ごとの権限ができないのはともかく。
532名無しさん@お腹いっぱい。:2014/03/16(日) 18:01:23.02
>>528
エラー終了はサニタイズしてないし、後者は単なるNGワードだろが…
システム的な意味でなら>>530だから論外だし

>>530
シェルスクリプトでエスケープとか考えたくねーわな…

>>531
たまには聞くけど ttp://blog.kazuhooku.com/2013/11/blog-post.html
よく聞く方法ではないね。レンタルサーバで1アカウントしか使えない場合を想定してるとか?
533名無しさん@お腹いっぱい。:2014/03/16(日) 18:59:34.85
>>530
>>528の後半部分の「センシティブな文字列」とはクレジット番号だったり
するわけだが

> 「センシティブな文字列」というものをそもそも作り出さないのが
> サニタイズ言うな運動の肝なんよ
クレジット番号を作り出さないとか、全く意味不明

>>532
入力された文字をサニタイズしてのではなく、入力されたデータ全部を
サニタイズしたと言っていい
534名無しさん@お腹いっぱい。:2014/03/16(日) 19:06:36.89
自分の人生をサニタイズしてみたらどうだ?
535名無しさん@お腹いっぱい。:2014/03/16(日) 19:10:20.60
自分じゃできないから誰か俺の人生をサニタイズしてくれ
536名無しさん@お腹いっぱい。:2014/03/16(日) 20:38:59.46
>>533
入力されたクレジット番号を文字列に埋め込むときに
無検査で埋め込むなってことでしょ
そのつっこみの方が意味不明
537名無しさん@お腹いっぱい。:2014/03/16(日) 20:54:14.25
>>536
>>528の後半部分は、

>>527
> 適切な文章ではエスケープって単語が出てくるべきだしそれで十分だから、
への反例として、
公開サーバに置くデータベースを作るときにセンシティブな情報や個人情報を
取り除く作業を行う。この作業の事をサニタイズという。
を例示した。この作業をエスケープとは言わない。

サニタイズはサニタイズ。エスケープでは置き換え不可能。
538名無しさん@お腹いっぱい。:2014/03/17(月) 02:01:31.22
サニタイズ(Sanitize):消毒、除菌、無害化
個人情報って毒だったのかぁ〜・・・
そういえば2chでも住所書くとドメイン焼かれてたからねぇ〜・・・

「単なるNGワードだろ」って指摘も聞かなかったことにしてるようだし、
そもそも>>518>>521>>523の文脈では個人情報の除去は関係ない
エスケープ言うべき所でサニタイズ言っちゃった典型的なサニタイズ脳

必死にサニタイズを擁護してるとこ悪いが、見てて哀れだからいい加減黙ろうか
539名無しさん@お腹いっぱい。:2014/03/17(月) 03:05:23.11
>>538
>サニタイズ(Sanitize):消毒、除菌、無害化
>個人情報って毒だったのかぁ〜・・・
知らないで使ってたのかよ

>「単なるNGワードだろ」って指摘も聞かなかったことにしてるようだし、
2ch用語じゃ無くて正式な名称で言えば相手してあげるよ

>そもそも>>518>>521>>523の文脈では個人情報の除去は関係ない
だから、「ところで」と話題変えてるだろ。
>>527は発言の有効範囲を限定してないからな。

あと、>>518質問者 >>521オレ >>523何処かの誰か
>>525キャンペーンをうのみにしてるアホ
>>526オレ
だからな、勘違いするなよ

>エスケープ言うべき所でサニタイズ言っちゃった典型的なサニタイズ脳
>必死にサニタイズを擁護してるとこ悪いが、見てて哀れだからいい加減黙ろうか
お前、やっぱりひろみちゅのキャンペーンの意図理解してないだろ。w
バカには覚えやすい標語与えといて、簡単かつ確実な方法を選択させるのが目的
エスケープする方法が与えられているバカ向けの環境でのみ成立する
540名無しさん@お腹いっぱい。:2014/03/17(月) 04:00:50.56
コイツにとってほぼ全ての実用なプログラミング言語はバカ向けの環境なのか・・・・・・
皮肉すら分らんようだし突き抜けすぎててもう感動〜!
541名無しさん@お腹いっぱい。:2014/03/17(月) 04:13:20.39
こいつパー速にいる気がする
542名無しさん@お腹いっぱい。:2014/03/17(月) 07:51:52.87
http://takagi-hiromitsu.jp/diary/20060115.html
> つまり、「サニタイズ」という用語が、各人の都合でどんな意味にも解釈され
> るという、「汚れた言葉」になっており、専門用語として使い物にならなくなっ
> ているのだ。もはや、「サニタイズする」は「セキュリティ対策する」と同義
> でしかない。そういう言葉には存在価値がない。加えて、特定の意味を指して
> 使っても別の意味で解釈されてしまうのだから、有害である。
ひろみちゅの思い込みと、思考能力がなくうのみにするバカの間でだけ通用する
言葉狩りキャンペーンって事だ

教祖様はNGワード(笑)にも言及してるな ブラックリストの事を言いたかったんだろ
> ブラックリスト方式ではなくホワイトリスト方式にせよという話だと誤読した事例
> 「/^[a-z]+$/のような正規表現」を使う手法はサニタイズ処理そのものであって、まさにセキュリティ対策のための処理である
543名無しさん@お腹いっぱい。:2014/03/17(月) 08:17:49.41
続きは社史編纂室スレでやれよw
544名無しさん@お腹いっぱい。:2014/03/17(月) 08:41:08.81
過去にひろみちゅに実名でコテンパンにやられた奴が、
逆恨みして暴れてるスレがあると聞いて飛んできますた!
545名無しさん@お腹いっぱい。:2014/03/17(月) 09:14:57.77
何も考えずにひろみちゅの尻馬に乗ちゃったバカが憐れすぎる
546名無しさん@お腹いっぱい。:2014/03/17(月) 10:50:51.11
>>533
サニタイズって言葉を再定義して使ってるのね。なるほど。
547名無しさん@お腹いっぱい。:2014/03/17(月) 11:38:32.28 BE:1866222454-2BP(1000)
>>546
教祖様にいってやれよ。
つーか、お前のようなバカをサニタイズするために始まったキャンペーンだろw

http://takagi-hiromitsu.jp/diary/20060115.html
>> たとえば、データファイルのファイル名の一部をCGIのパラメータと して受け取るようになっているPerlスクリプトなら/^[a-z]+$/のような正規表
>> 現(Rubyなら\A[a-z]+\z/)で期待している文字しか入っていないこと を確認して(Perlの場合はuntaintもこれで出来る)、違っていたらエラーにする
>> というのが「 セキュリティ対策以前に元来本質的に必要な処理」だと思います。
> ブラックリスト方式ではなくホワイトリスト方式にせよという話だと誤読した事例
> 「/^[a-z]+$/のような正規表現」を使う手法はサニタイズ処理そのものであって、まさにセキュリティ対策のための処理である
548名無しさん@お腹いっぱい。:2014/03/17(月) 14:52:10.17
>>547
あなたが教祖様?
549名無しさん@お腹いっぱい。:2014/03/17(月) 15:18:06.42
いえ、社史編纂室長です
550名無しさん@お腹いっぱい。:2014/03/17(月) 20:24:54.09
社史編纂代行株式会社でも作るか
551名無しさん@お腹いっぱい。:2014/03/17(月) 23:11:30.64
なんかサニタイズとエスケープの理解度があやしくないか?

大ざっぱにいえば、
サニタイズは、不要な文字を削ること。
エスケープは、特殊な意味を打ち消すことだよ。

用途、目的がぜんぜんちがうべ。
サニタイズされた文字列に特殊な文字が含まれる事はないし、逆にエスケープされた文字列から特殊文字が消えることもない。
552名無しさん@お腹いっぱい。:2014/03/18(火) 03:27:47.75
エスケープの事をサニタイズと呼んだり
エスケープすべきところでサニタイズしたりする
>>523みたいなサニタイズ脳がわらわら居るからな

SQLインジェクションなんてエスケープ漏れの代表例出して
サニタイズすべきとか言う馬鹿を勘違いさせないためにも
サニタイズなんて単語は捨てた方が良い
553名無しさん@お腹いっぱい。:2014/03/18(火) 05:24:22.39 BE:2519400839-2BP(1000)
シェルスクリプトでSQLをエスケープしてからほざけ
554名無しさん@お腹いっぱい。:2014/03/18(火) 05:31:33.51
有害なものを無害化するエスケープがサニタイジングでしょ
エスケープの一種ってことで
555名無しさん@お腹いっぱい。:2014/03/18(火) 05:40:22.48
まだやってる…
556名無しさん@お腹いっぱい。:2014/03/18(火) 06:16:47.81
バリデーション「ぼくも入れて〜」
557名無しさん@お腹いっぱい。:2014/03/18(火) 08:41:56.99
> 有害なものを無害化するエスケープがサニタイジングでしょ
> エスケープの一種ってことで
そういう定義にするのか? キャンペーンの信者 www
「エスケープ言うなキャンペーン」始めるべきですよ。ひろみちゅ先生

戻せないものはエスケープとは言わない。
558名無しさん@お腹いっぱい。:2014/03/18(火) 08:59:59.97
ん?戻せないってなんのこと?
559名無しさん@お腹いっぱい。:2014/03/18(火) 09:02:46.08
戻せなきゃSQLを実行できないだろ キャンペーン信者頭悪っ www
とっとと、SQLをシェルスクリプトでエスケープしろよ。
560名無しさん@お腹いっぱい。:2014/03/18(火) 09:12:57.21
>>557
誰と戦ってんだ?
561名無しさん@お腹いっぱい。:2014/03/18(火) 09:18:44.31
>>525とか>>527 頭の悪いキャンペーンの盲信者達
562名無しさん@お腹いっぱい。:2014/03/18(火) 10:35:22.70
浸透「遊びに来たよ!」
563名無しさん@お腹いっぱい。:2014/03/18(火) 14:42:42.83
>>558
サニタイズの用例には3つある
1、エスケープをサニタイズと呼ぶ
2、エスケープするべき文字(列)を単純に除去することをサニタイズと呼ぶ
3、NGワード同様、通過させては駄目なデータを除去・置換することをサニタイズと呼ぶ
複数の用例を区別せず「サニタイズは正しい」などと言ってると、
1の人はエスケープという概念を知りそこねて間違ったエスケープを行いエスケープ漏れを起こしやすくなるし
2の人は無意味にシステムへの入力制限やデータの損傷を起こした挙句エスケープ漏れを起こしやすくなる
そもそもエスケープをサニタイズなどと呼ぶべきではないし、3の用例もNGワードやフィルタリングと呼べばいい

この半ばスレチな話の発端である>>523はSQLインジェクションを例に出してる事から3の用例では無いんだが、
サニタイズを擁護してる人は何故かその事実やサニタイズに複数の(誤)用例があるって事実を無視したり、
あるいは複数の用例を都合よく入れ替えて話を捻じ曲げて理論展開してたりと、無茶苦茶やってんだよね
誤用した自分の擁護で捻じ曲げてんのか、高木への恨みで捻じ曲げてんのか、自覚なく捻じ曲げてるのか…
564名無しさん@お腹いっぱい。:2014/03/18(火) 14:56:36.97
>>523を擁護してるのではなくて、それに釣られて現れた盲信者をバカにしているわけだが。
565名無しさん@お腹いっぱい。:2014/03/18(火) 23:37:24.97
>>563
とりま、釣られてみる。
何度も指摘されているけれど、エスケープをサニタイズとは言わない。

全く別のものなのに同じものと理解してるのがまずい。

正規化の一種として同じとかならまだわかるけど。。。
566名無しさん@お腹いっぱい。:2014/03/19(水) 00:42:35.04
>>564
盲信云々以前に523が明らかにキャンペーン対象の典型例なんだが

>>565
563はエスケープをサニタイズと言う奴が居るとは書いているけれど
エスケープをサニタイズと言わない奴が居ることを否定はしてないぞ?
567名無しさん@お腹いっぱい。:2014/03/19(水) 03:05:59.49
だからもうFランPG・文系SEがドヤ顔でカタカナ言葉使ってたら
まず間違いなく意味わかってないってことでいいだろ
568名無しさん@お腹いっぱい。:2014/03/19(水) 08:31:58.99
正直スレチ
569名無しさん@お腹いっぱい。:2014/03/19(水) 09:27:38.19
エスケープが正しいと言ってた人
シェルスクリプトでSQLをエスケープする実例見せてよ
570名無しさん@お腹いっぱい。:2014/03/19(水) 09:28:38.92
あっと、pgbashとか飛び道具なしね
571名無しさん@お腹いっぱい。:2014/03/19(水) 09:44:45.75
悪意あるデータが混入するリスクのある状況で、
プリペアードステートメントのない言語選択するのって、
シェルスクリプトしか使えない老害ぐらいじゃねえ?

悪意あるデータは数字しか来ないと分かってる
例外的状況ぐらいしか、使う言い訳できるケースを思いつかん。
572名無しさん@お腹いっぱい。:2014/03/19(水) 10:02:06.63
結局ひろみちゅのキャンペーンはサニタイズ脳を撲滅しようとして
エスケープ脳を量産する結果に終わってしまいましたとさ。

エスケープ脳の見分け方
「サニタイズ」と唱えると楽勝で判定できる

プリペアードステートメント万能かというとそうでもない
ひろみちゅも当初は誤解してたふしもあったけど
実装によっては(例: 古めのpostgreSQL)SQLへの展開をクライアント側でやっ
てて、結局phpとかに標準で入ってるエスケープ関数と同等ってのもある
573名無しさん@お腹いっぱい。:2014/03/19(水) 10:07:34.99
おまえさんこそ、反省した方がいいよ。
それは、「プリペアードステートメントではないものを、プリペアード
ステートメントだと誤解していた」っていう例だぜ。

そいつを「プリペアードステートメント万能かというとそうでもない」と
表現しちゃうってことは、おまえさんが、プリペアードステートメントを
理解してないか、致命的に日本語が不自由か、どちらかだっていうことだ。
574名無しさん@お腹いっぱい。:2014/03/19(水) 10:25:59.42
社史編纂室は社史編纂してたらそんでええの
575名無しさん@お腹いっぱい。:2014/03/19(水) 10:57:33.54
お前の論理で言うとlibpqが
> PQprepare
> Submits a request to create a prepared statement with the given parameters,
> and waits for completion.
と「プリペアードステートメントではないものを、プリペアードステートメント
だと詐称していた」わけだが。
何かほかに質問はあるか? 無職
576名無しさん@お腹いっぱい。:2014/03/19(水) 11:13:05.60
2chスレ全体でやってる対立煽り工作がシェルスクリプトスレまでやってきた

て、ことだろう
このスレに対立楽しみたいという血気盛んな若者が居るとも思えんのだが
そうなんだろう
577名無しさん@お腹いっぱい。:2014/03/19(水) 11:15:32.60
>>575
さすが老害は時代感覚が狂ってるな。
PostgreSQL にホンモノのプリペアードステートメントがなかったのって、
PostgreSQL 7 の時代だぜ。
10年くらい前にはもうホンモノのプリペアードステートメントが入ってる。

Wikipedia ttp://en.wikipedia.org/wiki/Prepared_statement で確認しても、
ホンモノのプリペアードステートメントは server side で動くものって
書き方になってて、client side でやってる奴は emulation 扱いになってるぜ。
つまりホンモノのプリペアードステートメントじゃないってことだよ。

10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。
578名無しさん@お腹いっぱい。:2014/03/19(水) 11:23:10.35
クライアントサイドでの実装がありうるという実例だよ。
お前、全部の実装が「ホンモノのプリペアードステートメント」であることを
確認してるのか? 大変だな。 w
579名無しさん@お腹いっぱい。:2014/03/19(水) 11:29:42.17
セキュリティ気にしてる人間なら、当然チェックするだろう。
実際、クライアント側でエミュレートしているおかげで、
セキュリティホールがあったって事例はいくつもあるわけで。

そういう当たり前の作業もやらずに、セキュリティを語ってるわけ?
呆れた。

そりゃシェルスクリプトでサニタイズに問題感じないわけだ。
580名無しさん@お腹いっぱい。:2014/03/19(水) 11:36:20.42
ぷぷぷっ 矛盾してるぜ。「10年前ならともかく」な事を「当然チェック」するのか? ww

>>577
> 10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。

>>579
> セキュリティ気にしてる人間なら、当然チェックするだろう。
581名無しさん@お腹いっぱい。:2014/03/19(水) 11:48:14.19
いまでも、DB実装とライブラリの組合せによっては、
クライアント側でエミュレートするケースってのがありうるんだよ。

PHPのPDOとか、DB側でプリペアードステートメント用意してる場合には
当然使うが、用意してない場合には、クライアント側でエミュレーション
する機能がある。当然、こういうライブラリ使う場合には、そのDBで、
ちゃんとプリペアードステートメントになるか確認する必要がある。

こんなことも知らずに矛盾だと思っちゃうとか、よくセキュリティを
語る気になれるなあ。こういう奴の言ってることを間違って信じちゃう
奴がいると危険だから、ホント黙って欲しい。
582名無しさん@お腹いっぱい。:2014/03/19(水) 11:52:16.22
どっちも荒らしだから黙れ
いや独演でひとりか?
583名無しさん@お腹いっぱい。:2014/03/19(水) 11:53:30.89
こっちはどう言い訳するんだ?

>>577
> 10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。
584名無しさん@お腹いっぱい。:2014/03/19(水) 11:56:26.77
どこに説明の必要があるの?

・10年くらい前の PostgreSQL は誤用していた。
・今でもプリペアードステートメントを、「エミュレート」するケースは存在する。
 (エミュレートなので、実際にはプリペアードステートメントにはなってない)

ってだけでしょ。
585名無しさん@お腹いっぱい。:2014/03/19(水) 12:05:07.42
>>584
プリペアードステートメントではないものを、プリペアードステートメントだと詐称している実装が存在する事を知っているなら
>>573のような間抜けな発言はしない。

>>573
> おまえさんこそ、反省した方がいいよ。
> それは、「プリペアードステートメントではないものを、プリペアード
> ステートメントだと誤解していた」っていう例だぜ。
586名無しさん@お腹いっぱい。:2014/03/19(水) 12:08:06.83
誤解していたのは、当時のひろみちゅだろ。
何が言いたいのかさっぱり分からんわ。
587名無しさん@お腹いっぱい。:2014/03/19(水) 12:23:30.19
それはお前の日本語能力が決定的にダメなのだろう。

> ひろみちゅも当初は誤解してたふしもあったけど
最初から言ってるが。
588名無しさん@お腹いっぱい。:2014/03/19(水) 12:29:33.11
むしろ、あんたの現実認識能力に問題がある気がするが。
当時ひろみちゅが誤解してたって話と、>>584 にどういう矛盾があるんだ?
589名無しさん@お腹いっぱい。:2014/03/19(水) 12:44:25.52
最初から当時ひろみちゅが誤解してたっていってるのに
>>573と言いがかりをつけるのは、お前の日本語能力が欠如しているせいだろう。
590名無しさん@お腹いっぱい。:2014/03/19(水) 13:01:07.96
これひとりで延々書き込んでるの?
591名無しさん@お腹いっぱい。:2014/03/19(水) 13:03:33.86
何言ってるの。>>575 で、「PostgerSQLがプリペアードステートメントだと
主張してるから、client side でやっててもプリペアードステートメントだ」
って意味の主張してるじゃん。
自分の主張ももう忘れたの?

当時のPostgerSQLは間違えてんだよ。
そのことを分かってないのは、>>575 を書いた奴だ。
592名無しさん@お腹いっぱい。:2014/03/19(水) 13:04:37.87
>>590
スレ違いすまん。少なくとも2人はいるんだ。
593名無しさん@お腹いっぱい。:2014/03/19(水) 13:24:03.80
設定が2人以上とな
594名無しさん@お腹いっぱい。:2014/03/19(水) 13:45:09.84
コマンドインジェクションをおこさないようにeval使いたいんだけど
どうしたらいいかな
595名無しさん@お腹いっぱい。:2014/03/19(水) 13:48:30.69
evalをサ二タイズ
596名無しさん@お腹いっぱい。:2014/03/19(水) 15:41:59.44
>>569
シェルスクリプトでエスケープできると言ってる奴は居ない
むしろサニタイズすべきといった奴がサニタイズ例出すべきだな
597名無しさん@お腹いっぱい。:2014/03/19(水) 15:55:44.46
>>591
徹底的に日本語能力が欠如しているな。
「お前の論理で言うと」と前置きしてるだろ。
598名無しさん@お腹いっぱい。:2014/03/19(水) 16:40:24.56
エバラ
599名無しさん@お腹いっぱい。:2014/03/19(水) 16:41:54.41
焼肉の
600名無しさん@お腹いっぱい。:2014/03/19(水) 16:54:31.41
ここで議論することじゃないだろ、お互いメルアドでも交換して続きはそっちでやってくれ
601名無しさん@お腹いっぱい。:2014/03/19(水) 17:20:09.44
俺は目玉焼きはサニタイズよりターンオーバー派
602名無しさん@お腹いっぱい。:2014/03/19(水) 17:43:11.93
議論の経過を第三者に見てもらいたいからメールじゃ駄目なんだよ
603名無しさん@お腹いっぱい。:2014/03/19(水) 17:55:03.76
>>602
じゃあ、IDの出る板で、ここじゃないどこかで、
納得のいくまで議論をしてきてください。
604名無しさん@お腹いっぱい。:2014/03/19(水) 18:10:16.37
議論の経過をシェルスクリプトスレの住人に見てもらいたいんだよ
605名無しさん@お腹いっぱい。:2014/03/19(水) 18:11:04.90
>>602
誰も見てないよw
606名無しさん@お腹いっぱい。:2014/03/19(水) 20:29:36.39
議論の経過をサ二夕イズ
607名無しさん@お腹いっぱい。:2014/03/19(水) 21:42:48.00
>>604
あ、飛ばしてた
608名無しさん@お腹いっぱい。:2014/03/19(水) 22:05:25.51
何この社史捏造室
609名無しさん@お腹いっぱい。:2014/03/19(水) 22:52:46.86
編纂作業の傍らサニタイズについてブツブツと一人議論する元シス管か
610名無しさん@お腹いっぱい。:2014/03/23(日) 15:02:29.91
$ mgrep [<options>] -e <pattern> <file>
でmigemoしたpatternで検索できる以下のようなmgrep関数を作った。
しかしこのままだと、patternの前に必ず -e オプションを付けんにゃならん。

$ mgrep [<options>] <pattern> <file>
でも同じようにmigemoしたpatternで検索したいんだけどどうしたら良い?
パイプした時も使いたいから <file> は存在しない可能性もある。

function mgrep() {
local -a args
local prev
for arg in "$@"; do
if [ "$prev" = '-e' ]; then
args+=$(cmigemo -d /usr/local/share/migemo/utf-8/migemo-dict -w "$arg")
else
args+="$arg"
fi
prev="$arg"
done
grep -E "${args[@]}"
}
611名無しさん@お腹いっぱい。:2014/03/23(日) 21:06:15.72
パターンはスラッシュでくくる、とかの仕様にすればいいんじゃ

expr match "$arg" '/\(.*\)/'
にマッチすればパターンとみなすとか
612名無しさん@お腹いっぱい。:2014/03/28(金) 01:59:44.83
if [ -n "${file:-}" ]; then
↑こういう書き方をしてるスクリプトがあるんですが、これって

if [ -n "${file}" ]; then

と単に書くのと何が違うんでしょうか?
613名無しさん@お腹いっぱい。:2014/03/28(金) 04:43:52.29
おしゃれ
614名無しさん@お腹いっぱい。:2014/03/28(金) 04:51:02.05
>>612
set -u してる場合にエラーを回避することができる

>>613
すみませんが詳しい方のみ回答をお願いします
615名無しさん@お腹いっぱい。:2014/03/28(金) 06:17:11.97
616名無しさん@お腹いっぱい。:2014/03/28(金) 06:51:18.06
>>615
${parameter:-word} 自体の意味を質問してるんじゃないよw
だから >>614 の回答が適切。
617名無しさん@お腹いっぱい。:2014/03/28(金) 06:55:53.38
>>612
$ set -u
$ unset file
$ echo "${file}"
file: unbound variable
$ echo "${file:-}"
(エラーなし)

set -u してなければ "${file:-}" も "$file" も同じ。

>>615 は問題ちゃんと読まずに解答するタイプw
618名無しさん@お腹いっぱい。:2014/03/28(金) 07:00:40.67
>>616
${parameter:-word} 自体の意味がわかってたら
なぜそう書くのかもわかるんじゃね?
619名無しさん@お腹いっぱい。:2014/03/28(金) 07:09:57.05
>>618
${parameter:-word} 自体の意味はわかってても、
その word の部分を空文字列にする場合の意味がわからないってことだろ

wordが空文字列なら ${parameter} と同じでは? という質問だろ
620名無しさん@お腹いっぱい。:2014/03/28(金) 07:24:33.13
>>619
> wordが空文字列なら ${parameter} と同じでは? という質問だろ
そういう疑問が出るってことは
${parameter:-word} 自体の意味をわかってないでしょ。
621名無しさん@お腹いっぱい。:2014/03/28(金) 07:30:23.60
>>620
${parameter:-word} 自体の意味をわかってるからこその疑問だろ。

man見ても set -u のことはそこには書いてないからますます疑問になるはず。
622名無しさん@お腹いっぱい。:2014/03/28(金) 07:32:40.06
>>614
ありがとうございました。変数未設定の場合の /bin/sh -u の対応ですね。

>>615 さん、それは知ってますよ。
623名無しさん@お腹いっぱい。:2014/03/28(金) 13:44:52.41
-uの方の説明も、${parameter:-}の方までエラーになっても不思議ではない記述のような・・・
624名無しさん@お腹いっぱい。:2014/03/28(金) 14:15:56.73
つまりシェル変数をサニタイズするわけですね!
625名無しさん@お腹いっぱい。:2014/03/28(金) 17:27:58.23
>>set -u してる場合にエラーを回避することができる

だけど、set -u してる場合はエラーを回避しちゃ
駄目なんじゃないだろうか
626名無しさん@お腹いっぱい。:2014/03/28(金) 17:58:13.66
>>625
おまえ、ホントに理解してない奴だな。

set -u はプログラムミスで変数名が違ってたりするのを防ぐのが狙い。
if [ -n "${file:-}" ]; then
なんかの場合は $file がセットされてないかどうか自体を条件判断してるんだから、
if文を実行して file: unbound variable なんてエラーメッセージ出されたら困るだろ。
627名無しさん@お腹いっぱい。:2014/03/28(金) 18:22:18.06
ん? set -u って防ぐのが目的ではなくて検出する(そして人間が修正する)
のが目的なんじゃないの?
628名無しさん@お腹いっぱい。:2014/03/28(金) 19:00:02.16
>>627
「検出する(そして人間が修正する)」のことを簡潔に「防ぐ」って言ってるんだろw アスぺかよw
629名無しさん@お腹いっぱい。:2014/03/28(金) 19:11:45.22
>>626
お前ホントに何もわかってないのな
プログラムミスを検知するために-uしてるのに
プログラムミスを検知しないようにしてどうする
ってことだ
630名無しさん@お腹いっぱい。:2014/03/28(金) 19:37:00.09
>>629
if [ -n "${file:-}" ]; then
の場合はそもそも set -u ではミス検出できない。
$file の状態がどちらであっても正常だから。

お前ホントに何もわかってないのな
631名無しさん@お腹いっぱい。:2014/03/28(金) 20:14:13.71
>>628
それ、全然意味が違う
632名無しさん@お腹いっぱい。:2014/03/28(金) 20:16:29.56
>>630
「set -u を使う事を前提とするなら」、 if [ -n "${file}" ]; then と書くべきなんじゃないか?って話
633名無しさん@お腹いっぱい。:2014/03/28(金) 20:54:49.04
>>632
正反対。

「set -u を使う事を前提とするなら」、 if [ -n "${file:-}" ]; then と書くべき

set -u には、${file} 以外の箇所を検出させる。 $hoge とかが他の場所にある。
634名無しさん@お腹いっぱい。:2014/03/28(金) 20:56:38.96
>>631
言葉の表面上の意味でしか捉えられないアスペ乙
635名無しさん@お腹いっぱい。:2014/03/28(金) 21:01:24.80
>>632
Makefileで、 (コマンド || true) とかやってエラーにならないようにするのと同じようなもの。
この行だけ set -u に検出されないように "${file:-}" って書くわけ。

C言語でwarning消すためにキャストするのとも似てる。
warning消しておかないと本当のwarningが出る他の行と紛らわしいから。
636名無しさん@お腹いっぱい。:2014/03/28(金) 21:05:43.98
>>634
「アスペ」の使い方間違ってるぞ
637名無しさん@お腹いっぱい。:2014/03/28(金) 21:08:00.67
>>633
う〜ん、間違えて if [ -n "${flie:-}" ]; then って書いちゃったらどうするの?
638名無しさん@お腹いっぱい。:2014/03/28(金) 21:10:16.75
>>637
そこは検出できないから仕方ない
639名無しさん@お腹いっぱい。:2014/03/28(金) 21:11:38.06
>>635
それもよく判らないなぁ。$file が未定義なのかNULLなのか判別しないまま
スクリプトの実行を続けても構わない、ってこと?
640名無しさん@お腹いっぱい。:2014/03/28(金) 21:13:02.51
>>638
        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄
641名無しさん@お腹いっぱい。:2014/03/28(金) 21:45:19.90
その例だと分かりづらいのかも

他の例を挙げると、引数を確認する目的で

echo "arg1=${1} arg2=${2}"

と書くのを、

set -u
echo "arg1=${1:-} arg2=${2:-}"

としないといけない、とか
642名無しさん@お腹いっぱい。:2014/03/28(金) 22:01:46.73
>>630,633,635

それだったら

file=""
:
:
if [ -n "${file}" ]; then

って書いたほうがいいんじゃない? 変数名の書き間違ちがいもチェックできるし
643名無しさん@お腹いっぱい。:2014/03/28(金) 23:00:21.83
${xxxx:?msg}の事も思い出してあげてください。
644名無しさん@お腹いっぱい。:2014/03/29(土) 01:03:16.20
こんな機能があるのな
いままでif連打して引数判定してたのが馬鹿馬鹿しくなってきた
三項演算子とかでググってたのがいけなかったのか
645名無しさん@お腹いっぱい。:2014/03/29(土) 01:15:17.92
>>632>>633
どっちも正解
「set -u を使う事を前提とするなら」「空文字列判定を意図する部分では」「if [ -n "${file}" ]; then と書くべき」
「set -u を使う事を前提とするなら」「未設定の判定も意図する部分では」「if [ -n "${file:-}" ]; then と書くべき」
>>636
アスペ(もとい自閉症スペクトラム)の症状は色々な方向性がありうるから一概に間違ってるとも言えない
646名無しさん@お腹いっぱい。:2014/03/29(土) 02:09:20.43
>>645
とはいえ、>>634 は単に「アスペ」って言いたいだけなんじゃないかと
色々な方向性がありうるとなると >>634 がアスペなのかもしれないが…
647名無しさん@お腹いっぱい。:2014/03/29(土) 06:59:56.80
なんだよ、もっとサニタイズしろよw
648名無しさん@お腹いっぱい。:2014/03/29(土) 08:35:58.71
そんなに悔しかったのか? エスケープ脳 w
シェルスクリプトでSQLをエスケープして見せてくれよ。
649名無しさん@お腹いっぱい。:2014/03/29(土) 08:44:55.13
へんぴなスレで無理やり対立煽られてもなあ
困っちゃう(社交辞令
650名無しさん@お腹いっぱい。:2014/03/29(土) 09:02:19.23
>>645
それを踏まえて >>625 を言っている。
どうも根本的にわかって奴が一人いるようだけど・・。

set -u は未設定(というミス)を検出するためにやっている。
その状況で、「この変数は未設定かもしれないけどエラーにならないようにしよう」とするぐらいなら
空文字列でも設定しておけ、ってこと。
651名無しさん@お腹いっぱい。:2014/03/29(土) 09:10:53.25
>>650
空文字列設定するのにもう1行要る。ダサイ書き方になる。
空文字列設定すること自体が副作用になるから、それがNGの場合がある。
未設定変数は未設定のまま(空文字列も設定せずに)放置して、ifで条件判断だけしたい場合とか。
652名無しさん@お腹いっぱい。:2014/03/29(土) 09:13:54.84
>>642
fileにすでに何か設定されてるかも知れない状態で呼び出されるスクリプトまたは関数だったら、
file='' とかやったら駄目じゃんw (ちなみに、file= だけでもOK クォート不要)
653名無しさん@お腹いっぱい。:2014/03/29(土) 12:53:55.37
>>650
一行増えるのがダサイねぇ… 副作用が NG とか if で条件判断だけしたい
場合って具体的にはどんな場合なの?
654名無しさん@お腹いっぱい。:2014/03/29(土) 12:56:00.32
655名無しさん@お腹いっぱい。:2014/03/29(土) 13:01:32.12
>>652
その前提だったら未定義かどうか調べないでいきなり if [ -n "${file:-}" ];then って
しちゃったらまずいだろって話。ああ、 >>639 に戻ったw
656名無しさん@お腹いっぱい。:2014/03/29(土) 13:06:40.79
>>655
その前提だからこそ未定義(空文字列含む)かどうか調べるために if [ -n "${file:-}" ];then って
してるんだろ。お前理解遅いなw
657名無しさん@お腹いっぱい。:2014/03/29(土) 13:09:21.66
前提:未定義と空文字列は同じとみなす
(未定義or空文字列)なのか、文字列がセットされてるのか調べたい
変数に勝手に空文字列を代入してはいけない
調べる際に、set -u された環境でもエラーにされないようにしたい

それだけのこと。簡単だねw
658名無しさん@お腹いっぱい。:2014/03/29(土) 13:10:26.59
>>656
ん?調べてないよ。未定義でも空文字でも false になる
659名無しさん@お腹いっぱい。:2014/03/29(土) 13:11:38.13
>>658
それでいいんだけど、、何勘違いしてるの、君一人?
660名無しさん@お腹いっぱい。:2014/03/29(土) 13:13:22.49
>>658>>657 読め。

未定義でも空文字でも false にしたい。
文字列が長さ1以上あれば true にしたい。

未定義のとき、set -u を回避したい。
661名無しさん@お腹いっぱい。:2014/03/29(土) 13:13:44.48
662名無しさん@お腹いっぱい。:2014/03/29(土) 13:14:52.57
663名無しさん@お腹いっぱい。:2014/03/29(土) 13:15:54.57
>>662
それじゃ set -u 使う意味ないんじゃない?
664名無しさん@お腹いっぱい。:2014/03/29(土) 13:16:55.00
>>661
C言語でwarning回避するためにキャストしたとき、キャスト元の方が本当に間違っていても検出できないのと同じ。そこは問題にしない。
665名無しさん@お腹いっぱい。:2014/03/29(土) 13:17:47.16
666名無しさん@お腹いっぱい。:2014/03/29(土) 13:18:57.95
>>664
いや、C言語のワーニング回避とは関係ない
667名無しさん@お腹いっぱい。:2014/03/29(土) 13:20:06.55
>>665
結局、放置しておいて問題ない、と
668名無しさん@お腹いっぱい。:2014/03/29(土) 13:21:52.32
これ、誰が暴れてるの?
外した回答叩かれた >>615 が一人で暴れてるのかな?
669名無しさん@お腹いっぱい。:2014/03/29(土) 13:22:49.28
そろそろ、一種の集団ヒステリーを述べる言葉、
あるいはひとつの格言を挙げておきたい

「バカは感染する」
670名無しさん@お腹いっぱい。:2014/03/29(土) 13:22:58.30
>>668
スマン、実は >>620-668 は全部俺の自作自演なんだ
671名無しさん@お腹いっぱい。:2014/03/29(土) 13:23:52.27
>>669
ああ、キミも感染したんだね
672名無しさん@お腹いっぱい。:2014/03/29(土) 13:31:36.21
大元の >>612 で言ってる「こういう書き方をしてるスクリプト」
の全体を見てみたいものだ
673名無しさん@お腹いっぱい。:2014/03/29(土) 14:18:33.42
話は変わるけど、set -u を使わないで変数が未定義なのかどうかを
調べるってお題があって、

undef="false"
if [ "${var-UNDEF}" = "UNDEF" ];then
 if [ "$var" = "" ];then
  undef="true"
 fi
fi

なんで空文字かどうかを調べてるんだろうって思ったら var="UNDEF" って
なってる場合に対応してたのね
674名無しさん@お腹いっぱい。:2014/03/29(土) 14:28:34.93
>>673
変数が未定義という条件判断をするなら、

if [ -z "${var+DEF}" ]; then echo varは未定義; fi

だけで簡単に記述できるね。
675名無しさん@お腹いっぱい。:2014/03/29(土) 14:30:42.74
>>672
set -u 回避が正解って前提で話が盛り上がってたけど
全然関係なかったりしてw
676名無しさん@お腹いっぱい。:2014/03/29(土) 14:34:51.56
>>674
おお、素晴らしいφ(..)メモメモ
677名無しさん@お腹いっぱい。:2014/03/29(土) 20:36:49.57
>>672
> 大元の >>612 で言ってる「こういう書き方をしてるスクリプト」
> の全体を見てみたいものだ

例えば、

$ grep -iE '\$\{[a-z]+:' /usr/sbin/mkinitramfs
if [ -n "${UMASK:-}" ]; then
if [ -z "${compress:-}" ]; then
DESTDIR="$(mktemp -d ${TMPDIR:-/var/tmp}/mkinitramfs_XXXXXX)" || exit 1
__TMPCPIOGZ="$(mktemp ${TMPDIR:-/var/tmp}/mkinitramfs-OL_XXXXXX)" || exit 1
if [ -n "${ROOT:-}" ]; then

全体は長すぎるので省略します、あしからず
678名無しさん@お腹いっぱい。:2014/03/29(土) 22:01:34.99
mkinitramfs、-o オプションを付けないと outfile 変数は
set -u で引っ掛かってしまうのにそのままなんだな…?

if [ -z "${outfile}" ]; then
usage
fi
679名無しさん@お腹いっぱい。:2014/03/29(土) 22:07:19.97
報告したげて。
680名無しさん@お腹いっぱい。:2014/04/02(水) 09:19:47.77
外部プログラムにスペースを含む引数を渡したい
この引数は他の引数と一緒にシェル変数に格納される
このシェル変数名は別の変数に変数名で格納されていて
実行時にevalして実行される
試行錯誤した結果二回evalという解決策にたどり着いたけど、何かスマートじゃない。
もっとスマートな方法はある? スペースを含まないなら一回のevalで済むんだが。
argspecをevalって実行するという部分はいじれないのでそれは無しの方向で
抜粋部分はこんな感じ

echo_it() { for a; do echo $a; done; }
argspec="\$opts $DEFAULTS"

opts=
opts="$opts arg1"
opts="$opts \"arg with space\""

eval set $argspec
eval echo_it "$@"
681名無しさん@お腹いっぱい。:2014/04/02(水) 10:45:04.64
俺なら、どこか前処理でスペースを別の使わない文字か
あるいは使われない単語に変換して、呼ばれた側で同様に変換して戻す
という方式にする
無理にスペースをエスケープするより、綺麗になることが多い
682名無しさん@お腹いっぱい。:2014/04/02(水) 15:23:14.11
>>681 と被るけど、IFS を TAB だけにしちゃうとか
(ただし、引数にTABを含む文字列が使えなくなるけど)

opts="$opts arg1"
opts="$opts arg with space"

argspec="$opts $DEFAULTS"

OLD_IFS=$IFS; IFS=$'\t'
set -- $argspec
echo_it "$@"
IFS=$OLD_IFS

スマートかどうかは…不明
683名無しさん@お腹いっぱい。:2014/04/24(木) 01:59:44.80
テキストファイルについて、grepしたりsedしたり…といった整形処理をするシェルスクリプトを
作ってます

このファイルの末尾6行は不要なので、今は前処理で head -n -6 として削ってるのですが、
シェルスクリプト中でawkを使ってる部分が結構あるので、その処理をawkにて
置き換えられないだろうか、と考えてます

awk '/hoge/{
 do {
  〜処理〜
  if (NR > 総行数 - 6) exit; ←
 } while (getline)
}'

…みたいに「←」の様な記述を加えてやればよいのかなと思ってたのですが、しかし総行数は
ENDセクションにならないと分からないということでうまくいきませんでした
awkでうまく処理する方法、ありますでしょうか

事前にwcで行数を数えておき、それをawkに総行数の変数として渡して…というのは
うまくいったのですが、パイプが途切れるためかwcの仕様か、性能がかなり悪化してしまいました
684名無しさん@お腹いっぱい。:2014/04/24(木) 07:08:22.64
perl使えるのなら@lines=<>;とすると、行単位に配列に入るのでspliceと組み合わせれて便利かも?
685名無しさん@お腹いっぱい。:2014/04/24(木) 07:38:17.98
awkでやりたいんだよ!
686名無しさん@お腹いっぱい。:2014/04/24(木) 08:00:48.93
6行分のバッファを持っといて1行読むごとに6行前の行を処理すればいいんだけど、awkでどう書くかは知らない
687名無しさん@お腹いっぱい。:2014/04/24(木) 15:39:50.84
{
a[NR]=$0
if (NR>6){
$0=a[NR-6]
} else {
next
}
}

ってのをスクリプトの先頭につっこんでおけばいいかな。試してないけど。でも、
>このファイルの末尾6行は不要なので、今は前処理で head -n -6 として削ってるのですが、
これでいいと思う。
688683:2014/04/24(木) 23:52:15.46
皆さん意見ありがとうございました

6行分のバッファを、と見て、ほほーと思って途中まで実装してみましたが、
なんというか、非常によく分からないスクリプトになってきたので、やめました…

現状どおり、headで削る、でいこうと思います
689名無しさん@お腹いっぱい。:2014/04/25(金) 01:29:19.17
>>687
入力全部配列に突っ込むなら、普通に全部読み込んでから処理した方がいいんじゃね?
690名無しさん@お腹いっぱい。:2014/04/25(金) 02:26:46.70
a[NR%7]とa[(NR-6)%7]にすれば良いんじゃね。
691名無しさん@お腹いっぱい。:2014/04/25(金) 03:20:34.41
$ seq 1 10 | awk 'NR > 6 {print _[NR%6]} {_[NR%6] = $0}'
1
2
3
4
692名無しさん@お腹いっぱい。:2014/04/25(金) 06:49:31.64
リングバッファーきたー
693名無しさん@お腹いっぱい。:2014/04/25(金) 08:33:17.57
て言うか、定番でしょ。
694名無しさん@お腹いっぱい。:2014/04/25(金) 08:47:19.19
>>691
printしてしまわずに、そのあとの目的のawk処理につなげるにはどう書くの?
awk 2つをパイプでつないだのでは無駄なので。
695名無しさん@お腹いっぱい。:2014/04/25(金) 09:01:48.69
687を690にして使うか、691でprintの所に処理本体を_[NR%6]使って書き直す
696名無しさん@お腹いっぱい。:2014/04/25(金) 09:54:31.02
>>691
$0に代入直して新規行入力のつもりで処理を続行すればいい。

awk '{if(NR>6){$0=_[NR%6]}else{_[NR%6]=$0;next}} {ここにやりたい処理}'
697名無しさん@お腹いっぱい。:2014/04/25(金) 10:05:51.33
>>696
馬鹿は書き込むな。それ全然駄目。
698名無しさん@お腹いっぱい。:2014/04/25(金) 16:55:01.02
>>697
俺awk使えないから予想だけど、%0以外の自動更新される値が6行先になる?
699名無しさん@お腹いっぱい。:2014/04/25(金) 17:56:08.98
GWにシェルを始めようと思ってます。
cshは古い、bshは当たり前? じゃあashか? ashより優れた sshにするか?

コンサートだとA席よりS席の方が上ですよね?
700名無しさん@お腹いっぱい。:2014/04/25(金) 17:59:12.63
701691:2014/04/25(金) 23:22:31.10
素直にhead使っとき。↓bash

$ paste <(seq 1 10) <(seq 11 20) | awk '{l = $0} NR>6 {$0 = _[NR%6]} {_[NR%6] = l} NR>6 { printf "%d + %d = %d\n", $1, $2, $1 + $2 }'
1 + 11 = 12
2 + 12 = 14
3 + 13 = 16
4 + 14 = 18
702名無しさん@お腹いっぱい。:2014/04/28(月) 02:44:42.99
見れば見るほど、head併用が正解だな
703名無しさん@お腹いっぱい。:2014/04/28(月) 12:54:44.58
UNIX哲学
http://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6
1. 小さいものは美しい。
2. 各プログラムが一つのことをうまくやるようにせよ。
3. できる限り原型(プロトタイプ)を作れ。
4. 効率よりも移植しやすさを選べ。
5. 単純なテキストファイルにデータを格納せよ。
6. ソフトウェアの効率をきみの優位さとして利用せよ。
7. 効率と移植性を高めるためにシェルスクリプトを利用せよ。
8. 束縛するインターフェースは作るな。
9. 全てのプログラムはフィルタとして振る舞うようにせよ。
704名無しさん@お腹いっぱい。:2014/04/28(月) 13:02:19.25
>>703
板ちがい
705名無しさん@お腹いっぱい。:2014/04/29(火) 05:48:42.07
コレに従ってればわりとハッピーなスクリプトが書けるって話だからスレにはあってると思うが。
板に至ってはUNIX板より適切な板はないだろってレベル
706名無しさん@お腹いっぱい。:2014/04/29(火) 06:25:19.06
systemdはこれに反しまくってるな
特にjournaldなんか独自バイナリにログ入れて
journalctlでしか見れないようにしててめっちゃ不便
707名無しさん@お腹いっぱい。:2014/04/29(火) 08:52:18.75
>>706
ほんとこれ
トラブったときのログも特定の環境でしか読めないとか氏んでほしい
708名無しさん@お腹いっぱい。:2014/05/05(月) 18:29:35.56
>>706
マジかよクソすぎんだろsystemd
709名無しさん@お腹いっぱい。:2014/05/18(日) 05:09:49.37
シェルスクリプトはいい加減滅びろよと思うのは私だけ?
バッチ処理ならいいけど、条件分岐が入った時点でperlなりpythonなり使えと思うんだけど
710名無しさん@お腹いっぱい。:2014/05/18(日) 05:30:13.26
>>709
perlやpythonが入ってない(入れられない)環境もあるってことなんじゃ。
組み込み、UNIX、Linuxでもシェルさえある環境ならOK、
ってのはなかなか強力な利点じゃないかね。
711名無しさん@お腹いっぱい。:2014/05/18(日) 06:26:03.13
>>709
ashならバージョン互換性とか気にしなくて良いんじゃないの。
置き換えられてたらpython2.7とか一生アンインストールできなくなりそう。
712名無しさん@お腹いっぱい。:2014/05/18(日) 08:33:26.39
個人的にはperlこそいい加減滅びよと思ってるけどな
713名無しさん@お腹いっぱい。:2014/05/18(日) 09:07:08.76
system();だらけのスクリプトとか後で読みたくないし書きたくない。 空白入りの引数の処理も面倒そう。
シェルスクリプトなら3〜4行で終わるものが、何十行にもなってる python スクリプト見たこともあるわ。
714名無しさん@お腹いっぱい。:2014/05/18(日) 09:19:25.75
適材適所なんだしどっちかに滅びろよとか言ってる時点でどうかと思うな
何でbashで条件分岐使っちゃ駄目なのか良く分からんし
バッチ処理って単語の使い方が何か違う気がするし
715名無しさん@お腹いっぱい。:2014/05/18(日) 09:27:05.58
bashを使ったらそれはバッチ処理ではなくてバッシュ処理だからな
716名無しさん@お腹いっぱい。:2014/05/18(日) 10:30:08.01
つ、つまらん…
717名無しさん@お腹いっぱい。:2014/05/18(日) 16:55:44.52
シェルの基本的なコマンドを網羅したライブラリはほしいね。
そうすれば ` ` を使わなくて済む
718名無しさん@お腹いっぱい。:2014/05/18(日) 16:58:20.56
perlのCPANなら数は多いし大抵のことはできるんじゃないの
でもいちいちライブラリ入れるの面倒だし
仕事でサーバとか使ってると「追加ソフト入れるの禁止」
って状況はそれなりにある
719名無しさん@お腹いっぱい。:2014/05/18(日) 18:19:52.61
知らん間に開発・検証用マシンに入ってたCPANのライブラリに依存しており、
商用じゃそのPerlスクリプトが動かんかった、という凡ミスが連発した結果、
必要なライブラリを書面で説明できないPerlスクリプトは商用適用NG、となった
720名無しさん@お腹いっぱい。:2014/05/18(日) 18:24:43.11
自分で書いてみればperlやpythonよりシェルスクリプトの方が便利だってわかるのにな
コマンドの実行とか
721名無しさん@お腹いっぱい。:2014/05/19(月) 08:37:18.45
適材適所


ただし、perl の適所はなくなったので、早く滅びろ
722名無しさん@お腹いっぱい。:2014/05/20(火) 12:54:25.01
perlに親でも殺されたか
723名無しさん@お腹いっぱい。:2014/05/20(火) 13:11:40.74
じゃ、一行野郎は何使うんだよ。
724名無しさん@お腹いっぱい。:2014/05/20(火) 13:20:31.01
シェルスクリプトでええやん…
725名無しさん@お腹いっぱい。:2014/05/20(火) 17:30:45.52
シェルスクリプトの意味わかってないだろ
726名無しさん@お腹いっぱい。:2014/05/20(火) 17:51:03.17
>>723
rubyでいいんじゃない。短くかけるし。括弧言語じゃないから定義とか書くのは辛いけど、処理だけが目的なら代替手段あるだろうし。
727名無しさん@お腹いっぱい。:2014/05/20(火) 18:07:09.84
rubyがインストールされてるサーバは、少なくとも俺の身近には存在しない。
perlが駄目だと言うのなら、次に考えるのはawkかsedだろ。常識的に考えて。
728名無しさん@お腹いっぱい。:2014/05/20(火) 18:08:45.41
好きなの使えばええがな。
729名無しさん@お腹いっぱい。:2014/05/20(火) 18:14:46.31
>>726
ruby()

>>727
sedでは足りないのをperl使うのだ
awkは半端だからフィールド抽出以外には使わない

結論: 一行野郎に対する代替が無いのでperlは存命
730名無しさん@お腹いっぱい。:2014/05/20(火) 18:17:56.34
rubyがインストールされてないサーバは、少なくとも俺の身近には存在しない。
rubyが駄目だと言うのなら、次に考えるのはawkかsedだろ。常識的に考えて。
731名無しさん@お腹いっぱい。:2014/05/20(火) 18:33:31.84
ていうかperlを存命させるかどうかってのはそのOS、ディストリのコアな部分からそれを排除できるかの問題だろ。
rubyは入れる物を多少選べば排除できるが、perlへの依存を全て排除するのは無理ではないが結構面倒だろう。
732名無しさん@お腹いっぱい。:2014/05/20(火) 18:54:13.54
ここ何のスレだっけ。
733名無しさん@お腹いっぱい。:2014/05/20(火) 19:05:06.07
rubyとperlを罵倒しながら気分転換にシェルスクリプトの話をするスレ
734名無しさん@お腹いっぱい。:2014/05/20(火) 19:29:20.61
自分で環境作れないとこで、長々とワンライナー書くこともあまりない気がするけどなぁ。運用の人は書くのかな。
ビルトインとsedとawkで大抵こと足りるからな。perl使うのに多いのはライブラリ使いたい時とか。
でもそうするとpythonやrubyの方が最近のものがある気がする。pmとかまだ作られてるの?
735名無しさん@お腹いっぱい。:2014/05/21(水) 00:06:27.58
>>729
一行野郎と言えば「awkは書かねぇ、たった一行」だろ?
736名無しさん@お腹いっぱい。:2014/05/21(水) 03:32:28.76
うちのdebianにはperlとpythonは入ってるがphpとかrubyは入ってない
737名無しさん@お腹いっぱい。:2014/05/21(水) 05:00:52.02
Windowsですらtexと一緒にperl/awk/sed/grep辺りが住んでたりするな
738名無しさん@お腹いっぱい。:2014/05/21(水) 08:41:33.68
入ってないっていうか入れてないんだろ。
739名無しさん@お腹いっぱい。:2014/05/21(水) 08:47:53.28
>>730
rubyを入れなくても何にも困ってない rails?()
perlを入れてないとコンパイルできないものが結構ある(PostgreSQLとか)

ruby信者の視野狭窄は異常
740名無しさん@お腹いっぱい。:2014/05/21(水) 09:18:31.41
rubyで書く奴のおかげでrubyからpythonへの書き換えで飯が食えるとかなんとかw
741名無しさん@お腹いっぱい。:2014/05/21(水) 09:41:02.86
>>739
コンパイルの依存関係にperl入れるのは辞めてほしい
742名無しさん@お腹いっぱい。:2014/05/21(水) 10:01:39.33
>>741
autotoolsに依存するより全然まし
743名無しさん@お腹いっぱい。:2014/05/21(水) 10:02:56.58
やっぱxmkmfだよなw
744名無しさん@お腹いっぱい。:2014/05/21(水) 17:28:29.71
>>739>>741
コンパイルの依存関係にrubyやpythonが入るより少しはマシ
って言おうかと思ったけど自分の遭遇トラブルはperl依存モノの方が多かったorz

>>742
コンパイル省力化に高機能なツールや言語を使い出して、
今度はそっちの互換性問題が火を噴くとか本末転倒にもホドがある…

最小限のシェルスクリプトかMakefileで済む奴が一番気楽だわ
745名無しさん@お腹いっぱい。:2014/05/21(水) 17:39:42.30
> って言おうかと思ったけど自分の遭遇トラブルはperl依存モノの方が多かったorz
その分野ではrubyやpythonは使われてないからだろ。特にrubyは日本限定末端土方専用だから。
使われてなきゃトラブルには遭遇しない。当たり前だ。
746名無しさん@お腹いっぱい。:2014/05/21(水) 17:42:51.81
FreeBSDのperl依存地獄は凄いからな
perlのアップデートとかなったら阿鼻叫喚の渦
あと何かのプロジェクトで頑張ってperl依存をなくしたってニュースになったな

perlは撲滅すべき悪ではあるがまだ依存関係から取り除けてない害虫みたいなもんなんだろう
747名無しさん@お腹いっぱい。:2014/05/21(水) 18:01:29.51
>>743
お、懐かしいね。Canna じゃまだ使われているのかな?
748名無しさん@お腹いっぱい。:2014/05/21(水) 18:15:59.05
そういや Perl で one liner って使わなくなったな…
昔はこんなのを↓よくやってたけどね

$ perl -pi.bak -e 's:#!/usr/bin/perl:#!/usr/local/bin/perl:' *.pl

最近使ったのは…Run Length Encoding かな

$ echo '......' | perl -pe 's/(.)(\1+)/$1.(length($2)+1)/ge'

RLEって sed や awk, UNIX tools を組み合わせて one liner でできるのかな…
749名無しさん@お腹いっぱい。:2014/05/21(水) 18:35:56.58
>>746
お察しの通りFreeBSDだが、FreeBSDは脱GPL脱GCCの実績が有るし今後に期待?
750名無しさん@お腹いっぱい。:2014/05/21(水) 20:41:31.00
>>748
http://rosettacode.org/wiki/Run-length_encoding
ぐぐったらsed版とawk版があるな
つーかrun length encodingって必要になった状況ないな
751名無しさん@お腹いっぱい。:2014/05/22(木) 00:16:14.56
RELENG_5あたりでbaseからは脱Perlしてるじゃねえの
752名無しさん@お腹いっぱい。:2014/05/22(木) 09:09:18.24
確かに今では base に perl が含まれてはいませんが、実際に perl を入れずに
運用しているサーバを私は見たことがありません。
でも perl が入ってないサーバって、実は世の中には結構あるんですかね?
753名無しさん@お腹いっぱい。:2014/05/22(木) 09:30:02.07
>>752
じょ、冗談で書いてるんだよね?
754名無しさん@お腹いっぱい。:2014/05/22(木) 10:12:42.49
>>753
というと?
755名無しさん@お腹いっぱい。:2014/05/22(木) 12:16:17.56
perlなんて当然入れてない
756名無しさん@お腹いっぱい。:2014/05/22(木) 12:20:57.50
元からperlなんて入っていないし、要らない。
必要なら入れれば?な感じ。
757名無しさん@お腹いっぱい。:2014/05/22(木) 15:33:22.17
Debian wheezyの標準的なapt-lineで、各言語に依存するものの数を数えた。
その言語自身のセクションと、libsは除いてみた。
$ for l in perl python ruby ;do echo -n "$l ";aptitude search ~D$l\!~s$l\!~slibs|wc -l;done
perl 962
python 1603
ruby 204
758名無しさん@お腹いっぱい。:2014/05/22(木) 15:41:24.61
今日からperlやめてnode.jsに移行してみる
759名無しさん@お腹いっぱい。:2014/05/22(木) 21:37:53.41
>>758
それでタイプ量の多さに失望するんですね。
760名無しさん@お腹いっぱい。:2014/05/24(土) 11:07:22.49
シェルでテキスト処理の部分だけperlでやるのが一番無難だと思うけどなぁ。
sh系なら-e''の中に改行含めれるし。

最近はもう、awkをさけるようになったなぁ
なんで正規表現の互換性をなくしてしまったのか。
761名無しさん@お腹いっぱい。:2014/05/24(土) 11:56:11.33
>>742
autotoolsって、シェルスクリプトとm4とmakeで
できてるから、このスレ的には新参スクリプト言語よりは
歓迎なんじゃないかって気がするw
762名無しさん@お腹いっぱい。:2014/05/24(土) 21:11:49.14
「〜に依存する」だけならそれ入れれば済む話だが、
「auto」toolsはマニュアルで修正しないとコンパイル通らない場合が…
763名無しさん@お腹いっぱい。:2014/05/24(土) 21:55:46.18
修正マニュアルがあるならいいじゃないかw
764名無しさん@お腹いっぱい。:2014/05/25(日) 14:19:48.29
マニュアル=手作業 とマジレス
765名無しさん@お腹いっぱい。:2014/05/29(木) 00:34:01.91
FreeBSDが脱cshできればperlもしぼんでくと思う。だからまずしぼまない。
766名無しさん@お腹いっぱい。:2014/05/29(木) 17:22:41.57
いや、src.confでコンパイルしないようにするだけ。
もう、何年も前からcshは入ってないが何も不都合は生じてない
767名無しさん@お腹いっぱい。:2014/06/07(土) 16:19:13.77
数百万行のテキストをshのツールに食わせて実行結果を得る、なんてことをよくやるんだが、
プログレスバーを作って待ち時間のストレスを抑えようと思う
今何%進んでるかは実行行/全体行で簡単に分かるんだが、これを画面上に出力する時に、
単純に計算結果を出力するだけだと
 [05%]・・・・・
 [06%]・・・・・・
 [07%]・・・・・・・
という風に毎回改行されて表示されて画面が汚くなるのが嫌だ

つまり何が聞きたいかというと、既に出力された結果を書き換えるような仕組みはshで実現可能なのだろうか
分かりにくくてすまない
768名無しさん@お腹いっぱい。:2014/06/07(土) 16:20:12.71
>>767
^M
769名無しさん@お腹いっぱい。:2014/06/07(土) 16:26:43.02
^M のあと tput el しとくといいかも
770名無しさん@お腹いっぱい。:2014/06/07(土) 16:34:33.53
tputってFreeBSDで互換性ないんだよなぁ、、
771名無しさん@お腹いっぱい。:2014/06/07(土) 16:57:46.03
echo のオプションとか printf とかは?
772名無しさん@お腹いっぱい。:2014/06/07(土) 17:01:08.23
>>768-769
ありがとう。tputを初めて知ったが、勉強してみる
しかし^Mがわからん。何のことだ

>>771
echo -nで改行無し出力は出来るから、いわゆる伸びていく棒は再現出来た
が、すでに出力したn%のnを書き換えるような操作が出来ない
printfはそういうの出来るんだろうか?
773名無しさん@お腹いっぱい。:2014/06/07(土) 17:17:09.83
>>772
コントロール-Mを知らんのか? キャリッジリターンだぞ。カーソルは左端に戻る。
774名無しさん@お腹いっぱい。:2014/06/07(土) 17:23:46.19
マジかよ
いや^MがCtrl-Mなのは知ってたけどそんな効果あったのか
次会社いったら試してみる、ありがとう

ついでに調べてたら、某ブログでecho "\r\c"なるものを目撃した
これも同じ意味かな
775名無しさん@お腹いっぱい。:2014/06/07(土) 17:34:07.91
>>774
もしNetBSDならprogress(1)に逃げるって手もある
776名無しさん@お腹いっぱい。:2014/06/07(土) 17:47:05.14
echoはポータビリティに難があるのでprintfの方が良い
777名無しさん@お腹いっぱい。:2014/06/07(土) 17:49:02.97
printfもポータビリティに難があるが、、
778名無しさん@お腹いっぱい。:2014/06/07(土) 20:29:23.80
dialog --gauge もある
779名無しさん@お腹いっぱい。:2014/06/07(土) 20:46:07.95
>>770
FreeBSDがどうのというより、termcapとterminfoの違い。
780名無しさん@お腹いっぱい。:2014/06/07(土) 20:47:59.07
>>779
そんなことわかった上で言ってるんだがw
781名無しさん@お腹いっぱい。:2014/06/08(日) 00:08:18.41
??rで行頭からかくか、エスケープシーケンスでいいんじないかな。
ただ、ログのこと考えると、ただ延びていくだけのプログレスで十分だと思うけどなー
782名無しさん@お腹いっぱい。:2014/06/08(日) 01:23:49.35
URL1=...
URL2=...
URL3=...

と定義して
for ((i=1;3>i;i++))
do
 処理
done

の形で $URL$i と書いても URL1 などに展開されないのだが
正しくはどう書けばよいのでしょうか?
783名無しさん@お腹いっぱい。:2014/06/08(日) 02:03:50.42
eval echo '$'URL$i

eval url='$'URL$i
echo $url
784名無しさん@お腹いっぱい。:2014/06/08(日) 02:38:49.86
配列にしちゃうとか。

declare -a URL
URL[1]=...
URL[2]=...
URL[3]=...

for ((i=1;4>i;i++))
do
 echo ${URL[$i]}
done
785名無しさん@お腹いっぱい。:2014/06/08(日) 02:48:13.36
>>767
数値とプログレスバーと両方あるといいね。rpm -ivh みたいに。
sun wsのブート時みたいに棒を回すのもなかなかいいよ
786名無しさん@お腹いっぱい。:2014/06/08(日) 02:58:19.85
i<3 にしよう
787名無しさん@お腹いっぱい。:2014/06/08(日) 03:04:42.61
シンタックスエラーでなかなか回答遅れて申し訳なかったです
とりあえず暫定的に下のforループでしのぎました。
数が多くなると保守性が終わるけど。

for i in $URL1 $URL2 $URL3
do
......
done


>>783,784,786
文字連結のための''を使った回避術、
declareを使った配列宣言、
いいアイデアをいただきました。ありがとうございます。
788名無しさん@お腹いっぱい。:2014/06/08(日) 07:08:45.79
棒回しいいなー
上書き方法会得したらそれも試してみよう
789名無しさん@お腹いっぱい。:2014/06/08(日) 07:47:05.10
while :; do
 for t in '|\r' '/\r' '-\r' '\\\r'; do
  echo -en "$t"
  sleep 0.1
 done
done
790名無しさん@お腹いっぱい。:2014/06/08(日) 16:28:53.32
何かと思ったら棒回しか
\\がうまくいきゃいいが
791787:2014/06/08(日) 17:36:41.96
>>784
配列良いね
素晴らしく短くまとまった
保守性もばっちりだ
重ね重ね感謝申し上げる

URL=( \
#valiant
  http://m...
#watchSomething
  http://j...
#script
  http://b...
)

# download from URL, and add header
for ((i=0;i<3;i++))
do
 echo ${URL[i]}
done
792名無しさん@お腹いっぱい。:2014/06/08(日) 17:42:21.90
3から不変ならいいんだが、配列にするならこうしてみるのはどうか

for ((i=0; i<${#URL[*]}; i++))
do
 echo ${URL[i]}
done

手元に実行環境がなくて検証出来ないから間違ってたらスマン
793名無しさん@お腹いっぱい。:2014/06/08(日) 17:53:32.13
>>792
ありがとう。
httpで件数だけ埋め込む作業要らなくなった

${#配列名[*]}で取り出せるのか
こんな#が合ったなんて知らなかったよ
794名無しさん@お腹いっぱい。:2014/06/08(日) 21:41:28.47
テンポラリファイルの扱いについて訊きたい

一部のファイルをrmしてないバグがあるスクリプトを走らせてしまい/tmpに多数ファイルを残してしまった
このようなミスを抑える対策とかありますか
795名無しさん@お腹いっぱい。:2014/06/08(日) 21:45:16.18
>>794
入力、処理、出力、という流れを意識して、設計書を書き、
ポイントポイントで処理の目的に即したテスト項目を作って、
結果を他人が評価できるようにテストを実施することだよ
796名無しさん@お腹いっぱい。:2014/06/08(日) 22:51:32.33
>>794
シェルスクリプト一般だと、tmpfile(3)みたいにプログラムが終わると勝手に消える
ようにするのは難しいだろうね。頑張れば出来るかもしれないけど・・。

一時ファイルというと、とりあえずファイル名に$$を入れたりすることが多いけど、
そういうのを含めない(可能なら固定名にする)のが、バグがあっても
悲惨なこと(/tmpが枯渇するなど)にならない設計方法のひとつ。
もちろん可能な場合だけど
797名無しさん@お腹いっぱい。:2014/06/08(日) 23:43:54.83
>>794
オブジェクト指向で設計し、インスタンスの寿命が尽きる時にファイルが消去されてることを確認し、されていなければ破棄する。
サポートされていない言語だと例外時に忘れがちなので注意。
798名無しさん@お腹いっぱい。:2014/06/08(日) 23:53:29.64
開始時に mkdir /tmp/アプリ名-プロセス番号/ してそこに作業ファイルを置いて、終了時に
rm -f /tmp/アプリ名-プロセス番号 すれば良いだけでは?
trap 使えば SIGTERM とか SIGINT にも対応できるし、bash なら終了時にキックもできる。

複数インスタンスの稼働を想定しないなら >>796 の言うように名前固定して、既存ファイルが
ある場合にエラーでとまるようにするとかもアリかな。
799名無しさん@お腹いっぱい。:2014/06/09(月) 00:03:28.76
小手先の対応で何とかするよりも、ちゃんとテストする方がよかろうよ
800>>794:2014/06/09(月) 00:26:53.38
>>795-799
チェック漏れがこんなことになるとはなあ
/mntにはtempfsをマウントしていないから簡単には使い切れないのが幸いだった

tempfileとrmをループ外へ追い出してみるのと、こんな感じで一時ファイルの場所の移動を試してみます
export TMPDIR=$(mktemp -d)
trap "rm -rf $TMPDIR" EXIT

>>797
言葉足らずで申し訳ない。問題のスクリプはzshスクリプトです
801名無しさん@お腹いっぱい。:2014/06/09(月) 00:57:13.18
>>797はからかってるか、マジボケかのどっちかだろうよ
802名無しさん@お腹いっぱい。:2014/06/09(月) 02:38:45.23
trap "command" EXIT
なんて用法があったのか。やはりこのスレは勉強になる
803名無しさん@お腹いっぱい。:2014/06/09(月) 11:27:14.45
>>801
実装ミスであるなら、どんな仕組みを使っても同じ。
設計手法はそういったミスを抑えるためにもある。
そして設計ミスが生まれる。

おそらくは例外時だろうけど、具体的なバグを聞かないと実装による対処方法は確定しない。
804名無しさん@お腹いっぱい。:2014/06/09(月) 11:33:19.20
それより一時ファイルを作らない方法でシェルスクリプトを記述するのがいいよ。
パイプやコマンド置換でかなりのところまで行ける。
どうしても一時ファイルが要る場合でも、openしたまま先にrmしとくとかでかなり対処できる。
trap 'rm file' 0 とかで消すのはkill -9 された場合は無理だし。
805名無しさん@お腹いっぱい。:2014/06/09(月) 13:22:45.34
トラップ一家物語
806名無しさん@お腹いっぱい。:2014/06/09(月) 15:57:02.71
Cでオブジェクト指向っぽい事するのは例があるけど、
シェルスクリプトでやるのは労力に見合うのだろうか…
807名無しさん@お腹いっぱい。:2014/06/09(月) 16:03:28.20
Perlのblessされたスカラのリファレンスのようなもの?
808名無しさん@お腹いっぱい。:2014/06/09(月) 16:39:23.19
そもそも構造体がないからねえ
809名無しさん@お腹いっぱい。:2014/06/09(月) 20:29:57.19
そんなのより関数作るのが先だろ
810名無しさん@お腹いっぱい。:2014/06/09(月) 23:23:09.12
HEADER
AA(55)
AA(20)
FOOTER
となっているファイルを食わせて、
HEADER
AA(11)
AA(4)
FOOTER
を吐かせたい。
つまり()内の数値を5で割ったものを吐かせたいんだが、これをshでやるとしたらどういうやり方する?
試しにsed噛ませようと試みたけどあれ演算するのすごいめんどくさそうで
811名無しさん@お腹いっぱい。:2014/06/09(月) 23:39:14.15
つawk
812名無しさん@お腹いっぱい。:2014/06/09(月) 23:41:42.95
$ expr "AA(55)" : ".*(\([[:digit:]]\+\)).*"
55
$ echo $((55/5))
11
$
813名無しさん@お腹いっぱい。:2014/06/10(火) 00:06:17.61
IFS=
sed -e 's/\$/\\$/' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' | while read l; do eval echo "\"$l\"";done
814名無しさん@お腹いっぱい。:2014/06/10(火) 00:24:48.89
sedの中で$((\1/5))なんて出来るのか?
815名無しさん@お腹いっぱい。:2014/06/10(火) 00:55:00.72
出来ないね。でも>>813は要求仕様通りに動作する。
816名無しさん@お腹いっぱい。:2014/06/10(火) 01:23:49.76
$$(expr 式)
817名無しさん@お腹いっぱい。:2014/06/10(火) 09:08:48.05
>>814
sedにshスクリプトを書かせてるわけだね。
818名無しさん@お腹いっぱい。:2014/06/10(火) 10:03:19.34
今時の sh は bash か ksh93 が標準なのか…
819名無しさん@お腹いっぱい。:2014/06/10(火) 10:44:55.16
>>816
sed -e 's/\([$`]\)/\\\\\1/g' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' -e 's/^/"/'
-e 's/$/"/'|while read l; do eval echo "$l";done

>>818
$((expr))のこといってるならposix shellだよ
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
820818:2014/06/10(火) 12:11:58.44
>>819
Solaris8 や HP-UX10 あたりの sh は演算置換できなかった覚えがあるんだけど、
便利になったなあ…
821名無しさん@お腹いっぱい。:2014/06/10(火) 12:15:49.48
何に準拠してるかではなく、スクリプトを書かせてる発想が大事であって、自分の環境で動かなかったら書き換えればいいだけ。
822810:2014/06/10(火) 12:29:01.86
おお……すごいな
自分の発想が貧困だったことを思い知らされる
ありがとう
823名無しさん@お腹いっぱい。:2014/06/10(火) 14:09:06.28
eval使うほどの案件じゃない
824名無しさん@お腹いっぱい。:2014/06/10(火) 14:28:20.32
威張るな
825名無しさん@お腹いっぱい。:2014/06/10(火) 14:32:11.80
eval使わずに、$((xx)) も使わずに:

while IFS='()' read a b; do
if [ "$b" ]; then
echo "$a(`expr $b / 5`)"
else
echo "$a"
fi
done
826名無しさん@お腹いっぱい。:2014/06/10(火) 14:53:54.80
>>825
AA(55) や AA(20) の行末に何か文字が入ってしまうとエラーになる
>>819 なら "AA(20) BB(100) CC(65)" とかになっていてもOK
827名無しさん@お腹いっぱい。:2014/06/10(火) 14:56:24.36
>>826
そんなことわかった上で、要求仕様だけ満たす最小限で書いているのだよ。
828名無しさん@お腹いっぱい。:2014/06/10(火) 14:58:01.83
悔しいのぅ〜悔しいのぅ〜
829名無しさん@お腹いっぱい。:2014/06/10(火) 15:05:19.71
>>826
>>819 は入力に " が1個とか(奇数個)含まれてるとエラーになるぞ。
>>825 ならOK
830名無しさん@お腹いっぱい。:2014/06/10(火) 15:08:54.44
ほらよ
sed -e 's/\(["$`]\)/\\\\\1/g' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' -e 's/^/"/'
-e 's/$/"/'|while read l; do eval echo "$l";done
831名無しさん@お腹いっぱい。:2014/06/10(火) 15:12:08.71
う〜〜ん、A("55") だったりすると >>825 はエラーになるね
>>819 はそのまま出力される…仕様外だからしょうがないのかもしれない
832名無しさん@お腹いっぱい。:2014/06/10(火) 15:13:25.19
>>830
お見事
833名無しさん@お腹いっぱい。:2014/06/10(火) 15:13:41.98
>>830
入力行中に半角¥があると消えちゃうねw
834名無しさん@お腹いっぱい。:2014/06/10(火) 15:15:51.89
素直にこうじゃいかんの?

while read line; do
case "$line" in
AA\(*\)) echo AA\(`expr "$line" : 'AA(\(.*\))' / 5`\) ;;
*) echo "$line" ;;
esac
done
835名無しさん@お腹いっぱい。:2014/06/10(火) 15:18:07.96
>>834
AA() の AAは固定という解釈か? BB() とかないの?
836名無しさん@お腹いっぱい。:2014/06/10(火) 15:20:27.44
>>835
対応は簡単だけど、要求使用外だから別料金
837名無しさん@お腹いっぱい。:2014/06/10(火) 15:25:43.37
\は厄介だな

IFS=
sed -e 's/\\/!!!rougue_monster!!!/g' -e 's/\(["$`]\)/\\\\\1/g' -e 's!\(([0-9][0-9]*)\)!(\$((\1/5)))!g' -e 's/^/"/' -e 's/$/"/' |while read l; do eval echo "$l";done | sed -e 's/!!!rougue_monster!!!/\\/g'
838名無しさん@お腹いっぱい。:2014/06/10(火) 15:28:31.93
>>833
>>825 でも "\AA(55)" とかのバックスラッシュは消えちゃうんじゃない
まぁ、バックスラッシュを保存したかったら入力側で "\\\AA(55)" とかして
おけば良いような
839名無しさん@お腹いっぱい。:2014/06/10(火) 15:33:12.06
>>838
>>825 は read を read -r にすればバックスラッシュ保存されるよ。
840名無しさん@お腹いっぱい。:2014/06/10(火) 15:36:44.33
そうすると今度は "AA(\55)" が…いや、仕様外だな
841白バラ十字軍:2014/06/10(火) 15:41:26.82
今では殺人事件凶悪事件が起こると創価員かというぐらい
ネットではささやかれる時代になりました。刑務所受刑者の33%は創価員という事実は有名な話ですが、以下を見れば納得ができます

創価員が裁かれる    判決の際 法廷にこだまする「 池 田 先 生 万 歳 !」
◎以下これ以外にまだまだ創価員の犯罪多数あり、書類送検されていないだけであなたの街でも多数すさまじい事件の数が
発生しましたし、まだまだ毎日のように創価員による凶悪事件は発生しているのです!
しかもこれ以外にもTVでも報道された凶悪事件多数あり!。あなたの周りにも潜んでいる。
危険です。危機的状況です。酒鬼薔薇だけではありません。実にたくさんいるのです
あなたの街でも善良な人間のように取り繕い潜んでいるのです。

●宅間守(在日)→大阪 附属池田小学校児童殺傷 創価学会員。大量殺人犯 。8人殺害 15人が重軽傷。悪徳 朝鮮人部落出身。
(悪徳カルト)両親も創価学会員。獄中結婚したが相手の女も創価員。さすが創価員は悪徳な者を好む。あえて結婚する
とは殺人破壊者を賛美、美化、擁護する行為 2004年死刑執行 獄中結婚した女は慰謝料損害賠償払ったのか?被害者に詫びたのか?
宅間は被害者に詫びていない。つまり・・・判決の際 法廷にこだまする「 池 田 先 生 万 歳 !」ということ
日本の犯罪史上、稀に見る大事件
●畠山鈴香 (在日)→秋田県児童連続殺害事件 創価学会員。悪徳。(悪徳カルト)
●斉藤勇太 →JR取手駅前バス無差別殺傷事件 創価学会員。悪徳。(悪徳カルト)
●酒鬼薔薇聖斗→ 東慎一郎(在日)神戸の首切り魔で酒鬼薔薇聖斗 創価学会員。神戸の首切り魔。生首を校門に飾る。悪徳2人殺害。
元在日朝鮮人。両親も創価学会員(悪徳カルト)
●福田孝行(在日)→山口県母子殺害 殺害後屍姦、乳児も殺害 創価学会員。悪徳(悪徳カルト)
●阿部隆 →長野母子バラバラ殺人事件(平成元年)船橋市幼児バラバラ殺人事件 千葉県船橋市の熱心な創価学会員・A・A子さんと長男
のHちゃんが、同じく学会員である夫のA・Tに殺された。動機は生活苦。バラバラにされた死体が聖教新聞に包まれ、長野県の山中に捨
てられていた 悪徳(悪徳カルト)
842名無しさん@お腹いっぱい。:2014/06/10(火) 17:33:57.23
お前らこういう問題好きすぎだろww
分かるけどさ
843名無しさん@お腹いっぱい。:2014/06/10(火) 18:07:53.19
そういやオライリーから「Data Science at the Command Line」って本が
8月に出版されるそうな

http://www.oreilly.com/pub/e/3115
https://twitter.com/jeroenhjanssens/status/474948853284999168/photo/1
844名無しさん@お腹いっぱい。:2014/06/10(火) 18:10:14.13
>>843
あくまでコマンドラインで操作するってだけで
シェルスクリプト関係なさそう
つーかこういうツールって大抵CLIだからわざわざタイトルに書かなくてもいいような
845名無しさん@お腹いっぱい。:2014/06/10(火) 20:07:24.97
素直にperlでいいじゃんと思った俺は負け組か。。。
846名無しさん@お腹いっぱい。:2014/06/10(火) 23:27:05.36
>>845
しかも Perl のワンライナーの方が速いっていう
847名無しさん@お腹いっぱい。:2014/06/10(火) 23:31:05.39
せやろか?
848名無しさん@お腹いっぱい。:2014/06/11(水) 00:19:36.58
速さより早さ。
849名無しさん@お腹いっぱい。:2014/06/11(水) 01:24:39.28
早さより可読性
っていうのはスレ違いかな
850名無しさん@お腹いっぱい。:2014/06/11(水) 01:57:36.02
>>844
関係なさそうどころか、普通にIPythonとR使いますって書いてある
851名無しさん@お腹いっぱい。:2014/06/11(水) 02:18:03.96
男は度胸!何でもためしてみるのさ
852名無しさん@お腹いっぱい。:2014/06/13(金) 01:19:21.92
問:下記のようなテキストファイルがある
>__BEGIN__
>NAME:xxx
>...
>STYLE:yyy
>...
>__END__
>__BEGIN__
>NAME:aaa
>...
>STYLE:bbb
>...
>STYLE:ccc
>...
>__END__
>__BEGIN__
>..
BEGIN-END間を1ブロックとして、1ブロック内にNAMEが1つ、STYLEが1つ以上。
1ブロックの情報を「NAME:STYLE,STYLE,,,,」というように1行にまとめて整形するようなスクリプトを考える。
全行数が数百万行、ブロック数は数千ほどあるとして、現実的実行時間で収まる事。
__BEGIN__は最初の1つ以外はすべて__END__の直後にあるとし、NAMEは__BEGIN__の直後に出現、STYLEの位置はブロック毎に異なるとする。
暇潰しにどうぞ
853名無しさん@お腹いっぱい。:2014/06/13(金) 02:05:55.88
>>852
sedでいらない行消してNで適当にくっつけて改行を,に変えてちょっと整形すればいいんじゃね?
854名無しさん@お腹いっぱい。:2014/06/13(金) 08:51:41.06
BEGIN{FS=":"}
$1=="NAME"{n=$2}
$1=="STYLE"{s=s$2","}
$0=="__END__"{sub(/,$/,s);print n":"s;s=""}
855名無しさん@お腹いっぱい。:2014/06/13(金) 11:30:59.14
awkすげぇな……
856名無しさん@お腹いっぱい。:2014/06/13(金) 14:16:24.79
うーん、もっとコンパクトに書きたい……
egrep '^(NAME:.*|STYLE:.*|__END__)$' | sed -E -e :begin -e N -e 's/\n__END__$/&/' -e tend -e bbegin -e :end -e 's/^NAME://' -e 's/\nSTYLE:/:/' -e 's/\nSTYLE:/,/g' -e 's/\n__END__$//'
857名無しさん@お腹いっぱい。:2014/06/13(金) 15:32:01.10
egrepなくして冗長も減らしてみた
sed -e 's/^__BEGIN__$//' -e :B -e N -e 's/\nNAME://' -e 's/\nSTYLE:/,/' -e tB -e 's/\n__END__$//' -e tE -e 's/\n.*//' -e bB -e :E -e 's/,/:/'
858名無しさん@お腹いっぱい。:2014/06/13(金) 17:39:23.28
856だとメモリ詰め込みまくりでなんだかなぁって思ったけど、
857だとうまくいきそうだな
実行時間どんなもんやろか
859名無しさん@お腹いっぱい。:2014/06/15(日) 02:37:40.63
>>857もすごいが、個人的には>>854が好きだな
必要最低限のことしかしてない感じと可読性の高さが気に入った
何より仕様変更に強そう
860名無しさん@お腹いっぱい。:2014/06/15(日) 03:32:55.22
alias でもなく pushd/popd でもなくて、もっと簡単にディレクトリを登録して呼び出せるような方法ってないですかね?ブックマーク(?)みたいに
ただし bash 限定で
861名無しさん@お腹いっぱい。:2014/06/15(日) 04:10:21.09
symlinkでいくね?
862名無しさん@お腹いっぱい。:2014/06/15(日) 04:23:17.30
aliasで十分すぎるぐらい簡単な気がするんだが……
863名無しさん@お腹いっぱい。:2014/06/15(日) 09:26:22.48
864名無しさん@お腹いっぱい。:2014/06/15(日) 18:39:14.24
シェル勉強中だがesacみて吐き気がした
fiはfinish ifか何かの遊び心としてもこれはちょっと……
865名無しさん@お腹いっぱい。:2014/06/15(日) 18:42:20.05
この程度で吐き気してたら先が思いやられるね

for … rof
while … elihw

とかも出てくるから慣れようねw
866名無しさん@お腹いっぱい。:2014/06/15(日) 18:50:25.87
あ.そう
867名無しさん@お腹いっぱい。:2014/06/15(日) 20:45:19.15
od が無ければ、algol にならって、do list; od だったのだろうか。
868名無しさん@お腹いっぱい。:2014/06/15(日) 21:41:52.54
if .. fi や case ... esac のようなのと
do .. done がごっちゃになってるのは美しくない!
みたいなこと言ってる人見たことあるけど割とどーでもいいな
869名無しさん@お腹いっぱい。:2014/06/15(日) 22:25:33.36
do .. done系は全部ループやしそれ以外は反転ってルールにしたんだろうね
870名無しさん@お腹いっぱい。:2014/06/15(日) 23:52:31.71
esacは確かにキモいがだからと言ってendcaseとかやられてもうーん
871名無しさん@お腹いっぱい。:2014/06/16(月) 01:57:14.37
シェルスクリプトに何を求めて勉強してんだ。
872名無しさん@お腹いっぱい。:2014/06/16(月) 12:54:05.03
esacが嫌な人はCシェル使えばいいと思うよ
873名無しさん@お腹いっぱい。:2014/06/17(火) 12:58:22.00
>>854のawk
最後のsub(/,$/,s);ってsub(/,$/,,s);の書き間違いかなと思うんだが
874名無しさん@お腹いっぱい。:2014/06/18(水) 22:51:23.12
sub(/,$/,,s)じゃなくてsub(/,$/,"",s)か
勘違いだったらハズカシィ
875名無しさん@お腹いっぱい。:2014/06/19(木) 15:04:38.00
セミコロンで区切るのだってキモいだろ
esacとたいして変わらん
876名無しさん@お腹いっぱい。:2014/06/19(木) 15:38:27.70
C言語から学び始めた俺にとっては至極自然
とはいえサブシェルを{}で開くと違和感バリバリだが
877名無しさん@お腹いっぱい。:2014/06/19(木) 15:41:14.67
>>876
サブシェルは () だぞ。{ ;} は同じシェルの単なるグルーピング。

キモいと言ってるのはcase(switch)文をbreakする仕組み自体のことじゃなく、
そのbreakを ;; という記号で表すことについて言ってるんだけど。
878名無しさん@お腹いっぱい。:2014/06/19(木) 15:43:46.40
改行の代わりにコマンドを ; で区切る話じゃないのか?
879876:2014/06/19(木) 15:50:23.77
すまん>>878のつもりでセミコロンの話解釈してたけどcaseの中身の話か
確かにありゃキモいな
そしてサブシェル勘違いorz
880名無しさん@お腹いっぱい。:2014/06/19(木) 16:26:09.26
findの-execのセミコロン「ゆ…許された」
881名無しさん@お腹いっぱい。:2014/06/19(木) 16:29:05.11
esacも;;も気にならんけど、(と対称にならないcaseのパターン指定はダメだ。
882名無しさん@お腹いっぱい。:2014/06/19(木) 16:37:30.82
bashだと、
case $var in (hoge) echo hoge;; esac
とか書けるんだ。
883名無しさん@お腹いっぱい。:2014/06/24(火) 02:53:56.45
なんか書き込みがずっとないからなんか書いてみよう
--
あるファイルに、
1
2
3..
という具合に、改行区切りで昇順に数字が書き込まれているとする
しかし、ファイル末尾の数値と行数が合わない為、どこかで数値が欠けている、もしくは重複していると予想される
ファイル内部は昇順ソート済みとして、重複・欠損している数値を洗い出す効率の良い仕組みを考える
shでもperlでもなんでもどうぞ
884名無しさん@お腹いっぱい。:2014/06/24(火) 06:25:38.91
awk 'NR!=$1{print NR}'
885名無しさん@お腹いっぱい。:2014/06/24(火) 06:58:51.21
i=1; while read line; do [ "$line" != $i ] &amp;&amp; echo $i; i=`expr $i + 1`; done
886名無しさん@お腹いっぱい。:2014/06/24(火) 07:07:29.80
for((i=1; ;i++)){ read l||break;case $l in $i);;*)echo $i;;esac;}
887名無しさん@お腹いっぱい。:2014/06/24(火) 07:24:52.17
exec 3<&amp;0;yes ''|cat -n|while read f <&amp;3;do read i;[ "$f" != $i ]&amp;&amp;echo $i;done
888名無しさん@お腹いっぱい。:2014/06/24(火) 08:29:05.51
cat -n|while read a b; do case $b in $a);;*)echo $a;;esac;done
889名無しさん@お腹いっぱい。:2014/06/24(火) 09:28:26.18
遅レスだが、>>860については、俺はシェル変数使ってるな。
rcファイルでd=/path/nameとしておいて ls $d とか。
ホーム直下に一文字シンボリックリンク作るより文字数は少なくて済む。
890名無しさん@お腹いっぱい。:2014/06/24(火) 13:20:13.16
ファイル名をnumとして
diff -y --supress-common-lines <(seq 1 `tail -n1 num`) num
891名無しさん@お腹いっぱい。:2014/06/24(火) 13:39:07.32
他のがぱっと分からんけど、>>884って1回ズレたとこ見つけたらそれ以降全部吐かない?
えらい邪魔なような
892名無しさん@お腹いっぱい。:2014/06/24(火) 15:02:19.92
目的が差異の確認だしdiffが一番スマートな印象だなぁ…出力形式も変更が効くし
893名無しさん@お腹いっぱい。:2014/06/24(火) 15:04:16.55
>>890 だと標準入力から読めない。one passで実行できない。
894名無しさん@お腹いっぱい。:2014/06/24(火) 15:28:53.02
>>884がシンプルでいいと思う。
895名無しさん@お腹いっぱい。:2014/06/24(火) 15:41:08.12
one passが何かはよく知らないんだが、
・ファイルに書き込まれたものをチェックする前提がある=標準入力使う必要がない
・重複、又は欠損がある=複数、両方ある場合に全て検出するのが理想
というのを考えると、diffが一番いい答えを返してくれそうな気がする
>>884は確かにシンプルなんだが、ファイルの比較的先頭のほうが狂ってた場合、それ以降を全部出力しちゃうっていう点で微妙な気もする
896名無しさん@お腹いっぱい。:2014/06/24(火) 17:00:58.98
>>895
headすればいいじゃん。
そんなに頻繁に使うものとは思ってないので、書きやすい方がいいと思いました。
897名無しさん@お腹いっぱい。:2014/06/24(火) 17:31:03.08
>>890 だと、
もしファイルの最終行が間違っていて 最終行の内容が 1 とかだったら、
どの行が違っているのか全然チェックできない。
898名無しさん@お腹いっぱい。:2014/06/24(火) 17:46:42.34
シェルを書く際の注意事項があります。
コンピュータのCPUが何ビットであるか調ベておく事が大切です。

32ビットCPUを登載したコンピュータには、
32ビット用のシェルを書くこと。

64ビットCPUを登載したコンピュータには、
64ビット用のシェルを書くこと。

これを間違えればシェルが動きません
899名無しさん@お腹いっぱい。:2014/06/24(火) 18:07:22.22
自閉症あらわる
900名無しさん@お腹いっぱい。:2014/06/24(火) 18:10:05.25
シェルの意味が分かってないんじゃないの?
901名無しさん@お腹いっぱい。:2014/06/24(火) 18:16:36.30
いつもの改変コピペ君。
相手しちゃいかん。
902名無しさん@お腹いっぱい。:2014/06/24(火) 18:36:12.99
--suppress-common-lines のスペルが違ってたり、
プロセス置換使って互換性無いのに backquote 使ってるのも気になるが、
diff がいいんじゃないの。
重複、欠損が1つとは限らないし、ワンライナーでなくスクリプトの話でしょ?

あと、yes '' | cat -n とかおもしろい。
改行区切りで昇順なのに、 >>897 の "最終行の内容が 1" って突っ込んだら負けなのか?
903名無しさん@お腹いっぱい。:2014/06/24(火) 20:06:24.04
>>883

$ cat a.txt | tee >(uniq -d) >(uniq | awk 'NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}') &>/dev/null

moreutils の pee を使う場合

$ cat a.txt | pee "uniq -d" 'uniq | awk '\''NR!=$1{for(i=NR;i<$1;i++){print i};NR=$1++}'\'''
904名無しさん@お腹いっぱい。:2014/06/24(火) 20:38:13.53
peeとかすごいネーミングw
905名無しさん@お腹いっぱい。:2014/06/24(火) 20:42:14.23
$ seq 1 `cat a.txt | wc -l` > tmp.txt; diff a.txt tmp.txt; rm tmp.txt
とかでよくね
906名無しさん@お腹いっぱい。:2014/06/24(火) 20:48:11.55
添付ファイルとか品質低下し杉
907名無しさん@お腹いっぱい。:2014/06/24(火) 23:31:47.05
しばらく書き込みないと思ってたのに反応すごいな

>>902の「互換性ないのに`使ってる」っていう点なんだが、
プロセス置換の記述の中で``って使えない環境もあるのか?
プロセス置換自体よくわかってないとこあるからちょっとあれだが

プロセス置換と``が同時に使えない場合でも>>905みたいなのはさすがにな……
908名無しさん@お腹いっぱい。:2014/06/24(火) 23:33:33.50
つか、--surpress-common-linesの綴り間違ってたんだな……
これmanページから引っ張ってきたんだけどマニュアルの誤植なのか……
http://linuxjm.sourceforge.jp/html/gnumaniak/man1/diff.1.html
909名無しさん@お腹いっぱい。:2014/06/25(水) 00:44:07.04
出遅れたが、またawkで
awk '{if($0-p!=1)print NR,p,$0;p=$0}'
910名無しさん@お腹いっぱい。:2014/06/25(水) 01:16:53.80
>>909
これいいな。>>884の欠点を補った感じで
ifの構文がちょっとよくわからんのだけど
911名無しさん@お腹いっぱい。:2014/06/25(水) 01:32:44.63
この手のお題は入出力例が欲しいなぁ
912名無しさん@お腹いっぱい。:2014/06/25(水) 01:47:50.54
>>911
次やる時にはそうする
913名無しさん@お腹いっぱい。:2014/06/25(水) 03:19:08.72
>>852
出遅れどころじゃないけど、NULつけてLFと交換するとか:
sed -n -e 's/^NAME:\(.*\)$/\x00\1:/p' -e 's/^STYLE:\(.*\)$/\1,/p' | tr '\000\n' '\n\000'
914名無しさん@お腹いっぱい。:2014/06/25(水) 03:31:58.38
ゆえとたまきんのおしっこ直飲みしたい
915名無しさん@お腹いっぱい。:2014/06/25(水) 08:35:03.52
>>904 >>914 看過出来ないネーミング。直訳ひどいw
http://sourceforge.jp/projects/freshmeat_moreutils/releases/
> 0.7
> 2006-03-20 07:39
> おしっこ(パイプティー)ユーティリティが追加されました。
916名無しさん@お腹いっぱい。:2014/06/25(水) 09:48:52.03
渋谷に集まったサポーターが痴漢してるわけじゃなくて、
人の多いところに痴漢常習者が集まっただけ。
ジャニのコンサート会場の最寄駅なんかも沢山いる。
917名無しさん@お腹いっぱい。:2014/06/25(水) 09:53:42.42
>>915
まぁ機械翻訳だからな。
918名無しさん@お腹いっぱい。:2014/06/25(水) 13:05:29.67
>>907 クドくなるので >>902 では文章を削るばかりだったが、
もっと言葉を選べば良かった。互換性でなく portability とかの方が適切だったかも。

 >>890 では、zsh bash ksh の機能であるプロセス置換を使っているので、
portability は既に失われている。
 この為、back quote はあえて使う必要が無い。
スペルミス同様大した事じゃあ無いが、何で back quote 使ってるの?と気になった。

以下、念の為の補足。
 参考他で議論されている通り、一般的に back quote は、
公式には非推奨ではないものの、使わない様にしたい古いやり方。

 `...` は、POSIX 非互換のとても古い Bourne shell でのみ必要なレガシーな構文。

 ただし、このスレは Bourne Shell(/bin/sh) がデフォルトで、heirloom sh がどうのと
>>1 に書いてあるので、portability を考え back quote を使うか、特記して
dollar parens を使用する事が望ましい。

 個人的には POSIX デフォにしたいですが。

参考
Have backticks (i.e. `cmd`) in *sh shells been deprecated?
http://unix.stackexchange.com/questions/126927/
919名無しさん@お腹いっぱい。:2014/06/25(水) 13:21:13.94
>>918
890のbacktickは必要じゃないの?
というかコマンドの出力を文字列で参照するとき、backtickで括るのは珍しくないでしょbashでも
920名無しさん@お腹いっぱい。:2014/06/25(水) 13:31:15.56
入れ子にするときどう書く?
921名無しさん@お腹いっぱい。:2014/06/25(水) 13:31:59.11
2行に分ける
922名無しさん@お腹いっぱい。:2014/06/25(水) 13:33:39.24
バッククォートの入れ子は基本だな。新入社員のテストで良く使う。
バッククォートの3重入れ子までできて一人前。$( )なんかに逃げるのは半人前。
923名無しさん@お腹いっぱい。:2014/06/25(水) 13:51:24.95
cshでは入れ子にできないことを知って捨てる決意をした25年前
924名無しさん@お腹いっぱい。:2014/06/25(水) 15:05:29.35
漏れutilsってところが、また、そそるよな
925名無しさん@お腹いっぱい。:2014/06/25(水) 16:48:43.67
>>918
なるほど、/bin/shじゃ動かないのになんで/bin/shで使うバッククォート使ってるんだって話だったのか
個人的に$( )が使い慣れなてないだけだったんだけどね
bashなら問題なく動くから普通に記述してしまった
926名無しさん@お腹いっぱい。:2014/06/25(水) 16:51:45.83
>>922
さすがにバッククォートの3重入れ子とかするぐらいなら$( )使えよって思う
一応出来たけど汚い
927名無しさん@お腹いっぱい。:2014/06/25(水) 17:08:35.73
参考の様な意見が一般的だと言うだけで、ポータビリティが関係ないスクリプトでも、
`cmd` で書きつづける人もいるでしょうね。
たとえ、Obsolete and deprecated syntax とか legacy とか言われても。

少なくとも、>>919 >>921 >>922 は back quote なわけでしょ?
無用な議論するつもりは無いけど、しかしながら、
back quote を肯定する理由が有るなら、参考までに聞いてみたい。
何故に back quote を使っていますか?
928名無しさん@お腹いっぱい。:2014/06/25(水) 17:38:16.92
>>924 ダメ押しわろた
しかし、peeってw 分かった上であえて、peeなんだろうな。き、汚過ぎるわ
slとかtacみたいな、ひねりの効いたネーミングにはならなかったのかな
929名無しさん@お腹いっぱい。:2014/06/25(水) 18:42:08.63
>>919 いや、bash で backtick は、初心者か、
最近まで商用 UNIX さわってて、そのままの人とかじゃないですか?
ある程度、O'Reilly とか本を読んだり、ネットで知識を漁ったりすれば、backtick は無いはず。

ちょっと、検索しておいたのを、挙げておきます。
1. Classic Shell Scripting: Hidden Commands that Unlock the Power of Unix
http://books.google.co.jp/books?id=J9WbAgAAQBAJ
p156 $(...) を指して、
This style is recommended for all new development,and it is what we use in many of the examples in this book.
930名無しさん@お腹いっぱい。:2014/06/25(水) 18:43:19.31
2. Learning the Korn Shell, 2nd Edition
http://oreilly.com/catalog/korn2/chapter/ch04.html
The syntax of command substitution is:
$(Unix command)
...
(For backwards compatibility, the Korn shell supports the original Bourne shell (and C shell)
command substituion notation using backquotes: `…`. However, it is considerably harder to
use than $(…), since quoting and nested command substitutions require careful escaping.
We don't use the backquotes in any of the programs in this book.)
931名無しさん@お腹いっぱい。:2014/06/25(水) 19:00:58.91
>>927
バッククオートならどのシェルでも使えるからだよ
bash専用だから$()使ってもいい、という考えは別に否定しない
932名無しさん@お腹いっぱい。:2014/06/25(水) 19:05:59.07
見栄え重視。
入れ子にするなら$( )のほうが綺麗になるが、単発ならバッククォートのほうが見やすく思える
933名無しさん@お腹いっぱい。:2014/06/25(水) 20:02:42.64
>>931 >>932 ありがとう。
議論はしたくないので、お礼だけ。
934名無しさん@お腹いっぱい。:2014/06/25(水) 21:09:05.97
昔からやってる人間なら 新しい記法は知ってるけど慣れで昔のままってだけだよね
議論したくないとか言って古い人間の習慣をただdisってるだけだな
935名無しさん@お腹いっぱい。:2014/06/25(水) 22:37:49.34
人様に見せるコードなら着飾るけど
ワンショットの使い捨てなんてのは
各々書きやすいように書けばいいと思う
936名無しさん@お腹いっぱい。:2014/06/25(水) 22:56:49.49
逃げられたな。
937名無しさん@お腹いっぱい。:2014/06/25(水) 23:07:46.42
>>934 ありがとう。古い人間の習慣か。
バッククォートは一般的に、使わない様にしたい古いやり方だとは思うけど、参考を紹介する位。
議論しても平行線だろうし、人それぞれだなあと思ったよ。
それに、このスレはバッククォートがデフォだし。

>>936 けんか腰だな。
938名無しさん@お腹いっぱい。:2014/06/25(水) 23:12:47.46
逃げられたな。(170cm 60kg) <- 言いそう
逃げられたな。(190cm 90kg) <- 言わなそう
939名無しさん@お腹いっぱい。:2014/06/25(水) 23:15:15.27
逃げられたな。(178-75-32)
940名無しさん@お腹いっぱい。:2014/06/25(水) 23:26:54.42
>>939
誰だよw

逃げられたな。(163*90*53)
941909:2014/06/25(水) 23:32:22.49
>>910
{if($0-p!=1){print NR,p,$0}
p=$0}
なら分かりやすかった? >>909の;はif文そのものを終わらせている
上記()の後の{}は中身が単文なので必須ではない
もし続けるならawkスレで
942名無しさん@お腹いっぱい。:2014/06/25(水) 23:51:38.16
>>935 使い捨ての話してどうする
943名無しさん@お腹いっぱい。:2014/06/26(木) 00:07:16.26
>>941
おおわざわざ解説ありがとう
やっぱシンプルかつ欲しい情報が的確に手に入る感じで好きだなこれ
944名無しさん@お腹いっぱい。:2014/06/26(木) 00:12:19.21
>>942
その点が明示されてないから好きにやれよとね
945名無しさん@お腹いっぱい。:2014/06/26(木) 00:14:13.89
その点てのはなんちゃら性とかいういわば目的ね
946名無しさん@お腹いっぱい。:2014/06/26(木) 01:03:51.25
決定版は >>909 だけど、性懲りもなく moremore pee でやってみる
とは言え、頭に D(uplicate)、S(kip)を付けただけだけど

$ cat a.txt | pee \
"uniq -d | sed -r 's/.+/D &/'" \
'uniq | awk '\''NR!=$1{list="S";for(i=NR;i<$1;i++){list = list " " i};print list;NR=$1++}'\'''
947名無しさん@お腹いっぱい。:2014/06/26(木) 02:16:29.93
しかしawkが思った以上に優秀だな
>>854といい>>909といい、フィールド抽出だけにしか使ってなかったawkがこうまで活躍するとは思わなんだ
948名無しさん@お腹いっぱい。:2014/06/26(木) 02:25:28.73
せ、sedだってチューリング完全だし、数字の計算くらいかけるはずだよ……
949名無しさん@お腹いっぱい。
awkすごいな あこがれちゃうな