シェルスクリプト総合 その25at UNIX
シェルスクリプト総合 その25 - 暇つぶし2ch471:名無しさん@お腹いっぱい。
16/02/08 10:49:58.88 .net
新聞社の方でしょう

472:名無しさん@お腹いっぱい。
16/02/08 12:25:26.78 .net
綺麗な見た目に気を遣って作られたプロポーショナルフォントだと全く気にならない
幅が広けりゃいいんでしょ的なやっつけフォントや固定幅フォントを使って表示してると
バランスが悪いのでそうなる

473:名無しさん@お腹いっぱい。
16/02/08 12:34:34.64 .net
>>460
裸の王様だからかな

474:名無しさん@お腹いっぱい。
16/02/08 13:02:09.16 .net
shebang 行は、種類を名乗るといえば名乗っているけれど、
実際には、実行するコマンドラインを指定するもの

以下、補足
例えばこのスクリプトで試すと
$ cat ~/src/test/script
#!../bin/echo "hoge"
'fuga'
$ pwd
/usr
$ ~/src/test/script 'arg 1' "arg 2"
"hoge" /home/anonymous/src/test/script arg 1 arg 2
上では、結果的に
相対パス/echo "hoge" 引数0 引数1 引数2
が実行された結果が印字されている
普通に #!/bin/sh なスクリプトだと、結果的に実行されるのは次
/bin/sh path/to/スクリプト名 引数1 引数2 ...

475:名無しさん@お腹いっぱい。
16/02/08 13:23:29.92 .net
>>465
shebangが種類を名乗るって何のこと?
そのスクリプトを処理するインタプリタを(引数込みで)指定する
以外の説明みたことないけど

476:名無しさん@お腹いっぱい。
16/02/08 15:38:21.12 .net
>>466
>>449 !/usr/bin/shと書いてシェルスクリプトを名乗るのか。
>>451 スクリプトの種類を名乗る
>>465 shebang 行は、種類を名乗るといえば名乗っているけれど、

477:名無しさん@お腹いっぱい。
16/02/08 17:11:40.36 .net
オプションも渡せるよ。
#!/usr/bin/bash -x
とかね。

478:名無しさん@お腹いっぱい。
16/02/08 20:55:16.08 .net
>>468
それなら俺もお前も大体の奴が知ってる。

479:名無しさん@お腹いっぱい。
16/02/08 23:06:27.57 .net
一個だけしか渡せないのは意外と知られていない

480:名無しさん@お腹いっぱい。
16/02/09 00:18:04.86 .net
変数に含まれる記号で質問です。
curlで、サーバに置いてあるファイルを削除したいのですが、
curl -Q "DELE a.txt" host.sample.com
curl -Q 'DELE a.txt' host.sample.com
これだと動きました。
スクリプトで回したいときなどで変数に格納した場合で、
string="-Q 'DELE a.txt'"
curl ${string} host.sample.com
これだと、-Q以降の「 ”~~~” 」で囲われた引数が伝わらないようで、動きませんでした。
> DELE
< 501 Invalid number of arguments
と返答がありました。
「"」そのものや「'」を変数で伝えるのは、一般的にどのように記述すればよいでしょうか。
記号で検索しても、なかなか情報が出ず、ヒントをお願いできればと思います。

481:名無しさん@お腹いっぱい。
16/02/09 02:34:23.06 .net
>>471
curl "-Q 'DELE a.txt'" host.sample.com
ってことじゃん。
コマンドオブションが引数扱いってわけですね。

482:名無しさん@お腹いっぱい。
16/02/09 06:18:16.59 .net
string="-Q 'DELE a.txt'"
eval curl ${string} host.sample.com
あるいは
set x -Q 'DELE a.txt'
shift
curl "$@" host.sample.com

483:名無しさん@お腹いっぱい。
16/02/09 06:31:19.45 .net
書いている内に、別の解答が...しかも set x; shift の方が良い
とりあえず貼っておく
eval を使う
展開されたくない所は、何も考えずにシングルクォートしておく
$ set -vx #とりあえずデバッグ用に
$ opt471="-Q 'DELE a.txt'"
$ sh -c 'for arg; do echo "$arg"; done' parseArgs ${opt471} #質問時の状態
$ eval 'sh -c '\''for arg; do echo "$arg"; done'\'' parseArgs '${opt471}
set も使う
$ eval set -- ${opt471}
$ sh -c 'for arg; do echo "$arg"; done' parseArgs "$@"
bash の配列を使っても良い
$ opt471=(-Q 'DELE a.txt')
$ bash -c 'for arg; do echo "$arg"; done' parseArgs "${opt471[@]}"

484:名無しさん@お腹いっぱい。
16/02/09 12:13:30.71 .net
とりあえず set -- も POSIX なんだけど
autoconf では set x ...; shift をすすめている

少し訂正
eval の際のクォートが抜けていた。連続した空白等で違いが出る
sh -c だと見難いので、function で書きなおした
$ parseArgs () { i=0; for arg; do echo "arg[$((i+=1))]: $arg"; done; }
$ opt471="-Q 'DELE (spaces) a.txt'"
$ eval parseArgs "${opt471}"
$ eval set -- "${opt471}"
$ parseArgs "$@"

ついでにIFS を使うもの
$ LF='
'
$ opt471='
-Q
DELE a.txt
'
$ IFS=$LF; parseArgs $opt471 'another option' 'more...'

485:名無しさん@お腹いっぱい。
16/02/09 17:36:27.79 .net
>>471です。
>>472-475
たくさんの方法を、ありがとうございます!
のちほど実験してみます。

486:名無しさん@お腹いっぱい。
16/02/09 19:11:23.15 .net
スクリプトの外部からやって来た文字列をエバると危険

487:名無しさん@お腹いっぱい。
16/02/09 20:55:40.83 .net
個人的には、host.sample.comにコマンドを渡す
curl -Q "$*" host.sample.com
を関数かスクリプトにするかなぁ
単独でも使えそうだし

488:名無しさん@お腹いっぱい。
16/02/09 23:45:01.02 .net
ごちゃごちゃ書いてしまったので、まとめてみる
結局の所
変数からクォートを考慮して単語分割するには、eval を使う
配列(もどき)に入れるには set か val=(...) もしくは改行区切り等
eval 無しだと、sed perl ruby 辺りで自力で単語分割
簡単なものなら xargs も使えるか

489:名無しさん@お腹いっぱい。
16/02/11 07:29:09.80 .net
午前1時に
cu -l /dev/ugen0.2 > 160211.log
のコマンドを開始し、
23時間後の午前0時に停止する、というシェルスクリプトを作りたいと思っています。
ログファイルの名前は午前1時の時点の日付が入ります。
ここで質問なのですが、
指定した時刻でコマンド(cu)の起動、停止をするにはどうすれば良いのでしょうか?
OS:FreeBSD10.2-RELEASE
シェル:sh
です。

490:名無しさん@お腹いっぱい。
16/02/11 09:25:45.48 .net
>>480
cronやat

491:名無しさん@お腹いっぱい。
16/02/11 13:08:07.53 .net
>>481
ありがとうございます!!
これで幸せになれます!!

492:480
16/02/12 08:51:56.08 .net
シェルスクリプトでcuのプロセスをkillしようとしたがうまくいかなんだ・・・。
結局、
・起動はcron
・cuからminicomに変更
・minicomのソフト改造
  ・ログファイルを設定なしで保存するように改造
  ・時間を見て終了するように改造
  ・タイムスタンプを設定なしでつけるように改造
で落ち着きそう。
うーんせっかくの有休だが、午前中はFreeBSDになりそうだ。

493:名無しさん@お腹いっぱい。
16/02/12 09:40:24.87 .net
意味がわかんないけど普通にコマンドラインからkillしてもkillできないの?

494:名無しさん@お腹いっぱい。
16/02/12 09:42:07.41 .net
cuはSIGHUPで殺すんじゃ無かったかな
うろ覚えだけど

495:名無しさん@お腹いっぱい。
16/02/12 10:21:20.12 .net
cuを起動/停止するスクリプトを書いて
それをcronから呼び出したらどうかな
起動する時はrun_cu start、停止する時はrun_cu stopみたいな形で
で、起動する時に
cu -l /dev/ugen0.2 > 160211.log &
echo $! > /var/run/lock/run_cu.lock
とやっておいて、停止するときは
kill -HUP $(cat /var/run/lock/run_cu.lock)
みたいにすれば(要するに/etc/init.dにあるデーモンの起動スクリプトみたいな感じ)

496:名無しさん@お腹いっぱい。
16/02/12 11:56:41.13 .net
いまいちよくわからん
スクリプトでプロセスIDが調べられないとかじゃないよね?
あとユーザが違っててrootのプロセスkillしようとしてるとか?

497:名無しさん@お腹いっぱい。
16/02/12 13:36:32.98 .net
cuは送信プロセスと受信プロセスがいるから完全に殺せてないのでは

498:480
16/02/12 20:39:39.88 .net
先ほど完了しました。
minicomの改造と、ログファイルの処理ソフト作るのに丸一日かかった。
1日vi使ってたから2chに書き込むのもj,k,l,hでカーソル移動したくなる。
>>484>>487>>488
うん・・・。できたり、できなかったり。
なんかcu -l /dev/ttyU0 > /unko/tinko/manko/log.txtを実行して、
ps ax | grep cu | grep -v grep
で、2つ出てきたり、出てこなかったり。
で、2つ出る場合には片方をkillしようとするとそんなプロセスないとか言われたり。
なんかもう、良く分からなくて投げ出しました。
>>485
SIGHUP知りませんでした。
minicomのソースの終了処理の中に
SIGHUPなんちゃらと書いてあったので、多分それが正解ですね。
いやぁ、SIGHUPで四苦八苦しました。
>>486
それスマートですね。私が作ったやつよりもw
ただ、まぁ、minicom使ったことでタイムスタンプ入れれたので、良しとします。

499:480
16/02/12 20:42:48.13 .net
ちなみに何を作っていたかというと、温度計測システムです。
Xbeeってやつに温度センサーをつないで、無線で親機のXbeeに飛ばして、
親機からPCにシリアルで温度センサーの値を送信するシステムです。
で、ログファイルをsambaにおいておいて、別のPCから見る感じです。
テスト用に温度センサーは1個ですが、部屋中に設置する予定です。

500:名無しさん@お腹いっぱい。
16/02/13 00:30:17.31 .net
viを使っている人はシェルのキーバインドもvi風?

501:名無しさん@お腹いっぱい。
16/02/13 02:17:17.74 .net
>>489
pkillでできなかったの?

502:名無しさん@お腹いっぱい。
16/02/13 02:27:10.99 .net
ちなみに自分は絶対止めたいときは複数回killする
やり方はループするなりsleepで間隔あけたりまちまちだけど
以下cuのマニュアルだけど仕様を理解するって大事だね
> リ モートシステムとの間でコネクションが設定された場合、 cu
> は 2 プロセスを fork します。1 プロセスは、ポートからの デ
> ー タ読みだしと端末へのデータ書き込みを行ない、もう 1 プロ
> セスは、端末からのデータ読み出しとポートへのデータ書き込み
> を受け持ちます。

503:名無しさん@お腹いっぱい。
16/02/13 21:20:59.35 .net
bashで調べてもわからないので質問させてください。
次のような記述のとき、
この%はどのように解釈したらいいのでしょうか?
 OLDPATH=(../help/me)
 NEWPATH = $(OLDPATH:../%=./%_fuga)
文字列置換に使う場合と違うようですし、
調べても文字列置換以外に定義がでてきませんでした。
よろしくお願いします。

504:名無しさん@お腹いっぱい。
16/02/13 22:07:33.70 .net
>>494
[user@f23 ~]$ OLDPATH=(../help/me)
[user@f23 ~]$ NEWPATH = $(OLDPATH:../%=./%_fuga)
bash: OLDPATH:../%=./%_fuga: そのようなファイルやディレクトリはありません
bash: NEWPATH: コマンドが見つかりませんでした...

505:名無しさん@お腹いっぱい。
16/02/13 22:26:10.26 .net
URLリンク(linuxjm.osdn.jp)
より
${parameter%word}
${parameter%%word}
パターンに後方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。
このパターンが parameter を展開した値の末尾の部分とマッチする場合、展開結果は parameter を展開した値から
最短一致パターン (``%'' の場合) または最長一致パターン (``%%'' の場合) を取り除いたものになります。 parameter
が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして
得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全て
の要素に順番に適用され、 展開結果はリストとして得られます。

$()じゃなくて${}だんべな。
私は良くわかんない。後は詳しい人にまかせた。

506:名無しさん@お腹いっぱい。
16/02/13 22:38:34.46 .net
>>495
なんでOLDPATH=の閉じカッコを半角に、そこだけ改変しちゃったの?

507:名無しさん@お腹いっぱい。
16/02/14 00:07:40.09 .net
>>494
どこでそういう記述を見つけたのかな

508:名無しさん@お腹いっぱい。
16/02/14 04:49:47.49 .net
仕事で改修やってるんだろ

509:名無しさん@お腹いっぱい。
16/02/14 06:05:22.06 .net
どのように解釈したらいいも何も、NEWPATH の次にスペースが有る時点でおかしい
例示を見直して提示し直さない限り、どうにもならんな

510:名無しさん@お腹いっぱい。
16/02/14 08:13:57.65 .net
なんの脈絡もない質問に答える義理はない
金払って仕事してもらえ

511:名無しさん@お腹いっぱい。
16/02/14 09:11:58.95 .net
OLDPATH:../%=./%_fuga
という相対パスで指定されたファイルを実行し、その結果の前に=をおいてNEWPATHというコマンドを実行する

512:名無しさん@お腹いっぱい。
16/02/14 14:58:59.31 .net
>>494
Makefile 全体とは言わんがもっと前後貼れよ

513:名無しさん@お腹いっぱい。
16/02/15 05:51:37.58 .net
>>494 >>503
ここを釣り堀にする奴がいるとは思わなかったwww
そういえば Makefile を書いている時は似てるなあって思ったな

514:503
16/02/17 23:08:47.15 .net
>>494 は結局返事なしか。
釣りだったってことかな。 イコールの前後に空白いれたり入れなかったりだったし。
一応 make/Makefile での動作例。
$ cat Makefile
OLDPATH = ( ../datadir1 ../datadir2 )
NEWPATH = $(OLDPATH:../%=../%_fuga)
all:
@echo "$(NEWPATH)"
$ make
( ../datadir1_fuga ../datadir2_fuga )
%の使い方は
URLリンク(quruli.ivory.ne.jp)
の 6.3.1節を参照しました。

515:名無しさん@お腹いっぱい。
16/02/23 08:45:41.83 .net
BASH4.2 $> echo $((1 == 2))
0 #!!!
BASH4.2 $> echo $((1 != 2))
1 #!!!
BASH4.2 $> a=0
BASH4.2 $> echo $a
0
BASH4.2 $> echo $((a++))
0 #?
BASH4.2 $> echo $((a++))
1
BASH4.2 $> echo $((a++))
2
BASH4.2 $> echo $((a++))
3
BASH4.2 $> echo $((a--))
4 #!!!!
BASH4.2 $> echo $((a--))
3

516:名無しさん@お腹いっぱい。
16/02/23 10:11:09.22 .net
不思議なことは何も起きていないな
シェルスクリプトの真偽値の表現と後置演算子の意味くらい覚えておけ

517:名無しさん@お腹いっぱい。
16/02/24 08:11:13.70 .net
$a=0; echo $((a++))
0
$ a=0; echo $((++a))
1

518:名無しさん@お腹いっぱい。
16/02/24 16:41:23.49 .net
なんら不思議でない

519:名無しさん@お腹いっぱい。
16/02/25 07:06:49.38 .net
$ a=0; echo $(( ´∀`))
( ´∀`): コマンドが見つかりません

520:名無しさん@お腹いっぱい。
16/02/26 20:53:20.57 .net
かわええ

521:名無しさん@お腹いっぱい。
16/02/26 22:13:00.20 .net
うまくクオーテーション回避したね

522:名無しさん@お腹いっぱい。
16/02/26 22:23:19.78 .net
$ a=0; echo $((a++++++a))
2

523:名無しさん@お腹いっぱい。
16/02/26 22:30:46.28 .net
$ a=0; echo $((a+ +++++a))
1
$ a=0; echo $((a+++++ +a))
1
$ a=0; echo $((a+ ++++ +a))
0

524:名無しさん@お腹いっぱい。
16/02/27 19:01:27.83 .net
こういう解釈かな?
$ bash -c 'a=0; echo $(( ( a++ ) + +( ++a ) ))'
2
シェルによって解釈が色々みたいだけど
$ ksh -c 'a=0; echo $((a++++++a))'
k


525:sh: a++++++a: assignment requires lvalue $ dash -c 'a=0; echo $((a++++++a))' 0



526:名無しさん@お腹いっぱい。
16/02/29 18:15:35.93 .net
ここにいる人たちは誰かのシェルスクリプト見て
普通のプログラミング言語のようにループして処理してたら
ぷっって笑っちゃう方?

527:名無しさん@お腹いっぱい。
16/02/29 18:57:25.92 .net
え? ループ処理しちゃ駄目なの?

528:名無しさん@お腹いっぱい。
16/02/29 19:53:29.46 .net
>>516 が言う「ループ」とは変数のインクリメント((++i))とかのことかと。

529:名無しさん@お腹いっぱい。
16/02/29 20:08:57.21 .net
>>516
コマンドの内部でループしているのと、スクリプトのループとは速度が違うし
また記述も単純になるから、自然とそうなるだけだし
スクリプトで人を笑ったりとかはしないかな

530:名無しさん@お腹いっぱい。
16/02/29 20:36:41.53 .net
どんなループだよ

531:名無しさん@お腹いっぱい。
16/03/01 12:43:43.79 .net
それより i=`expr $i + 1`が笑われないか心配。普通だよね(´・ω・`)

532:名無しさん@お腹いっぱい。
16/03/01 12:55:47.44 .net
[ "z$1" = "ztest" ]
とかも笑われてるの?

533:名無しさん@お腹いっぱい。
16/03/01 13:57:23.36 .net
話の流れが読めなかった >>519 が笑われてる

534:名無しさん@お腹いっぱい。
16/03/01 20:21:04.65 .net
>>522
じゃ、どう書くと笑われないと思うんだ?
でも、最近はcaseで比較する事が多い。個人的に。

535:名無しさん@お腹いっぱい。
16/03/02 00:02:25.01 .net
>>521
URLリンク(www.shellcheck.net)
SC2006 Use $(..) instead of legacy `..`.
SC2003 expr is antiquated. Consider rewriting this using $((..)), ${} or [[ ]].
SC2086 Double quote to prevent globbing and word splitting.

536:名無しさん@お腹いっぱい。
16/03/25 00:25:36.80 .net
bash上でwhich sourceってコマンド打った時にsourceコマンドが見つからないって怒られるのが謎だったんですが、sourceコマンドはbashの組み込み関数だと聞きました。
ただdeclare -Fでもsourceって関数は定義されてないようなんですがどこで定義されているかわかりますか?

537:名無しさん@お腹いっぱい。
16/03/25 01:32:44.95 .net
>>526
man source

538:名無しさん@お腹いっぱい。
16/03/25 01:59:04.54 .net
>>526
type source

539:名無しさん@お腹いっぱい。
16/03/25 02:11:33.46 .net
$ type source
source is a shell builtin
$ help source
source: source filename [arguments]
 Execute commands from a file in the current shell.
定義はソースコードの bash-4.3/builtins/source.def にある
source_builtin 関数

540:名無しさん@お腹いっぱい。
16/03/25 05:01:14.68 .net
>>527-529
ありがとうございます!
ばっちりです!

541:名無しさん@お腹いっぱい。
16/04/02 18:56:42.48 .net
>>521
ただ、そういう硬い書き方してる人のスクリプトは、bashの脆弱性が見つかった時でも
/bin/bash を /bin/ksh とかで代用できるからなんともいえん。
少なくとも i++ よりはポータブルだし

542:名無しさん@お腹いっぱい。
16/04/08 08:53:02.48 .net
>>521
ほんの数年前までそれ以外の書き方をすると怒り出す、
純正シェルジジイが粘着してたんだが、リアル墓場行ったかな。喜ばしい事だ

543:名無しさん@お腹いっぱい。
16/04/09 20:08:53.43 .net
我がスレ差分メール配送システムが2ヶ月くらい止まってたかのように
見えたのは、2ch鯖が変わっていたせいであったかw
今頃きづいたという。。。

544:名無しさん@お腹いっぱい。
16/04/12 18:45:07.55 .net
初心者です。
こんどbashをやることになったのですが、シェルスクリプトの書いて覚える系のいい書籍はないでしょうか?
馬鹿なので読んだだけでは理解できないので手を動かすタイプのを教えてください。

545:名無しさん@お腹いっぱい。
16/04/12 19:26:46.24 .net
>>534
シェルプログラミング実用テクニック

546:名無しさん@お腹いっぱい。
16/04/12 20:11:06.76 .net
よろしくお�


547:ヒがいします。シェル初心者です。わかんないので、 いろんなサイトに書き込みしても いろいろ うるさく 叱られます。これがユニックスの流儀なんでしょうか? とくに言われることは「スクリプトに直接関係ないこと」は書き込むな、と言うことです。 「何でも教えてくれや」「ケチケチすんなよ」「初心者には親切にせろ」 ひとことで言うと これがおれの主張です。シンプルです。 なんで?現実生活でヘイコラしてるのに、ネット上まで、ネコかぶったり しないといけないのか?とんと理解できません。 何より、バッシュとかGシェルとか、詳しいのが、なんでエライのか? ここが根本的にわからん。 少し誇張した部分もありますが、素直な気持ちを書きました。



548:名無しさん@お腹いっぱい。
16/04/12 20:22:51.31 .net
>>535
ありがとうございます。明日立ち読みしてみます。
>>536
あなたより大きい会社にいると思います。30前にして年収800万です。
ずっとWindowsだったのでわからないんですよね。

549:名無しさん@お腹いっぱい。
16/04/12 20:25:20.93 .net
>>536
得意分野などで教える立場になった時、同じこと思うだろうか。

550:名無しさん@お腹いっぱい。
16/04/12 20:38:02.87 .net
今の大きい会社って30前でもそんなモンなの?
小さい会社だと1000越えてるのにね。

551:名無しさん@お腹いっぱい。
16/04/12 22:24:19.26 .net
>>536
おまえ Limux Mint 公式フォーラムでアラシ認定されたやつじゃね?

552:名無しさん@お腹いっぱい。
16/04/13 01:49:11.16 .net
>>539
正社員なら800でもマシな方
なんせ上が詰まっててなかなか上がらないし
でもフリーや少数精鋭のとこなら1000は余裕で行く

553:名無しさん@お腹いっぱい。
16/04/14 09:18:08.49 .net
うちはもう1000万じゃなくなったよ

554:名無しさん@お腹いっぱい。
16/04/14 22:19:32.09 .net
>>534
サンプルコードがあるような本でも分からないなら、シェルスクリプトはやめた方がいい。

555:名無しさん@お腹いっぱい。
16/04/14 22:21:13.69 .net
>>534
「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」を読みなさい。

556:名無しさん@お腹いっぱい。
16/04/15 08:51:58.72 .net
ネタだろうけど、あんまり古過ぎる本勧めてやるな。

557:名無しさん@お腹いっぱい。
16/04/15 11:45:17.59 .net
>>545
そもそもシェルスクリプト自体が変わっていないが?

558:名無しさん@お腹いっぱい。
16/04/15 21:13:21.13 .net
だよね。
さすがに絶版だったらおいおいと思うが。

559:名無しさん@お腹いっぱい。
16/04/16 00:27:13.14 .net
>>532
と言ってたら、bashの脆弱性が見つかったのは数年前だね

560:名無しさん@お腹いっぱい。
16/04/16 05:01:00.01 .net
明日は我が身だが、2つの変数が両方とも空だった確率が0%じゃなければ、事故が起きてしまうな。
この場合は、どう書けばよかったの?
URLリンク(business.newsln.jp)
レンタルサーバー業者で、従業員のミスによりサーバー上の全データが削除されるという
あり得ない事態が生じたことが14日、英大手紙「Independent」の報道で明らかとなった。
このレンタルサーバー業者では、削除してしまったデータを復元するために、大手QAサイトのserverfaultに
「Recovering from a rm -rf /(rm -rf /から復元する方法を教えてください)」とする書き込みをすることで、
問題の解決方法を模索しているが「バックアップがない限り、復元は難しい」といった回答も寄せられている。
QAサイトのserverfaultでは、日ごろ、初心者からの質問から、かなりの高度な質問まで、様々な質問が寄せられるとただちに、
最適な回答が付く状態が続いているが、さすがのserverfaultの熟練回答者であっても
会社の全データを「rm -rf /」で削除した後にどのような有効な復元策を講じることができるのかは、回答に詰まる状況となっている。
このミスをしてしまったレンタルサーバー業者の管理人となるMarco Marsalaによると、
プログラム中で、「rm -rf {foo}/{bar} 」と指定することで全サーバーを対象に、特定のディレクトリーのファイルだけを削除するスクリプトを動かしたところ、
このプログラムのバグにより、特定のディレクトリーだけでなく、全てのディレクトリーが強制削除の対象になってしまったと説明している。
また、バックアップを事前に取っていなかったのかという質問については、
もちろんバックアップは取得していたが、この全削除のプログラムによりバックアップファイルも削除の対象となってしまったと述べている。
このレンタルサーバー業者は、1535のカスタマーを抱えているが、この事故の発生により、これら全てのカスタマーのファイルが無くなってしまった。

561:名無しさん@お腹いっぱい。
16/04/16 09:24:48.15 .net
だから/は変数の中に入れておけとあれだけ

562:名無しさん@お腹いっぱい。
16/04/16 10:06:55.21 .net
>>550
そういう問題ではない。

563:名無しさん@お腹いっぱい。
16/04/16 10:35:23.38 .net
>>551
だったらどういう問題?

564:名無しさん@お腹いっぱい。
16/04/16 10:51:02.13 .net
>>552
なんでテストしてないの?

565:名無しさん@お腹いっぱい。
16/04/16 11:15:01.02 .net
バグがあっても大丈夫な設計を心がけろという話なのに
なんでテストしていないという話になる?頭大丈夫か?

566:名無しさん@お腹いっぱい。
16/04/16 11:25:08.28 .net
あまりにアレで何か別のことを隠すためのうんたらかんたらを妄想してしまう記事だな

567:名無しさん@お腹いっぱい。
16/04/16 13:52:26.18 .net
>>554
設計があって、テストをしないのはありえません。

568:名無しさん@お腹いっぱい。
16/04/16 13:56:59.02 .net
>>554
だいたいそれは設計じゃないだろ。
ただのコーディングミスを防げために、コーディングミス用のロジックを書くのは阿呆すぎる。

569:名無しさん@お腹いっぱい。
16/04/16 14:43:59.32 .net
>>557
フェイルセーフとフールプルーフの違いを学べよ

570:名無しさん@お腹いっぱい。
16/04/16 15:25:19.31 .net
>>558
いかにもインフラの人間がいいそうなことだが、キミは開発側ではありえない助言をしている。

571:名無しさん@お腹いっぱい。
16/04/16 15:27:25.43 .net
検証もしないで、ぶっつけ本番でそういう構成になっているから大丈夫という考え方はインフラでもありえない。

572:名無しさん@お腹いっぱい。
16/04/16 15:28:05.09 .net
そもそも操作ミスではないじゃん。

573:名無しさん@お腹いっぱい。
16/04/16 16:30:24.50 .net
バックアップは特定の権限でしか消せないとか、削除可能な範囲を絞るとか
万が一のためインフラ側で制限しないとダメなんだよ
それでもダメなときはダメだし
設計・テストとかプログラムのみでの対応はコストだけが跳ね上がるし現実的ではない
ジョブ管理システムやコンパイラのバグが絡んでくるともうお手上げになる

574:名無しさん@お腹いっぱい。
16/04/16 18:08:55.67 .net
シェルスクリプトなのにコンパイラのバグ?

575:名無しさん@お腹いっぱい。
16/04/16 19:49:59.88 .net
例で示しただけだから別にインタプリタでもなんでもいいよ

576:名無しさん@お腹いっぱい。
16/04/17 01:23:14.24 .net
バグに絡まれやすそうな奴だな

577:名無しさん@お腹いっぱい。
16/04/17 07:15:51.53 .net
>>549
rm -rfはシェル関数で。直接使う事は禁則。
rmしないでmv。定期的に掃除

578:名無しさん@お腹いっぱい。
16/04/18 20:09:07.34 .net
>>549
URLリンク(japanese.engadget.com)

579:名無しさん@お腹いっぱい。
16/04/18 20:24:48.32 .net
ひでーw
__
タヒんでしまえよ

580:名無しさん@お腹いっぱい。
16/04/18 22:44:34.25 .net
シェルショッカーとかいうおじさんおるよな

581:名無しさん@お腹いっぱい。
16/04/25 19:04:26.09 .net
bashで、新しいscreenウィンドウを開いてそこで引数で指定したコマンドを実行する関数
を作りたいのですが、引数の展開をどうやればいいかで悩んでいます。
# 例:sc tail -f ./hoge.log
sc() {
# "cd $PWD; $@"ではダメだった
screen -t "$1" -X screen bash -c "cd $PWD; '$1' '$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'"
}
10個以上の引数に対応するにはどう書くのがいいでしょうか?

582:名無しさん@お腹いっぱい。
16/04/25 21:45:04.21 .net
>>570
"cd $PWD; $@" だと screen のコマンド全体が、
"screen" "-t" "$1" "-X" "screen" "bash" "-c" "cd $PWD; $1" "$2" ...
という引数に展開される。
これは "cd $PWD; $@" がまず、"cd $PWD; ""$@" に変換され、
"$@" が "$1" "$2" ... に展開されて
"cd $PWD; ""$1" が連結されて "cd $PWD; $1" になるため。
なお set - "$@" cd "$PWD" ";" "$@" したら、 screen に渡るのは ; までで肝心のコマンドは渡らない。
"cd $PWD; $*" だと "cd $PWD; $1 $2 $3 ..." (配列としては展開されずに1つの文字列扱いになる)
に展開されて意図した動きになる。 ただ、引数に空白が入る場合はエスケープ入れないとNGね。

583:570
16/04/26 19:09:31.05 .net
空白のエスケープはどうやればいいんでしょう?

584:名無しさん@お腹いっぱい。
16/04/26 19:43:17.56 .net
>>572
シングルクォートと空白の例。
sc() {
  screen -t "$1" -X screen bash -c "cd $PWD; $*"
}
sc date +Date=\\\'%y\\\ %m/%d

585:名無しさん@お腹いっぱい。
16/04/27 12:24:16.19 .net
...なんだかなあ
与えたスクリプトの中で、展開すれば?
sh -c 'some command; "$@"' 'dummy' "$@"

sc() {
  screen -t "$1" -X screen bash -c 'cd $PWD; "$@"' 'dummy' "$@"
}

586:570
16/04/27 19:13:45.99 .net
なるほど、dummy 以降が -c で与えたコマンドへの引数になることを利用するわけですね。
ちなみに
screen -t "$1" -X screen bash
は冗長で
screen -t "$1" bash
でいいみたいでした。

587:名無しさん@お腹いっぱい。
16/04/27 21:07:51.80 .net
-c の次の次の引数からが $0 以降になるとは知らなかったなぁ。 勉強になったわ。
これは -c AAA BBB CCC DDD ... のとき、BBB 以降は実行されないけど BBB が $0 として、
CCC DDD ... が引数としてセットされた状態でプロセスが開始され、実際に実行される内容の
AAA 内に展開されずに渡された "$@" があるので CCC DDD ... が実行されるってことかな。
ちなみに cd の部分は 'cd "'"$PWD"'"; "$@"' の方がいいかな。
( パスに空白が入っていてもエラーにならないがダブルクォーテーションが入っていたらNGではあるが。 )

588:名無しさん@お腹いっぱい。
16/05/12 21:13:45.79 .net
コマンド応答が返ってくるまでの表示に文字を回転させてりしてみたくなった。
例えば、「*」がくるくると回っていたり・・・

589:名無しさん@お腹いっぱい。
16/05/13 00:30:46.45 .net
ええね

590:名無しさん@お腹いっぱい。
16/05/13 19:21:12.15 .net
>>577
難しい…どなたかヒントを

591:名無しさん@お腹いっぱい。
16/05/13 20:19:09.81 .net
>>579
なんだよ、すごい目算があって開発宣言したと期待してたのに
まず、文字回すのは無理
/|\-を同じ位置で順番に繰り返す出す程度
あと、コマンド実行中は通常シェルはwait状態で止まってしまうので
コマンドをバックグラウンドで起動してシェルを動かし続けるか
別プロセスを同時に起動してそいつに表示させる必要がある
どっちもコマンドラインで明示しなきゃならん
普通に起動して同じことをさせるにはシェルの改造くらいしか思いつかん
それともzshくらいになるとすごいモジュールがあったりするのだろうか

592:名無しさん@お腹いっぱい。
16/05/13 20:43:34.11 .net
OpenGLでぐりぐり回そうぜ

593:名無しさん@お腹いっぱい。
16/05/13 20:57:15.29 .net
bash 依存だけど、こんなんでどう
sleep 10 & {
tput civis
while kill -0 %- &>/dev/null
do
for c in {-,/,\|,\\}
do
printf '%c\r' $c
sleep 0.1
done
done
tput cvvis
}
途中で interrupt されるとカーソルが見えないままになるけど

594:名無しさん@お腹いっぱい。
16/05/14 20:15:01.86 .net
npm見れば解決しそう

595:534
16/05/21 22:04:30.88 .net
>>535
お陰さまで最低限現場の記述ルールに則ったものは普通に作れるようになりましたm(_ _)m

596:名無しさん@お腹いっぱい。
16/05/23 00:15:19.48 .net
>>559
超遅レスだかインフラでも
そんな事言わないあり得ない偏見すごいな
>>558
が伝えたいニュアンスは分かるけど
端的に考え方を言い表したいがために
登場場面が根本的に違う2つの用語だけで
端的に伝えようとするセンスが酷い
それにそもそも元の話と何かズレてるし
後輩育成とかは絶対に任せられないタイプ

597:名無しさん@お腹いっぱい。
16/05/23 08:05:15.40 .net
ログファイルのローテート処理のお勧め教えれ
元ファイルをコピーしてヌルを上書きすると
一瞬ログの内容ロストするから

598:名無しさん@お腹いっぱい。
16/05/23 08:55:28.11 .net
>>586
ログを出す側で制御 (SIGHUPとかで出力ログファイルを開きなおす) してくれないとその問題は防げない。
mkfifo で FIFO ファイル作ってログローテーション用後続スクリプトに一旦渡す方法やパイプで後続スクリプトに
渡してローテーションする方法も考えられるけど、FIFO のバッファがいっぱいになるとメインプロセス側が処理
待ち(write がブロック)したり、後続スクリプトの異常終了で SIGPIPE 食らってメインプロセスが死んだりする
のでお勧めできないそうな。

599:名無しさん@お腹いっぱい。
16/05/23 16:33:22.23 .net
syslogdを kill -STOP; ... ; kill -CONT じゃダメなん?

600:名無しさん@お腹いっぱい。
16/05/23 17:04:28.65 .net
logrotateでええやろ

601:587
16/05/23 23:22:16.85 .net
>>588
syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
なのでそれをやっても、リネームした古いファイルの方に書き続けてしまう。
例えば /var/log/messages に書き続けている状態でファイルを mv して messages.1 にしても、syslogdは
messages.1 の方に書き続ける。
kill -HUP するとファイルハンドルを閉じて /var/log/messages を開くので、ここでようやく messages 側に書き始めるわけ。
# STOP/CONT は意味がない。 logrotate では syslogd のログについては HUP しかしない。
>>589
logrotate の samba のログ設定には copytruncate って書いてあるでしょ?
つまり logrotate が >> 586 の言う「コピーしてファイルを空にする」処理をやっている。
samba は syslogd のような開きなおす処理をしてくれないからこの実装にせざるを得ない。

602:名無しさん@お腹いっぱい。
16/05/24 04:38:11.44 .net
>>590
kill -HUP に対応してないsyslogdだったら、という話だろ。
kill -STOP してからログファイルを別ファイルにcpして、元のログは > file でゼロにする。
それで -CONT すればいいという話。
>syslogd がつかんでいるのはファイルハンドルであってファイルのパスじゃない。
というのは当然知ってるだろ。

603:名無しさん@お腹いっぱい。
16/05/24 08:44:45.64 .net
スレ違いになりつつあるが、便乗して質問。
STOP -> truncate -> CONT って安全?
TCP/UDPで待ち受けしているプログラムで syn やメッセージ取りこぼしたりとかしない?
fork する奴にも使える?

604:名無しさん@お腹いっぱい。
16/05/24 09:37:37.23 .net
>>592
TCPなら再送含めてOSがうまくやる
UDPだとバッファあふれたら消える
もともと消えるの前提だから再送はアプリの自己責任
forkしたら止まるのは当たり前だが指定したプロセスだけ
プロセスグループを指定したら該当するやつ全部
どの辺が疑問なのかむしろ知りたいわ

605:592
16/05/24 20:11:40.98 .net
>>593
THX
> どの辺が疑問なのかむしろ知りたいわ
logrotate コマンドの copytruncate の欄に SIGSTOP すると良い、とは書かれていない
あたり、何か不都合があるんじゃないかと思うんだがどーよ?

606:名無しさん@お腹いっぱい。
16/05/24 22:53:24.96 .net
>>594
そいつとtcpもudpもforkも関係ないのになんで出てきた?

607:名無しさん@お腹いっぱい。
16/05/25 08:40:27.70 .net
tcp 再送は5分までいけるが、ロードバランサー/L7swの監視の場合にはファイルコピーしている
ちょっとした間にサービス停止として検知される可能性があるな。

608:名無しさん@お腹いっぱい。
16/05/25 15:06:05.26 .net
>>596
5分って、どこの標準か興味がある。

609:名無しさん@お腹いっぱい。
16/05/27 20:10:08.30 .net
>>586
普通は単純にリネームしてタッチする

610:名無しさん@お腹いっぱい。
16/05/28 12:10:25.23 .net
タッチして逮捕されたらリネームじゃないのか。

611:名無しさん@お腹いっぱい。
16/05/29 01:58:44.16 .net
つ 座布団

612:名無しさん@お腹いっぱい。
16/05/29 20:46:35.04 .net
ユニックスの入門本が一冊欲しいのですが何がいいでしょうか
特定のコマンドやシェルのノウハウとかではなく
多くの場面で通用する本当に基礎的な知識を学びたいと思っています
私自身はいずれシェルを書きたいと思っていますが
LS、CPコマンドなどの使い方を知りたいわけではないということです

613:名無しさん@お腹いっぱい。
16/05/29 20:57:27.92 .net
>>601
UNIXスーパーテキスト
ってまだ売ってたっけ?

614:名無しさん@お腹いっぱい。
16/05/29 21:40:46.70 .net
>>601
古い本だけど砂原秀樹さんほかの『プロフェショナルBSD』
UNIXのコマンドはこういうふうに使うという根本的なことの理解に役立つ

615:名無しさん@お腹いっぱい。
16/05/29 22:26:33.91 .net
スレチにも回答してあげるとは優しいやつばっかやな

616:名無しさん@お腹いっぱい。
16/05/29 23:19:55.20 .net
>>601
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
名著です。
これを挙げると古いとか文句を付ける馬鹿がいますが、無視してください。

617:名無しさん@お腹いっぱい。
16/05/29 23:20:36.49 .net
あげ

618:名無しさん@お腹いっぱい。
16/05/30 00:14:11.32 .net
>>604
お前の心が汚れているだけだ

619:名無しさん@お腹いっぱい。
16/05/30 03:08:51.89 .net
shell から emacs 起動して終了すると、
[1] Done emacs
って出るよな?これって何が出しているんだろう?出来れば止めたい。

620:名無しさん@お腹いっぱい。
16/05/30 04:52:05.02 .net
>>608
set +m しておくと出なくなるよ。(出してるのはシェル自身)

621:名無しさん@お腹いっぱい。
16/05/30 09:25:10.53 .net
vim7.4使ってますが、書き込み時、sh -n みたいな、構文・文法チェックを
する方法はないでしょうか?
vimプラグインのsyntasticも試してみたのですが、.vimrcの記述のせいか
うまく動いてないようで。
何か簡単でうまい方法ありましたら、ご紹介ください。

622:名無しさん@お腹いっぱい。
16/05/30 10:19:27.79 .net
>>609
どうもです。なるほどシェルが出しているのですか。
でも、なぜ emacs しか出ないのでしょう?
教えていただいた set +m 「ジョブ制御の無効」は bash のみでしょうか?
私は tcsh なのですが、tcsh でも同様の事は可能でしょうか?

623:名無しさん@お腹いっぱい。
16/05/30 18:00:07.40 .net
ひとつ質問
シェルで2つの日時を元に所要時間を求めたい場合ぐぐるといろいろ方法はありますが
これが便利なコマンド一発で用意されていないのは需要がないと言うか
需要があった人が最終的に誰でも使える簡単な形にせずに終わらせたってことなんでしょうか?

624:名無しさん@お腹いっぱい。
16/05/30 18:55:30.71 .net
>>612
広く使われるほどの需要はなかった

625:名無しさん@お腹いっぱい。
16/05/30 19:36:20.17 .net
dateコマンドのオプションに互換性がなかったから。
GNU date限定とかならいいんだけど

626:名無しさん@お腹いっぱい。
16/05/30 21:40:48.25 .net
内部的にUNIX時間で持てば差分計算は簡単なような

627:名無しさん@お腹いっぱい。
16/05/31 08:52:48.30 .net
>>615
32bitマシンが絶滅するまでは難しいな。
あと20年普通に残りそうだし

628:名無しさん@お腹いっぱい。
16/05/31 21:45:59.92 .net
内部的にUNIX時間で持つってどういうこと?
内部というのは環境変数やシェル変数という意味?

629:名無しさん@お腹いっぱい。
16/05/31 23:23:59.98 .net
256bit機が普及するまで32bit機はなくならないだろうね。

630:名無しさん@お腹いっぱい。
16/05/31 23:24:37.85 .net
>>617
epochからの時間ってことじゃない?
>>616
difftime(3)て32bitと64bitで違うのかな

631:超音波テロの被害者
16/06/01 16:02:45.59 .net
超音波テロの被害にあっています。
卑劣極まりない被害にあっています。
何が起こったかわからないときから、
わかってみれば、
まだ世の中に知られていない超音波テロ。
世の中の多数の振動源・発信源が
システム化され、 ネットワークを通して、
超音波・音波を集中させて
対象を攻撃するらしい。
超音波による物理的な力で、
ものが飛び、ものが壊れる。
それが人間の体に対してまで。
形のあるもの、ないもの、壊され、奪われ、
聞こえる声、音。超音波テロの加害者の声。
卑猥な内容、卑劣な内容、脅しやいたぶり。

632:超音波テロの被害者
16/06/01 16:03:08.53 .net
身体の表面を突き抜け、内臓を攻撃される。
頭蓋骨を突き抜け、意識を失わされる。
臓器不全やがん、命に関わることまで。
人間の身体を壊そうとする超音波テロ。
日本国中、どこにいても超音波で襲われる。
車に乗っている人間が襲われる。
歩いている人間が襲われる。
自宅で超音波の攻撃を受ける。
人や社会が超音波で襲われ、
罪もない人が超音波で襲われ、
卑劣な被害にあっています。
被害を訴えても信じてもらえない。
「見続けるのがいやだから、殺して終わる」、
「証拠隠滅だ」という超音波テロの加害者の声とともに
強烈な超音波の攻撃。
叫ばされ、いたぶられ、それを口実にまた攻撃され、
超音波テロの、残酷残虐で、卑劣な攻撃の被害にあっています。
心の底から被害を訴え、祈っています。
天に神に届きますように。

633:名無しさん@お腹いっぱい。
16/06/01 17:45:47.97 .net
>620
これなんつーシェルのスクリプトですか?

634:名無しさん@お腹いっぱい。
16/06/02 07:52:05.22 .net
/bin/jpsh

635:名無しさん@お腹いっぱい。
16/06/02 08:00:02.53 .net
/bin/chouonpa/itaburare

636:名無しさん@お腹いっぱい。
16/06/05 11:03:53.19 .net
ディレクトリを指定する時って、「/dir/」が正しいのか、「/dir」
にすべきか、最後の/をつけるかつけないかでどんな違いがあるのか
いつもすごく気になる。

637:名無しさん@お腹いっぱい。
16/06/05 13:34:06.57 .net
>>625
rsync や ln 、mv あたりはありなしで挙動がかわる。
ln や mv はオプションで一応制御できるけど

638:名無しさん@お腹いっぱい。
16/06/09 19:13:38.61 .net
json形式のデータをSQLのjoinみたいにキーで結合したいのですが
いいスクリプト知りませんか?
jqはできそうな感じなんだけど、サンプルのページが見当たらなくて

639:名無しさん@お腹いっぱい。
16/06/09 21:10:02.49 .net
>json形式のデータをSQLのjoinみたいにキーで結合したいのですが
cpanモジュール使うべし。
力技でゴリゴリでもできるかもしらんが、時間の無駄

640:名無しさん@お腹いっぱい。
16/06/09 22:45:45.43 .net
>>627
データがどんなもんか分からないので何とも言えないけど例えば
[
{"id": 1, "name": "Tom", "gender": 1},
{"id": 2, "name": "Alice", "gender": 2},
{"gid": 1, "gender": "male"},
{"gid": 2, "gender": "female"}
]
なんてJSONファイルがあって gender と gid で join する場合、
jq '
map(
(select(has("id")) | { k: .gender, v: { id: .id, name: .name }}),
(select(has("gid")) | { k: .gid, v: { geder: .gender }})
)
| group_by(.k)
| map((map(.v) | add))
' data.json
かなぁ。

641:629
16/06/10 01:11:22.91 .net
あー、しまった、思いっきり間違えた…
jq '
(map(select(has("gid")) | {(.gid|tostring): .gender}) | add) as $g
|
map (select(has("id")) | .gender = $g[(.gender|tostring)])
' data.json

642:名無しさん@お腹いっぱい。
16/06/10 01:28:18.48 .net
[
{
"id": 1,
"name": "Tom",
"gender": "male"
},
{
"id": 2,
"name": "Alice",
"gender": "female"
}
]
できました、できましたけど書き方わからないです><
>>628
cpan使うのが主流なんですか?

643:名無しさん@お腹いっぱい。
16/06/10 01:54:22.40 .net
>>631
json 形式のデータを DB に insert する方法を調べた方がいいかも

644:名無しさん@お腹いっぱい。
16/06/10 14:14:19.71 .net
>>631
いやそういうわけではなくて、pythonでもrubyでもいいけど
JSONとかXMLとかYAMLなどの定形式な文書からスライスして取
り出すなら、すでにある専用モジュールとか使ったほうが断然
速いってはなし。俺はperlしかわからんのでcpanモジュール。
perlなら
use JSON::XS;
して、
my $json = 'json.txt'
my $data = decode_json($json); #jsonからperlのハッシュに変換
あとは、ハッシュの内容をダンプしてデータ構造みながら
必要なデータだけを拾う。
print %$data{features}->[$cnt]->{properties}->{title} .

645:名無しさん@お腹いっぱい。
16/06/10 16:33:17.98 .net
使うべしって言った割にショボ過ぎ

646:名無しさん@お腹いっぱい。
16/06/10 22:15:34.82 .net
スレ的にもここはあくまでシェルスクリプトでやるべきだろ
なんでもありなら今はPythonの方がメジャー
もしくはRubyとか

647:名無しさん@お腹いっぱい。
16/06/10 23:07:20.19 .net
場違いだったらすまん。
gomプレイヤーとかのソフト立ち上げるとスクリプトエラー出るんだけどどうしたらいい?
URLリンク(imgur.com)

648:名無しさん@お腹いっぱい。
16/06/11 00:12:44.31 .net
スレチ

649:名無しさん@お腹いっぱい。
16/06/11 00:34:35.87 .net
スクリプトエラーとやらがでる

にちゃんでスクリプトで検索

シェルスクリプトとかよくわからんけどスクリプトって入ってるからここに書けば誰か完璧な答えを出してくれるはず

ゆとり、ここに極まれり

650:名無しさん@お腹いっぱい。
16/06/11 03:40:49.78 .net
引数を受けて同名のサブディレクリ直下にある全てのシェルスクリプト(.sh)を実行するってどう書けばいいんでしょうか?

651:名無しさん@お腹いっぱい。
16/06/11 03:41:43.14 .net
bash環境です。同名とは引数に指定された文字です

652:名無しさん@お腹いっぱい。
16/06/11 03:53:01.79 .net
find 引数 -name *.sh -exec {};
こんな感じなのだろうか。

653:名無しさん@お腹いっぱい。
16/06/11 04:14:09.33 .net
ありがとうございます
こんな感じで良いのかな?
find 引数 -maxdepth 0 -name *.sh -exec bin/sh -c ' {} ' \;

654:名無しさん@お腹いっぱい。
16/06/11 10:22:42.97 .net
シェルスクリプトじゃないけどrun-partsが似たような仕事するね

655:名無しさん@お腹いっぱい。
16/06/12 05:31:11.76 .net
for sh in $dir/*.sh; do $sh; done

656:名無しさん@お腹いっぱい。
16/06/12 11:11:52.76 .net
Cygwin(bash)で特定の拡張子の映像ファイルをforループ文でまわして処理したいと思っています
for input in *
do
 (処理)
done
これだと映像ファイルだけでなく全てのファイルが対象になってしまいます。
そうではなくて WMV、MP4、AVI、MPEG、MPGといった映像ファイルだけを
処理するにはどうしたらいいでしょうか?

657:名無しさん@お腹いっぱい。
16/06/12 11:15:55.66 .net
>>645
そもそもなんでファイルを振り分けてないのか?

658:名無しさん@お腹いっぱい。
16/06/12 11:25:58.85 .net
>>646
ffmpegで処理してるので映像ファイルの種類は分けなくても良かったりします
あ、ただ変換後の拡張子は統一するようスクリプトを書かないといけませんね

659:名無しさん@お腹いっぱい。
16/06/12 11:44:06.36 .net
>>645
for input in $(ls -1 *.{wav,mp4,avi,mpeg,mpg} 2>/dev/null)
do
 (処理)
done
とか。

660:名無しさん@お腹いっぱい。
16/06/12 11:52:44.28 .net
>>648
これじゃダメな場合があるんだっけ?
for input in *.wav *.mp4 *.avi *.mpeg *.mpg
do

done

661:名無しさん@お腹いっぱい。
16/06/12 12:07:38.74 .net
.wavファイルがないとinputには"*.wav"がそのまま入る
だけど、ループの中で処理する時に
[ -f "$input" ] || continue
とでもしとけばいいよね

662:名無しさん@お腹いっぱい。
16/06/12 12:36:44.21 .net
>>648
>>650
なるほど、そういう方法がありましたか。
ありがとうございますm(_ _)m
>>649
>>650さんのご指摘通りその拡張子のファイルが無いとそのまま入っちゃうって問題がありますね

663:名無しさん@お腹いっぱい。
16/06/13 20:14:40.91 .net
テキストファイルの最終行に改行がないときだけ
改行を追加するようなスクリプトってどう書けばいいでしょうか?

664:名無しさん@お腹いっぱい。
16/06/13 22:21:10.97 .net
>>652
それ、自分が前悩んで作ったのがある。誰か改善してくれ
#!/bin/sh
file=$1
test -f $file || exit 0
# if size -eq 0; then exit 0
if [ ! -s $file ]; then
 exit 0
fi
# if the last character is not \n, then echo
if [ "$(tail -c 1 $file | cat -A)" != "$" ]; then
 echo
fi
if ! tail -n 1 $file | grep '^$' > /dev/null ; then
 echo
fi

665:名無しさん@お腹いっぱい。
16/06/13 22:23:13.08 .net
test -n "$(tail -n1 TXT)" && echo > TXT

666:652
16/06/13 22:28:48.20 .net
すまない。>>653はmbox形式のファイルにメールを追加するために作ったスクリプトだった
だから>>652さんの求めているスクリプトとはちょっと違った_o_

667:名無しさん@お腹いっぱい。
16/06/13 22:49:39.12 .net
>>654
ファイルがぶっ壊れちゃったじゃないか(#゚Д゚) ゴルァ!!
なんつって

668:名無しさん@お腹いっぱい。
16/06/13 22:58:56.61 .net
>>653
ありがとうございます
最終文字を取り出して調べるというわけですね
いじれそうです
たぶんGNUのtailが必須じゃないかと思うのですが、
非GNU環境でも動くようにはならないでしょうか

669:名無しさん@お腹いっぱい。
16/06/13 23:07:30.48 .net
>>654
ありがとうございます
ただ、これは目的の動作ではありません
末尾に空行が欲しいのではなく、
改行文字で終わっていない最終行に改行をつけたいのです

670:名無しさん@お腹いっぱい。
16/06/14 00:26:19.34 .net
>>652
#!/bin/sh
echo wq | ed "$1"

671:名無しさん@お腹いっぱい。
16/06/14 00:51:00.50 .net
>>652
for f in *.txt
do
[ $(tail -1 "$f" | wc -l) -eq 0 ] && echo >> "$f"
done

672:名無しさん@お腹いっぱい。
16/06/14 00:57:30.09 .net
>>652
for f in *.txt
do
{ tail -1 "$f" | read; } || echo >> "$f"
done

673:名無しさん@お腹いっぱい。
16/06/14 02:14:34.40 .net
edかex使ったほうが楽なんじゃないか

674:名無しさん@お腹いっぱい。
16/06/14 02:55:20.33 .net
659 と 661 の違いは空ファイル(サイズ0)の場合。
ed はそのままだけど、tail -1 ... | read では newline が追加される。

675:名無しさん@お腹いっぱい。
16/06/14 17:09:51.68 .net
>>659-663
みなさんありがとうございます
edは思いつきませんでした
どこでもあるかと思ったらないのもありますね。exはありそうです
改行のない最終行がwcにカウントされないとか
改行がないとreadがエラーコード返すとか
すごくためになりました
空ファイルの動作の差についてはサイズを調べて分岐すればいいですね

676:名無しさん@お腹いっぱい。
16/06/15 01:17:10.55 .net
>>652
sed -i -e '$a\' file
URLリンク(unix.stackexchange.com)


677:of-a-file



678:名無しさん@お腹いっぱい。
16/06/15 02:02:23.61 .net
ed や sed で追加する場合は元々ファイルの末尾に "\n" があるファイルの
タイムスタンプを更新してしまうんだな

679:名無しさん@お腹いっぱい。
16/06/15 14:17:26.63 .net
おまえら知らんだろうけど、俺の家のそばの歩行者信号はUNIXのコンソールみたいに
青になるまで(赤になるまで)ドット(.)の点滅がひとつずつ消えていくんだぜ・・?
夜なんか見るとKDEみたいな感じですげえカッコイイぜ。

680:名無しさん@お腹いっぱい。
16/06/15 14:54:39.46 .net
眼科行けよ・・・

681:名無しさん@お腹いっぱい。
16/06/15 14:58:10.28 .net
日常生活の夜景にKDEを妄想する病気か。
IT土方の後遺症

682:名無しさん@お腹いっぱい。
16/06/15 17:06:08.30 .net
>>665
おお、これはシンプルですね
空ファイルでもちゃんと対応できています
man見てもそんな動作するとは明示されてないのですが
安定した仕様と考えていいのでしょうか

683:名無しさん@お腹いっぱい。
16/06/15 19:20:41.67 .net
$ <- 最終行
a <- add. 置換ならsが有名. pでprint
\ 何もない シェルスクリプトでも改行またぐときに使うやつ
類似した構文
seq 20 | head
seq 20 | sed -n '1,10p'

684:名無しさん@お腹いっぱい。
16/06/15 21:22:12.46 .net
それだったら
seq 20 | sed 10q
の方が良いかもしんない

685:名無しさん@お腹いっぱい。
16/06/16 01:11:19.56 .net
>>652
URLリンク(stackoverflow.com)
awk
{ rm file;awk 1 >file; }<file
bash
[[ $(tail -c1 file) && -f file ]]&&echo ''>>file

686:名無しさん@お腹いっぱい。
16/06/16 14:28:12.81 .net
>>673
おお、awkは明白でわかりやすいですね
改行抜きで読んだ各行を改行付きでprintするわけですね
その意味ではawkで完璧なcatはできないのかな
紹介していただいたページには他にもいろいろ解法があっておもしろいです
ありがとうございます

687:名無しさん@お腹いっぱい。
16/06/16 15:35:18.42 .net
grep + moreutils の sponge
$ grep '' file | sponge file

688:名無しさん@お腹いっぱい。
16/06/16 19:35:59.66 .net
>>675
grepだけでも末尾に改行つけるんですね
でもこの仕様も安定性が心配

689:名無しさん@お腹いっぱい。
16/06/16 20:54:54.26 .net
コマンドラインから翻訳API使ってるがおもしろすぎるw

690:名無しさん@お腹いっぱい。
16/06/19 12:33:57.95 .net
Windows7上でCygwinを動かしbashスクリプトを記述しています。
特定のタスクが起動するのを監視して、起動を確認したら行動に移すスクリプトを
書こうと思っています。
たとえばWindows Media Playerを起動するとWindowsタスクマネージャー上の
「アプリケーション」タブに"Windows Media Player"が立ち上がるのが分かります。
このように特定のタスク/アプリケーションの起動を検知するスクリプトをbashで
記述するにはどうしたらよろしいでしょうか?

691:名無しさん@お腹いっぱい。
16/06/19 14:28:17.66 .net
ps -W | grep "Windows Media Player" | grep -v grep

692:名無しさん@お腹いっぱい。
16/06/19 14:30:25.15 .net
"Windows Media Player"の部分は実際のexeになると思うから
ps -Wで表示されるのにしてね

693:名無しさん@お腹いっぱい。
16/06/19 15:43:42.63 .net
>>679
>>680
ありがとうございますm(_ _)m

694:名無しさん@お腹いっぱい。
16/06/20 18:07:32.11 .net
そういう時は pgrep を使えよ! と思って手元の Cygwin (64bit) に procps-ng を
インストールしてみたんだけど、これって cygwin 配下のプロセスしか見えないのね……

695:名無しさん@お腹いっぱい。
16/06/20 23:14:14.04 .net
大変出遅れたけど
>>649
の問題はbashなんだしshopt -s nullglobで済むのでは?

696:名無しさん@お腹いっぱい。
16/06/21 02:08:19.29 .net
横からだけど、bash なら nullglob でいけるな~
むっちゃ参考になった。ありがとう

697:名無しさん@お腹いっぱい。
16/07/03 14:58:46.31 .net
OSXのsedメモ
ダメ
echo "12


698:3.abcd" | sed -e 's!\.[a-zA-Z]{2}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]{2,3}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]+!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]?!!g' OK echo "123.abcd" | sed -e 's!\.[a-zA-Z]*!!g' OK echo "123.abcd" | sed -e 's!\.[a-zA-Z]\{2\}!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]\{2,3\}!!g' ダメ echo "123.abcd" | sed -e 's!\.[a-zA-Z]\+!!g' echo "123.abcd" | sed -e 's!\.[a-zA-Z]\?!!g' OK echo "123.abcd" | sed -e 's!\(\.[a-zA-Z]\{2\}\)!z!g' echo "123.abcd" | sed -e 's!\(\.[a-zA-Z]\{2,3\}\)!z!g' +と?の代わりになるいい方法ないですか?



699:名無しさん@お腹いっぱい。
16/07/03 15:23:02.40 .net
-e じゃなくて -E つかうとか?

700:名無しさん@お腹いっぱい。
16/07/03 15:27:38.26 .net
$ echo "123.abcd" | sed -Ee 's!\.[a-zA-Z]+!!g'
123
$ echo "123.abcd" | sed -Ee 's!\.[a-zA-Z]?!!g'
123bcd

701:名無しさん@お腹いっぱい。
16/07/03 15:33:05.72 .net
あ、そうか -E は代わりじゃなくて -Ee とすべきだね

702:名無しさん@お腹いっぱい。
16/07/03 15:35:22.62 .net
-Eの存在をすっかり忘れてた
ありがとう

703:名無しさん@お腹いっぱい。
16/07/03 15:52:51.46 .net
OSXにする人への注意点
デフォのままだと、'、"、-が自動的に置換されるから、環境設定>キーボード>ユーザ辞書で自動置換をoffにしたほうがいい
appごと?、ファイルごと?でもメニューバー>編集>自動置換でも自動置換をoffにできる

704:名無しさん@お腹いっぱい。
16/07/03 20:21:24.00 .net
>>690
OSX歴10年ほどだけど、そんなんの知らんかったし、
そんな目にあったことがない。ぐぐったら実在する機能らしいが、
テキストエディットでコーディングするなんて考えられないし、
あたかもすべからく機能するように誤解を誘導するのはよくない。
OSXを使い始めて困ったのは、円とバックスラッシュを区別することぐらいだ。

705:名無しさん@お腹いっぱい。
16/07/04 20:49:46.74 .net
注意点でそんな攻撃的にならなくても
そのテキストエディットのデフォ値を晒した方が有益かと

706:名無しさん@お腹いっぱい。
16/07/04 21:44:12.04 .net
マカーのレスって ~ が、おかしいよね。
デフォルトでおかしいのが出ちゃうのか知らんけど、あれをなんとかしてほしい

707:名無しさん@お腹いっぱい。
16/07/05 02:10:41.78 .net
ゴシックなのに明朝っぽくなるやつね
自分も知ってるけど一発でマック使いだって分かるから
あのままでいいと思ってる

708:名無しさん@お腹いっぱい。
16/07/05 02:24:03.69 .net
波ダッシュの話?
あれは Windows XP がしくっただけじゃなかったっけ。
Unicode の仕様含め結構まとめてくれてる人がいるから一度読んでみたらいい。

709:名無しさん@お腹いっぱい。
16/07/05 09:28:26.99 .net
アポが勝手なことをしただけ

710:名無しさん@お腹いっぱい。
16/07/05 11:46:58.78 .net
>>696
どうぞ
URLリンク(internet.watch.impress.co.jp)
URLリンク(internet.watch.impress.co.jp)

711:名無しさん@お腹いっぱい。
16/07/05 14:27:46.64 .net
それより、UFT8-macを何とかしてほしい。
日本語ファイル名だとLinuxマシンとまともに連携が取れない。

712:名無しさん@お腹いっぱい。
16/07/05 15:14:05.40 .net
>>697
お前はまとめ見て引用しか出来ない馬鹿だな
そのリンク先にも書いてあるだろ
Unicodeのイメージ(字形)が間違ってたんだよ
XPはその仕様を忠実に実装しただけであって
アポは無視したんだよ
MSもヴィスタから同じ対応をしただけだ
知ったかぶりするんじゃねーよ

713:名無しさん@お腹いっぱい。
16/07/06 12:51:14.80 .net
おい、おまえら!
Unixの読み方はユニ(ッ)クスだぞ。Linuxの読み方はリナ(ッ)クスだぞ。
ちなみにASUSはエイサスな、日本語よみでユニックスとかリナックスとかアスースとか読むのは知能が低い証拠だぞ。
Xの前は何でも「ッ」をつければいいと思ってるのは、典型的な日本人のレベルだぞ!
ちなみに、Xの前に正々堂々と「ッ」をつけてもいいのは、貴様らにほとんど関係ない
セ○クス(S○X)だけだぞ!

714:名無しさん@お腹いっぱい。
16/07/06 17:47:32.09 .net
むかしYahooをヤッホーって言ってた友達を思い出した

715:名無しさん@お腹いっぱい。
16/07/06 19:07:35.87 .net
イット革命の時代には、よくあることだね

716:名無しさん@お腹いっぱい。
16/07/06 20:49:19.53 .net
伏せたらSIXだかSOXだかわかんねえな。

717:名無しさん@お腹いっぱい。
16/07/06 21:36:34.09 .net
アメリカで働いてたときはごちゃまぜだった
方言によって訛りもあるし正直通じればなんでもいい

718:名無しさん@お腹いっぱい。
16/07/07 18:04:30.74 .net
最初は現地読みで「りぬくす」または英語読みで「らいなっくす」と言われてた

719:名無しさん@お腹いっぱい。
16/07/12 21:25:52.98 .net
塩味のマムコ

720:名無しさん@お腹いっぱい。
16/07/12 23:15:08.76 .net
ちんぽ

721:名無しさん@お腹いっぱい。
16/07/14 00:29:39.15 .net
イスドンvsアドスル

722:名無しさん@お腹いっぱい。
16/07/19 06:19:56.96 .net
aliasの設定で
alias command='echo "hage"'
commandにスペースを含ませる事できないのでしょうか?

723:名無しさん@お腹いっぱい。
16/07/19 08:59:57.76 .net
>>709
bashだよね。普通にできる

724:名無しさん@お腹いっぱい。
16/07/19 09:07:33.10 .net
あ。command を "c o m m a n d" にしたいということなら
bashの識別子の条件に反するので不可

725:名無しさん@お腹いっぱい。
16/07/19 19:42:55.37 .net
>>710
710=711 と仮定して質問するけど、710はどういう場合? 何を勘違いしたかが気になって。

726:名無しさん@お腹いっぱい。
16/07/19 21:28:50.34 .net
>>712
710=711だけど、aliasで別名を定義するコマンド(つまりイコールの右側)に
スペースを入れられるのかという質問だと考えた。例示がそういう形になってるから。
もし、alias名にスペースを入れられるかという質問ならそういう例示をするはず
でも後者の質問という可能性に気づいたので、711を追加した

727:名無しさん@お腹いっぱい。
16/07/22 22:58:42.81 .net
<bashのfunctionをdeclare -fで表示すると整形してあることを利用>
URLリンク(d.hatena.ne.jp)
ほとんどなんもしてないワンライナーだけど、見事にスクリプト
ファイル整形してくれる。なんか感動すたw

728:名無しさん@お腹いっぱい。
16/08/06 14:00:53.40 .net
Windows10のISOをダウンロードするときに考えたんだけど
URLからファイル名だけを抜き出すこれより冴えたやり方ってある?
ちなみにWindows10のISOはISOファイルの後ろに
セッションIDかなにかがクエリで付くんだな
cat download.txt | grep -v ^$ | grep -v ^# | while read url
do
file=`echo "$url" | sed "s/.*\///g" | sed "s/\?.*//g"`
if [ $file == "" ]
then
echo file is null "$url"
continue
fi
ps -ef | grep wget | grep "$file"
if [ $? -eq 0 ]
then
echo download now "$file"
else
wget -c -t 1000 -O "work/$file" "$url"
fi
done
一応、ファイル名を正しく取得するのと
重複ダウンロード防止機能付き
wget -cにしたのは中断後の再開がもったいないし
wget -cで2重起動するとファイルが壊れて
いやな思いをした経験があるのでチェック入れてます

729:名無しさん@お腹いっぱい。
16/08/07 00:22:16.73 .net
basenameじゃ駄目なの?

730:名無しさん@お腹いっぱい。
16/08/07 11:38:22.64 .net
上のif文、$fileを""で囲わなくていいの?
実際引っかかることはなさそうだけど

731:名無しさん@お腹いっぱい。
16/08/08 22:34:42.13 .net
bash の変数内の文字列削除ってどうやるのでしょうか?削除したいのは"(ダブルクォート)なんですが
testvar=aaa"aa"
${testvar##\"}
これじゃ駄目だった

732:名無しさん@お腹いっぱい。
16/08/08 23:41:17.18 .net
>>718
## は前方最長一致
全部


733:置換するのは // testvar='aaa"aa"' echo ${testvar//\"} Bashマニュアル「パラメータの展開」セクション内「パターンの置換」 http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB



734:名無しさん@お腹いっぱい。
16/08/10 12:59:48.57 .net
selectはbash専用ですか?

735:名無しさん@お腹いっぱい。
16/08/11 00:06:31.61 .net
>>720
はい
URLリンク(wiki.ubuntu.com)
URLリンク(github.com)

736:名無しさん@お腹いっぱい。
16/08/16 04:34:02.37 .net
特定のディレクトリ配下のファイルの中身に特定の文字列が含まれるかどうかを判定するにはどうしたらいいですか?
find xargs grep?これの行数でも数えてtestに渡す?

737:名無しさん@お腹いっぱい。
16/08/16 08:28:28.59 .net
判断ってファイル名をリストすんの?
最終的にどうしたいの?

738:名無しさん@お腹いっぱい。
16/08/16 11:19:32.81 .net
grep -qr 文字列 ディレクトリ

739:名無しさん@お腹いっぱい。
16/08/16 12:55:22.82 .net
あったら処理Aを実行しその結果を返却、なかったら正常終了としたい

740:名無しさん@お腹いっぱい。
16/08/16 13:02:40.67 .net
if grep -qr 文字列 ディレクトリ; then 処理A; else exit 0; fi

741:名無しさん@お腹いっぱい。
16/08/20 19:23:45.23 .net
find . | grep xargs ~

742:名無しさん@お腹いっぱい。
16/08/21 09:28:24.43 .net
> find . | grep xargs ~
とても斬新

743:名無しさん@お腹いっぱい。
16/08/23 01:57:32.12 .net
今freebsdのミラーサイトおかしくない?

744:名無しさん@お腹いっぱい。
16/08/23 02:07:00.60 .net
どうおかしいのかくわしく

745:名無しさん@お腹いっぱい。
16/08/23 02:08:14.36 .net
freebsd-update fetch
freebsd-update install
ができない

746:名無しさん@お腹いっぱい。
16/08/23 02:08:58.40 .net
ミラーサイトを色々変えてもだめ

747:名無しさん@お腹いっぱい。
16/08/28 20:54:56.49 .net
読み込みたいデータが入ったファイルをcatしてwhileでreadすると
while抜けたときに変数の内容が保持されないんだけど
元のシェルスクリプトと別プロセスになってるからってことなのかな?
以下サンプル
user01@server01 ~/test $ cat t4.sh
cat work/uhl.txt | grep -v ^# | sort | uniq | while read title
do
grepvlist=`echo "$grepvlistw | grep -v \"$title\" "`
grepvlistw=$grepvlist
echo $grepvlist
done
echo "---------"
echo $grepvlist
echo $grepvlistw
echo "---------"
user01@server01 ~/test $ sh t4.sh
| grep -v "111"
| grep -v "111" | grep -v "222"
| grep -v "111" | grep -v "222" | grep -v "333"
| grep -v "111" | grep -v "222" | grep -v "333" | grep -v "444"
---------

---------
user01@server01 ~/test $ cat work/uhl.txt
111
222
333
444
user01@server01 ~/test $

748:名無しさん@お腹いっぱい。
16/08/28 21:02:27.99 .net
while ... do ... ; done <<EOT
$(grep -v ^# <file| sort | uniq)
EOT

749:名無しさん@お腹いっぱい。
16/08/28 21:03:00.60 .net
パイプせずに-eでやろうってのはその通りですが
疑問の本質ではないのでとりあえずスルーでお願いします

750:名無しさん@お腹いっぱい。
16/08/29 03:11:36.41 .net
だったら問題の本質だけのスクリプトにすべきでは?

751:名無しさん@お腹いっぱい。
16/08/29 06:36:10.22 .net
単に簡略化して書いただけじゃ?

752:名無しさん@お腹いっぱい。
16/08/29 12:49:07.23 .net
パイプが問題の本質なんだな
パイプでつなげたwhileはサブシェルで起動するから、
> while抜けたときに変数の内容が保持されないんだけど
> 元のシェルスクリプトと別プロセスになってるからってことなのかな?
ってことになる
whileをパイプの先に置いてる限り解決しないので、>>734が本質的な解
あるいは、shじゃなくてbashとかならプロセス置換が定石
while read title; do
...
done < <(cat work/uhl.txt | grep -v ^# | sort | uniq)

753:名無しさん@お腹いっぱい。
16/09/08 21:25:56.17 .net
urlを取得しようと、テストで下を試したのですがダメでした。
どなたか、どうすればいいか教えてください。
お願いします。
x="URLリンク(x")
echo $x | grep -Ee "/[\w\.]"
echo $x | grep -Ee "\/[\w\.]"
echo $x | grep -Ee '/[\w\.]'
echo $x | grep -Ee '\/[\w\.]'
echo $x | grep -e "/[\w\.]"
echo $x | grep -e "\/[\w\.]"
echo $x | grep -e '/[\w\.]'
echo $x | grep -e '\/[\w\.]'

754:名無しさん@お腹いっぱい。
16/09/09 00:28:23.04 .net
やりたいことがわからない...

755:名無しさん@お腹いっぱい。
16/09/09 13:26:15.96 .net
テキスト中のurlを取得しようと、grepに/が先頭に来るパターンを使ってテストしてみたら、htURLリンク(x)が取得できなかった。
ヘルプミー。
だろ。

grepに/が先頭に来るパターンを使った取得は俺も出来ない。

756:名無しさん@お腹いっぱい。
16/09/09 13:46:05.11 .net
>>739
期待する出力は?

757:名無しさん@お腹いっぱい。
16/09/09 14:07:32.50 .net
>>741
おまえの言うことも分からないから739と741は同一人物っぽいな
$xがURLそのものなら加工する必要が無い

758:名無しさん@お腹いっぱい。
16/09/09 15:51:28.22 .net
「grep」ではなくて「sed」による例だが、
URL(URI)の中からホスト名(サーバー名 *1)を抽出したいなら
 *1 スキーム(http:)とパス(/yyy/zzz/index.html)に挟まれた部分
[入力]URL URLリンク(www.xxx.co.jp)
[出力]ホスト名 www.xxx.co.jp
$ echo "URLリンク(www.xxx.co.jp) | sed -e 's/.*http:\/\/\([^\/]*\)\/.*/\1/i'
www.xxx.co.jp

759:744
16/09/09 16:31:07.62 .net
実行例、何かURLの後ろに勝手に「; セミコロン」が挿入されているな
これ2chの仕様?
もし試すなら「index.html"」の後ろの「; セミコロン」は削除して試してくれ

760:名無しさん@お腹いっぱい。
16/09/09 16:39:00.12 .net
セミコロンなんて入ってない
あんたのブラウザの問題だろ

761:名無しさん@お腹いっぱい。
16/09/09 16:57:52.70 .net
>>743
741です。
妄想、乙。そのするどい頭脳でサクッとコマンド貼ってみてくださいね。
ちなみに、\wにこだわらなければ
echo $x | grep -e "/[a-zA-Z0-9\.]"
で、できる。
\wがあると、どうしてだめかはしらない。
>>744
セミコロンないよ。

762:名無しさん@お腹いっぱい。
16/09/09 17:27:46.43 .net
書きたかったのは echo 'URLリンク(x)<)' | grep :// で良い気がする

763:名無しさん@お腹いっぱい。
16/09/09 18:44:47.37 .net
>>744はウェブブラウザで表示するとセミコロンが見える
2chの仕様っていうか read.cgi のバグ

>>747
> \wがあると、どうしてだめかはしらない。

grep や egrep の正規表現では文字クラス […] 内のバックスラッシュ \ が特別な意味を持たないから
[\w] は \ と w にマッチする
[\.] は \ と . にマッチする

764:名無しさん@お腹いっぱい。
16/09/09 22:23:01.76 .net
>>747
>>741とやってることが矛盾してるが

765:名無しさん@お腹いっぱい。
16/09/09 23:05:57.44 .net
結局>>739が出てこない限り>>740から何一つ進まない

766:739
16/09/10 17:00:28.25 .net
言葉足らずで、お騒がせしました。
やりたかったのは、テキスト中のurlの抽出です。
urlには/が入っていて、ドメイン名にはアルファベット、数字、ピリオドがあるので、
いろいろ試しているなかで、上のようなコマンドでgrepが機能しない?と思い込んだ状態に遭遇した所でした。
https+://をgrepから外したのは、http://やドメイン名から始まるurl対策のつもりでした。
自分の間違いを>>749の解説と>>747のイグザンプルで理解できました。
みなさん、ありがとうございました。
本来の目的はまだ試行錯誤中ですが。

767:739
16/09/10 17:16:44.65 .net
https+じゃなくてhttps?でした

768:名無しさん@お腹いっぱい。
16/09/14 14:31:43.86 .net
<<<を使うとechoで変数を渡すより速いというのを見かけて
time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( echo ${x} | sed -Ee s'/b.*//g' ) ; done
time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( sed -Ee s'/b.*//g' <<< ${x} ) ; done
を試したら、<<<の方が1割ほど遅かった。環境:macosx1095+sandy
みんなはどう?

769:名無しさん@お腹いっぱい。
16/09/14 20:50:13.24 .net
CentOS6.8(Hyper-V上)/Haswell でも前者の方が早いですね。
time を bash 添付の物ではなく、/usr/bin/time -v /bin/bash -c '...' で計測して詳細をみると、
前者は File system outputs: の値が 0 に対して、後者は 8000 (for の繰り返し1回あたり 8 増える)
となりました。

strace で見る限りどこかに書き込んでいるようには見えないですが、内部での実装に違いが
あるようですね。

770:名無しさん@お腹いっぱい。
16/09/15 09:05:23.94 .net
想像だけど、echoはbashのビルトインだから起動ロスが無いのとパイプは同時起動だから、stdinが常に準備状態
<<<だど読み込むときにstdinを準備
じゃないのか?

771:名無しさん@お腹いっぱい。
16/09/15 11:53:03.00 .net
<<<(ヒアストリング)ってbashのドキュメントにはビアドキュメントの変形と書かれてる
ってことは、fstat(0, ...)で調べりゃ、レギュラーファイルになってる筈

> <<<を使うとechoで変数を渡すより速いというのを見かけて
と言うデマの火元はどこ?

772:名無しさん@お腹いっぱい。
16/09/15 13:09:35.23 .net
前者はサブシェルを起動するからプロセッサが繁忙状態だと多分遅くなる
シングルコア/シングルプロセッサだと確実にヒアストリングの後者の方が速い

773:名無しさん@お腹いっぱい。
16/09/15 19:15:16.79 .net
>>756, >>757, >>758
解説㌧
ヒアストリングという言葉自体初めて知りました。
<<はヒアドキュメントということも知らずに使っていました。
環境によっては、<<<は速くなるんですね。
いい勉強になりました。

774:名無しさん@お腹いっぱい。
16/09/24 18:27:52.80 .net
ちょい困り案件が自己解決したのでココに書いておきます。
Macのファイルシステムって、ファイル名を UTF-8 で保存してるかと思いきや
独自の正規化がされてまして (UTF8-MAC) 例えば、
 find . -name "*ドイツ*"
とかやってもあるはずのファイルが出てこないわけです。(内部的に ド の字を ト+[濁点] みたいな格納をしてるせいです)
そこで .bash_profile に以下のように コマンドもどきの find2 を定義してやります。これで万事解決です。

# find に渡す引数を全て UTF8-MAC に変換してしてます
find2(){
eval "find "$(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}

775:名無しさん@お腹いっぱい。
16/09/24 18:38:10.62 .net
>>760
他文字コードにも応用できそうだね

776:名無しさん@お腹いっぱい。
16/09/24 18:47:05.28 .net
変換すべきは-name ... だけでしょ 全部変換は手抜きすぎ
-execで他のプログラムに渡すUTF-8をUTF8-MACに変換されていやーんになる
汎用的にするなら要ブラッシュアップ

777:名無しさん@お腹いっぱい。
16/09/24 21:51:49.29 .net
>>762 了解です。
ただ -exec の方は 問題は別にあって
終端を表す \; の \(バックスラッシュ)
が消えちゃうんですね。そもそもiconv変換する前の時点で。
一応対応できたと思うんですが、
長くなったので貼るのはやめときます。

778:名無しさん@お腹いっぱい。
16/09/24 22:10:40.49 .net
-execは;じゃ無くて+で終端しないと原人扱いされちゃうよ
;じゃないと困るのはかなり特殊なケース

779:名無しさん@お腹いっぱい。
16/09/24 22:13:36.64 .net
>>760
どっかで読んだ内容だなぁと思ったら、これ↓のパクリか!
「新・OS X ハッキング! (169) Terminal上で「ダ」や「パ」が付くファイルを検索できない理由と対策 | マイナビニュース」
 URLリンク(news.mynavi.jp)

780:名無しさん@お腹いっぱい。
16/09/24 23:20:43.06 .net
やり方だけ覚えてたんですが、昔見たのはソレかもしれません。
ただ現実に必要になってみると
find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`
これ毎回打ち込むの面倒だなと思ってコマンド化してみた次第です。

781:名無しさん@お腹いっぱい。
16/09/24 23:54:36.90 .net
昔って、先月の25日(1ヶ月前)の記事だけどな

782:名無しさん@お腹いっぱい。
16/09/24 23:56:11.17 .net
実におもしろいw

783:名無しさん@お腹いっぱい。
16/09/25 00:01:20.09 .net
ん、もっと昔から知ってたよ。だから他の記事だと思います。

784:名無しさん@お腹いっぱい。
16/09/25 02:09:32.85 .net
>>763
>>終端を表す \; の \(バックスラッシュ) が消えちゃうんですね。

普通にfindするときもfindに渡る前に¥は消えるでしょ

find2(){
find $(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}

じゃダメなの?

785:名無しさん@お腹いっぱい。
16/09/26 14:04:28.33 .net
それがベストだと思います

786:名無しさん@お腹いっぱい。
16/09/26 23:31:45.32 .net
昔から知ってたけどね

787:名無しさん@お腹いっぱい。
16/10/16 10:27:03.83 .net
以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name

788:名無しさん@お腹いっぱい。
16/10/16 10:36:38.42 .net
すみません、失敗しました。

以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name "AA*"」とさせるにはどうすればいいのでしょうか?

#!/bin/sh
name="AA*"
option="-name $name"
find /tmp $option
---------------------------
$ ls
AABB test.sh

$ ls /tmp
AACC

$ sh -x test.sh
+ name=AA*
+ option=-name AA*
+ find /tmp -name AABB

/tmp/AACC をヒットさせたくて
下のように変数の書き方を色々変えてみましたが、うまくいかず
悩んでます。
name="AA"*""
name="AA\*"
name="AA\"*\""
option="-name "${name}""
option="-name \${name}"

789:名無しさん@お腹いっぱい。
16/10/16 10:45:33.83 .net
option=

790:名無しさん@お腹いっぱい。
16/10/16 10:53:11.25 .net
あれ、ダブルクォーテーションで切れちゃった
全角にするけど
option=”-name \”$name\””
とすればよろし

791:名無しさん@お腹いっぱい。
16/10/16 11:06:04.27 .net
ダブルクォーテーション
ウェブブラウザで書いてて、書き込んでいいですかの確認画面を経由して書き込むと切れちゃう
俺調べ

792:名無しさん@お腹いっぱい。
16/10/16 13:48:12.77 .net
余計な変数使わないで
#!/bin/sh
name="AA*"
find /tmp -name "$name"
ってやればいいのに

793:名無しさん@お腹いっぱい。
16/10/16 13:54:36.43 .net
場合によって
option="$option 他のオプション"
とかやりたいんじゃないの

794:名無しさん@お腹いっぱい。
16/10/16 17:25:04.68 .net
>>777
まさにそれだったわ。情報ありがとう

795:名無しさん@お腹いっぱい。
16/10/16 18:08:50.16 .net
邪道で、bash 用だけど find の前に set -f
find の検索パスにワイルドカード使ってたらだめ

796:名無しさん@お腹いっぱい。
16/10/16 19:22:23.01 .net
テス
# name=

797:名無しさん@お腹いっぱい。
16/10/16 19:25:37.68 .net
>>777、あぁ、本当だWebブラウザからの書き込みだと回避できないのかな?
スクリプトソース貼るのに致命的だな

798:名無しさん@お腹いっぱい。
16/10/16 19:40:18.84 .net
hastebinにでも貼ればいいんだよ

799:名無しさん@お腹いっぱい。
16/10/26 22:58:52.49 .net
一般的なペーストビン

800:名無しさん@お腹いっぱい。
16/10/26 23:40:35.70 .net
hastebinのほうがちょっと見やすかったりする

801:名無しさん@お腹いっぱい。
16/10/29 21:05:55.08 .net
実行中の標準出力と標準エラーをログしながら表示させることって出来る?
むかしリダイレクトとtailでやったらうまく行かなかった覚えがあってやめた気がする

802:名無しさん@お腹いっぱい。
16/10/29 21:22:36.46 .net
プロセス置換を使う
cmd > >(tee stdout.log) 2> >(tee stderr.log)

803:名無しさん@お腹いっぱい。
16/10/29 22:19:49.67 .net
そういえばPOSIX shにはないな…すまん

804:名無しさん@お腹いっぱい。
16/10/30 09:23:07.74 .net
cmd > stdout.log 2> stderr.log & tail -f stdout.log stderr.log
で出来ないか?

805:名無しさん@お腹いっぱい。
16/10/30 21:41:34.72 .net
下記でOKだった

{ { cmd | tee stdout.log 1>&3; } 2>&1 | tee stderr.log 1>&2; } 3>&1

・bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita
 URLリンク(qiita.com)

806:名無しさん@お腹いっぱい。
16/11/04 12:24:35.95 .net
音楽CDを突っ込んでmp3を作る。
この時ファイル名とmp3タグにはCDDBから読み込んで来る。

これをやるのに手っ取り早い方法ってなんだろ

807:名無しさん@お腹いっぱい。
16/11/04 12:26:20.17 .net
EAC自動化

808:名無しさん@お腹いっぱい。
16/11/04 12:31:52.74 .net
abcde使えよ

809:名無しさん@お腹いっぱい。
16/11/17 04:52:04.55 .net
/usr/bin/test を使った判定がよくわからなくて困ってます

curl でhttp の応答をチェックしたいのですが
下記みたいにしてもちゃんと判定できないのですが何が原因でしょうか?

test $(curl -XHEAD -s -i URLリンク(www.google.co.jp) | awk NR=1) = 'HTTP/1.1 200 OK';echo $?

810:名無しさん@お腹いっぱい。
16/11/17 06:02:01.01 .net
くおー

$ [ $(curl -I URLリンク(localhost) 2>&- | head -n 1) = 'HTTP/1.1 200 OK' ]; echo $?
bash: [: too many arguments
2
$ [ "$(curl -I URLリンク(localhost) 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
0
$ [ "$(curl -I URLリンク(localhost) 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
1

っとちょっと色々違うけど、うちでは之でなんとかなってる

811:名無しさん@お腹いっぱい。
16/11/17 06:27:40.74 .net
"HTTP/1.1 200 OK"$'\r'

812:名無しさん@お腹いっぱい。
16/11/17 08:38:26.65 .net
そういうのはステータスコードだけを見るようにしたほうがいいよ

test "$(curl -I -s -o /dev/null -w '%{http_code}' URLリンク(www.google.co.jp))" = 200

HTTPステータス行の Reason-Phrase ("OK" や "Not Found" の部分) は送出者が自由に書けるし
HTTPバージョンも当然固定じゃない

# HTTP2を有効にしてビルドしたcurlの場合:
$ curl -I -s URLリンク(www.google.co.jp) | head -n 1
HTTP/2 200
$

813:名無しさん@お腹いっぱい。
16/11/17 08:49:14.72 .net
>>798
訂正
ウェブブラウザで表示すると余分なセミコロンが混じってしまう

test "$( curl -I -s -o /dev/null -w '%{http_code}' URLリンク(www.google.co.jp) )" = 200

814:名無しさん@お腹いっぱい。
16/11/17 12:19:57.15 .net
>>521
いいお(´・ω・`)

815:名無しさん@お腹いっぱい。
16/11/17 12:21:26.17 .net
うちのcurlは終了しなかった
-XHEAD を外してみた
-bash: test: too many argumentsになった
$()を""で括った
awkが効いてなさそう
NR==1 にした
まだ一致しない
行末がCRLFだった
$'\r'を付けた

とりあえず
test $(curl -XHEAD -s -i URLリンク(www.google.co.jp)<) | awk NR==1)" = 'HTTP/1.1 200 OK'$'\r';echo $?
なった

816:名無しさん@お腹いっぱい。
16/11/17 12:47:25.00 .net
つまり纏めるとこうか
test "$(curl -I -w "%{http_code}" URLリンク(example.com) 2>&- |tail -1)" = 200; echo $?

817:名無しさん@お腹いっぱい。
16/11/17 14:56:39.30 .net
なんでレスポンスを取得する操作と
取得したレスポンスをtestする操作を一度にしようとするのか理解不能

818:名無しさん@お腹いっぱい。
16/11/17 16:51:11.77 .net
ワンライナー原理教の方ですかね?w

まあ何でも一度にやってみたくなる衝動は理解できなくもない。
そこに山があるから、的な何か。

819:名無しさん@お腹いっぱい。
16/11/17 17:02:47.58 .net
そこにパイプがあるからな

820:名無しさん@お腹いっぱい。
16/12/07 08:00:32.91 .net
品位が問われるAdvent Calendar -- シェルスクリプトはどこでも動く!
URLリンク(www.peeep.us)

なんかあの界隈よく揉めてるな… 👀
Rock54: Caution(BBR-MD5:f4da0c707200fe35c49b788174082785)


821:名無しさん@お腹いっぱい。
16/12/07 09:27:19.82 .net
品位のないやつだな

822:名無しさん@お腹いっぱい。
16/12/07 10:58:10.89 .net
qiitaとかに書いちゃう輩なんてそんなもんだろ

823:名無しさん@お腹いっぱい。
16/12/07 12:13:29.28 .net
この記事がキモいのは認めるけど、十把一絡げにQiitaを悪く言うのはやめて!

とはいうもののオタクのコミュニティって、どこでもちんぽ騎士団ぽいのがいるよね……
ぼっち最高やで。

824:名無しさん@お腹いっぱい。
16/12/07 15:49:11.13 .net
シェルスクリプトで、if


825:とthenの間に改行がある場合で、その間に#をつけたコメント行を入れるのはNGですか? ifの条件を、動作テストのため、いくつか使い分けたくて、thenより上の行で、テストで使い終わった判定を コメント化しました。実際の判定が、コメント化したものが活かされたりと、おかしくなりました。 以下の、1分ごとに呼び出されるコードで、毎時40分だけ動いて貰いたいのに、10分おきに条件成立となりました。 #1hour if [ `date '+%M'` -eq "40" ] #10min # if [ `date '+%M' | tail -c 2` -eq 0 ] #all # if [ true ] then echo 処理 fi



826:名無しさん@お腹いっぱい。
16/12/07 16:18:47.23 .net
>>809
あそこで役に立つ記事あるか?
自己満のゴミ情報が大部分だからgoogole personal blockの対象だわ

827:名無しさん@お腹いっぱい。
16/12/07 16:49:19.73 .net
>>810 テストの大括弧の後ろにセミコロン付ければいいんでね?

828:名無しさん@お腹いっぱい。
16/12/07 18:34:13.86 v2ZV9RF7w
bash3.2+ で IFS=$' \t\n' な状態で

$ echo "foo bar" baz | hoge.bash

とした時に hoge.bash 内で "foo bar" と baz を
別々の引数として取得するにはどうすればいいですか?

829:名無しさん@お腹いっぱい。
16/12/07 19:49:58.99 .net
>>811
わかる。盛大な勘違い書いててドャァしてる感がすごい

830:名無しさん@お腹いっぱい。
16/12/07 21:31:23.08 .net
googoleとかのことか

831:名無しさん@お腹いっぱい。
16/12/07 23:23:03.71 .net
>>810
素直にcrontab使った方が良いんじゃね

832:名無しさん@お腹いっぱい。
16/12/08 09:58:48.36 .net
>>810
そんなこと起きないはず
ほんとにそのコード?

833:名無しさん@お腹いっぱい。
16/12/10 20:22:24.90 .net
すいません、教えて下さい。
色んなネットーワーク機器のログをsedでズバッとマスキングかけたいんだけど、URLと、IPアドレスの正規表現を教えて下さい。

834:名無しさん@お腹いっぱい。
16/12/10 20:25:17.66 .net
817d

835:名無しさん@お腹いっぱい。
16/12/14 16:17:30.58 .net
TBS

det dritte folkemn

836:名無しさん@お腹いっぱい。
16/12/21 04:35:52.23 .net
文字列から実行して、返り値も標準出力も格納したいんだけど

testCmd="なんかのコマンド"
result=$(eval testCmd)

この後の$0はevalの返り値なのかtestCmdの帰りなのかよくわからんのですが

837:名無しさん@お腹いっぱい。
16/12/21 05:11:40.55 .net
>>821

$0 ってどういうこと?
$? の間違いなら man bash の eval に書いてある。

838:名無しさん@お腹いっぱい。
16/12/21 06:35:22.65 .net
普通に考えるなら

export testCmd="コマンド"
$testCmd > ログファイル
戻り値=$?

839:名無しさん@お腹いっぱい。
16/12/21 06:47:35.19 .net
ちなみにスクリプトにすると
result=`$testCmd`
で標準出力が入って
$?でも戻り値は取れるけど
標準エラー出力は取れないね

840:名無しさん@お腹いっぱい。
16/12/21 11:34:52.01 .net
失礼いたしました$?ですね

testCmd="なんかのコマンド"
result=$(eval $testCmd)

returncode=$?

標準エラーはいらんのですが
プロセス置換?とかでできるのかな

841:名無しさん@お腹いっぱい。
16/12/22 09:27:10.08 .net
いまいち何を訊きたいのか分からん。
$?はevalの終了ステータスが設定される。evalの終了ステータスはtestCmdの終了ステータスが設定される

842:名無しさん@お腹いっぱい。
16/12/22 12:40:53.01 .net
> この後の$0はevalの返り値なのかtestCmdの帰りなのかよくわからんのですが

マニュアル読んでわかんなきゃ試してどうなるか調べないと
正常終了するコマンドだけじゃなくてそれ以外もね

843:名無しさん@お腹いっぱい。
17/01/15 17:41:24.20 .net
[ .... ] を [[ .... ]]に単純に置き換えて問題あります
でしょうか?

844:名無しさん@お腹いっぱい。
17/01/15 18:20:34.24 .net
コマンドの引数を変数化したときって、どうやってその変数をコマンドに渡せばいいの?

#!/bin/bash
opts=“-f $file”
hoge $opts

これだと hogeコマンドが unrecognized option エラーになってしまう。
初歩的な質問ですまん

845:828
17/01/15 18:27:02.19 .net
スマソ、自己解決
$fileが不正だっただけやん

846:名無しさん@お腹いっぱい。
17/01/16 21:28:07.13 .net
>>828
URLリンク(mywiki.wooledge.org)
> [[ is not defined by POSIX, originated in ksh and is also present in zsh

847:名無しさん@お腹いっぱい。
17/01/17 21:34:40.69 .net
bashでif使って変数に"ok"が入ってるかはどうやって確かめればいいんでしょうか?
if [ $a = "ok" ]; then
echo hoge
else
echo fuga
fi
の様にしているのですが"ok"が入っていても別の文字列が入っていてもfugaが出力されてしまいます

848:名無しさん@お腹いっぱい。
17/01/17 21:59:37.47 .net
$a の中身が引用符の無い裸の
ok
ならば真になるはず

849:名無しさん@お腹いっぱい。
17/01/17 22:02:25.13 .net
できればそのままやりたいんです
cutかなんかで事前に削るしかないですかね?

850:名無しさん@お腹いっぱい。
17/01/17 22:14:16.11 .net
831 の "ok" を '"ok"' または "\"ok\"" にすれば

851:名無しさん@お腹いっぱい。
17/01/18 09:13:18.95 .net
引用符付きの文字列なの?

852:名無しさん@お腹いっぱい。
17/01/18 11:40:24.29 .net
>>835
\"でうまく行きました
ありがとうございます
>>836
そうです
"ok"か"error"、またはそれ以外の文字列(引用符なし)が入ってる

853:名無しさん@お腹いっぱい。
17/01/21 12:38:14.00 .net
使ってないと何もかも忘れる・・

854:名無しさん@お腹いっぱい。
17/01/21 16:06:57.66 .net
忘れるで思い出した、シェルスクリプトと関係ないけどinfoでいつも迷子になるわ俺

855:.
17/01/21 20:26:15.12 .net
これってどうかな?
URLリンク(gihyo.jp)

856:名無しさん@お腹いっぱい。
17/01/21 21:16:52.05 .net
configure全部読めば桶

857:名無しさん@お腹いっぱい。
17/01/23 23:25:46.35 .net
httpdのログでIP直でアクセスして来たIPをbanするスクリプト作ってcronで回すようにした

858:名無しさん@お腹いっぱい。
17/01/23 23:40:12.97 .net
接続しに来た全IPをBAN判定する負荷のほうが高くなりそうだね

859:名無しさん@お腹いっぱい。
17/01/23 23:46:44.50 .net
blockはpfでやってるけど、負荷があるのかわからない。たいして無いように思う。前は中国IPを全部はじいてたけど、特に不都合はなかった

860:名無しさん@お腹いっぱい。
17/02/05 17:07:27.34 .net
ビギナーなんですが、教えてくれませんか。
for i in {1..3}
do
echo $i
done

1
2
3
ではなく{1..3}が出力されます。どうして?

861:名無しさん@お腹いっぱい。
17/02/05 17:13:16.91 .net
bash じゃないから

862:名無しさん@お腹いっぱい。
17/02/05 17:15:56.58 .net
>>846
ありがとう・・・ありがとう・・・

863:名無しさん@お腹いっぱい。
17/02/05 19:26:02.43 .net
もう一個お願いします。
testを
1
2
3
というファイルだとして、
cat test|while read line; do sed -e "s/.*/a/"; done
をやると
a
a
a
ではなく
a
a
となるのはなぜですか?

864:名無しさん@お腹いっぱい。
17/02/05 20:04:29.97 .net
ホントは、

cat test|while read line; do echo "$line" | sed -e 's/.*/a/'; done

ってしたいんじゃない?

cat test|while read line; do sed -e "s/.*/a/"; done

だと、1行目を read が喰って、2行目以降は全て sed に入力される
ことになるよ。

865:名無しさん@お腹いっぱい。
17/02/05 20:26:43.25 .net
>>849
ありがとう・・・。そういう仕組みになってるのは知らなかった。

866:名無しさん@お腹いっぱい。
17/02/08 13:58:57.76 .net
list.txt に書いてあるファイルを一括で転送するスクリプトを書いたのですが、
これに送信前と送信後のmd5を比較して、一致しなかったら再送させるにはどうすればいいですか?
URLリンク(pastebin.com)

867:名無しさん@お腹いっぱい。
17/02/08 23:14:15.74 .net
一度 mvしてしまったものは再送出来ない


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch