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


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

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



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

377 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/13(金) 19:12:36.61 .net]
${HOGE}はbashに限らないよ

378 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:33:15.35 .net]
>>372
誰へのレス?

379 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:33:50.98 .net]
>>370
Linuxの質問はLinux板で

380 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:37:55.44 .net]
>>370

くだらねえ質問はここに書き込め!Part 229
mao.5ch.net/test/read.cgi/linux/1505217859/

初心者の質問相談にやさしく答えるスレ Part9
mao.5ch.net/test/read.cgi/linux/1504269873/

381 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/14(土) 00:56:47.50 .net]
>>370
もしかしてこの人?
https://mao.5ch.net/test/read.cgi/linux/1504269873/343

382 名前:370 mailto:sage [2017/10/14(土) 00:58:01.90 .net]
あぁ、すまん
>>371へのレスか
たしかに${HOGE}記法はたいていのshで使えるね

383 名前:370 mailto:sage [2017/10/14(土) 00:58:50.55 .net]
>>371じゃなくて>>370か、、、

384 名前:名無しさん@お腹いっぱい。 [2017/10/20(金) 11:02:46.23 .net]
>>377
何を言ってるのがわからん。bshが元祖なのに。

385 名前:370 mailto:sage [2017/10/20(金) 17:00:36.31 .net]
余計なレスだったんでわからんならわからんでいいよ



386 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:22:29.89 .net]
スレチ気味だけど,ある種の Shell って,
$ cd ///////
みたいなことをするとルートディレクトリだと認識するんだな。
個人的に ~ がすごく打ちにくい位置にあるので // を ~ だと解釈させようと試行錯誤してるときに発見した。
これはルートディレクトリが特別って訳じゃなく,
$ ls /usr////bin///////
みたいなことでも問題ない。ということは // == ~ にすることは Shell のソース弄るくらいしか方法がないということになる。
俺みたいな無駄な努力をしないために残す

387 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:32:07.61 .net]
それシェルの機能じゃなくね?

388 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 01:36:03.89 .net]
こういうのも開けるし
https://mevius.5ch.net///test////read.cgi/////unix//////1489979246///////l50

389 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 08:08:40.09 .net]
もしかして RFC とかで実装が統一されてんのか。

390 名前:370 mailto:sage [2017/10/21(土) 14:49:37.55 .net]
>>381
cdについてはPOSIXで決まっている
pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html
の8のc

>>382
シェル一部であるcdコマンドの機能

>>383
それはまた別の話

391 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 14:51:29.58 .net]
$ /bin/echo /usr////bin///////
/usr////bin///////
$

となるので、lsについてはシェルが解釈してるわけではなくlsが解釈していると思われる

392 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 14:55:41.90 .net]
まあ//を~にしたいならシェルのキーバインド使えばいいんじゃないですかね

393 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 15:01:35.03 .net]
ちなみにこんなんなったりする
シェルの種類によって挙動は違うかも

$ cd //
$ pwd
//
$

理由は
www.unixguide.net/unix/bash/E10.shtml

394 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/21(土) 15:03:36.25 .net]
キーバインドいじっちゃうと
「http://」を打とうとして「http:~」になったりして困らないか

395 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 16:52:10.67 .net]
>>385
「An implementation may」だから必ずではないのでは



396 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 21:04:49.39 .net]
必ずって言ったっけ

397 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 21:24:08.21 .net]
bashはパス中の複数の/を一つにするはず

398 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/22(日) 22:40:16.51 .net]
>>392
>>388

399 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:24:16.45 .net]
ファイルをリネームしてコピーし続けるスクリプトなんですが
コマンドが見つからないと出てよくわかりません

#/bin/sh

PATH='/var/log/'
PATH2='dnsmasq.log'
DOT='.'

for i in 6 5 4 3 2 1
do
PATH3=$PATH$PATH2$DOT$i
PATH4=`expr $i - 1`
PATH5=$PATH$PATH2$DOT$PATH4
mv $PATH5 $PATH3
done

PATH6=0

mv $PATH$PATH2 $PATH$PATH2$PATH6

exit 0

400 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:29:36.84 .net]
>>394
for VAR in ARGS; do
command;
done

401 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:30:47.44 .net]
sh -xで実行してみると以下の通り出力されました
+ PATH=/var/log/
+ PATH2=dnsmasq.log
+ DOT=.
+ PATH3=/var/log/dnsmasq.log.6
+ expr 6 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.6
./splitLog.sh: 12: ./splitLog.sh: mv: not found
(省略)
+ PATH3=/var/log/dnsmasq.log.1
+ expr 1 - 1
./splitLog.sh: 1: ./splitLog.sh: expr: not found
+ PATH4=
+ PATH5=/var/log/dnsmasq.log.
+ mv /var/log/dnsmasq.log. /var/log/dnsmasq.log.1
./splitLog.sh: 12: ./splitLog.sh: mv: not found
+ PATH6=0
+ mv /var/log/dnsmasq.log /var/log/dnsmasq.log0
./splitLog.sh: 17: ./splitLog.sh: mv: not found
+ exit 0

402 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:46:18.65 .net]
とりあえず何がしたいかを書け
そんな汚いもん見せられても何がしたいのか分かりにくい

403 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 13:51:57.00 .net]
PATH潰すんなら外部コマンドはフルパスで書かんと

404 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:02:38.34 .net]
フルパスで書かないといけなかったんですね…


405 名前:修正してみたらできました、ありがとうございます! []
[ここ壊れてます]



406 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:11:58.47 .net]
ようわからんがsavelogコマンドみたいなことがしたいのか

407 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 14:27:19.72 .net]
PATHがきしょい

408 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:33:20.43 .net]
>>399
「フルパスで書かなきゃいけない」のではない
$PATHを上書きするのがマズい

409 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:35:16.21 .net]
これ1〜6までファイル全部消えるんじゃね?

410 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 15:35:32.78 .net]
1から6まで

411 名前:400 mailto:sage [2017/10/26(木) 15:37:15.23 .net]
あ、すまん勘違い
逆だった

412 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:21:22.80 .net]
5を6にリネーム~0を1にリネーム
そのあと最新のログを0にリネームじゃないかな
どっちにしろゴリ押し感半端ないが

413 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:30:18.25 .net]
>>402
$PATHって環境変数ですよね…
何故気づかなかったんだろう
お恥ずかしい限りです

414 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 16:37:04.75 .net]
あーそういうことか、403のお陰でやりたいことは分かった

415 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 18:34:54.50 .net]
こうすればわかりやすいですかね

#!/bin/sh

DIR=/var/log/
FILE=dnsmasq.log;
START=0

for i in `seq 1 6`
do
DEC=`expr $i - 1`
cd $DIR
mv "${FILE}.${DEC}" "${FILE}.${i}"
done

cd $DIR
mv $FILE "${FILE}.${START}"

exit 0



416 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 18:56:39.92 .net]
毎回cdするのは無駄やろ

417 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 19:01:29.48 .net]
個人的にexpr嫌いなのもあって$(())使っちゃうな
mv "${FILE}.$((i-1))" "${FILE}.$i"
あとseq間違ってね?
seq 6 1 -1

418 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/26(木) 19:25:35.16 .net]
これだと全部ログ.0になっちゃいますね
ありがとうございます!

419 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 17:54:16.26 .net]
logrotateの真似したいのかな

420 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 19:36:18.05 .net]
素直にそっち使った方が楽に出来るよね

421 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/28(土) 22:25:53.38 .net]
そっちを使うほうが楽、ということを学習するにはまずは自分で書いてみて、大変だぜてことを理解しないと

422 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:10:26.11 .net]
昔solarisで見たlogrotateはshell scriptだった
どこかで見れれば参考になるかも

423 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:39:18.79 .net]
あれはあんまりきれいじゃないから参考にしない方がいい

424 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 13:48:20.70 .net]
この /usr/lib/newsyslog ね
www.tcp-ip.or.jp/~ikken/intra/check.txt

425 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/10/31(火) 15:47:40.56 .net]
シェルスクリプト
https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/debianutils/4.4/file/usr/bin/savelog
マニュアルページ
https://manpages.debian.org/jessie/debianutils/savelog.8.ja.html



426 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/02(木) 04:12:26.82 .net]
これ?
https://goo.gl/En6m3D
www.bityet.us/s7b47si.jpg

427 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 04:26:36.66 .net]
X Windows System で,どの IMF が用いられているか判別する方法を考えている。
思い付いたのは $XMODIFIERS 環境変数を用いた
case $XMODIFIERS in
  *ibus)
    local _imf=ibus
    ;;
  *fcitx)
    local _imf=fcitx
    ;;
  *uim)
    local _imf=uim
    ;;
  *SCIM)
    local _imf=scim
    ;;
esac
なんだけど,$XMODIFIERS が必ず設定されているとは限らないし,なんか漏らしてる気がしてならん……。

428 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 04:29:53.86 .net]
ツールで投稿したら空白がエラいことになった。すまん。

429 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 07:20:14.85 .net]
Shell Scriptのコメントアウトに
# @(#) Foo is foo.
みたいな文字を書いておいて
$ what ./foo.sh
とやると
Foo is foo
という表示がでるというようなwhatコマンドがあるらしいのですが
手元のFedora26に見付かりません。($ dnf search what, $ dnf provides what)
どこかにありますでしょうか。

430 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 08:32:21.55 .net]
Linuxの質問はLinux板で

431 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/03(金) 10:09:39.61 .net]
>>423
whatはかつて使われていたSCCSというソースコード管理システムに入っていたコマンド
現在はGNU CSSCがSCCSと同等の機能を提供している
なのでcsscというパッケージを探す
なければhttps://www.gnu.org/software/cssc/へGO!

432 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:39:18.57 .net]
case文で

$1がhogeで、$2がhageの場合のみ処理Aを実行する

みたいなのできないでしょうか?

433 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:49:53.05 .net]
入れ子にすりゃいい

434 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 15:56:36.27 .net]
$1にも$2にも含まれ得ない文字を区切りにして連結

435 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 16:00:08.82 .net]
>>425
ありがとうございます。依存地獄に嵌ってしまいあきらめました,教えてもらったのにすいません。
また,御礼がおそくなってもうしわけないです。



436 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 16:22:06.48 .net]
caseで実装するなら入れ子かね
しかしここでも髪の話するのか

437 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 17:07:40.56 .net]
>>427
>>428
>>430

入れ子にできることを全然知らず
こんな感じかなでやってみたらいけました
皆さん短時間にありがとうございます

>>430
他意はありませんw

438 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/11/20(月) 18:39:46.60 .net]
>>430
気にし過ぎだろ
さっさと剃れよ

439 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 09:15:00.24 .net]
すみません、bashでタブ区切りのファイルを配列に取り込む際、空の列が詰めて格納されてしまいます
そうならない方法はあるのでしょうか

exec < file.tsv
while read LINE
do
ARRAY=(${LINE})
done

440 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 10:11:05.91 .net]
>>433
変数の参照部分を引用符で囲むとか。
#!/bin/sh -

exec < file.tsv
while read LINE; do
ARRAY=("$LINE")
done
echo "$ARRAY"
IFS の値を空にするとか。
#!/bin/sh -

IFS=
exec < file.tsv
while read LINE; do
ARRAY=($LINE)
done
echo $ARRAY

441 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/02(土) 10:16:16.70 .net]
あ,5ch ってコード貼るのまずいんだっけ。しくったな。
まあこんなくだらないコードに著作権云々関係ないかw

442 名前:名無しさん@お腹いっぱい。 [2017/12/02(土) 10:37:47.62 .net]
>>433
bash なら mapfile がある(別名 readarray)
-t オプションで各行末尾の改行を取除く

mapfile -t ARRAY <file.tsv

443 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/03(日) 07:15:44.68 .net]
早速検証してみます、ありがとうございます!

444 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/05(火) 08:37:43.17 .net]
検証した結果、IFSを改行のみにして読み込み、その文字列をCutで抜くで達成できました
こうしないと空文字の列が詰まってしまいました

IFS_BAK=IFS
IFS=$'&#165;n'
exec < file.tsv
while read LINE
do
echo "${LINE}" | cut -f1 >> tmp1.txt
echo "${LINE}" | cut -f2 >> tmp2.txt
done
IFS=IFS_BAK

445 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/05(火) 09:20:20.37 .net]
>>438
重箱の隅を突くようで悪いが,その書き方をするならシェバンは #!/usr/bin/bash
にしておけ。
$'string' は Bash の独自拡張だった気がする。



446 名前:433 [2017/12/06(水) 10:04:48.53 .net]
>>433
今ごろ勘違いに気づいた
mapfileじゃ全然見当外れじゃないか…なんかごめん

たとえば
IFS=$'\t'
line="${IFS}b"
このとき
a=(${line})

a=("" "b")
となるのを期待しているのだけど、実際にはクオートしていないので
a=( b)
と同じことになって、先頭の「空の列」は残らない
かといってクオートしたら
a=("${line}")
これはタブ区切りで分割されることなく行全体がそのままになるので意味がない…

ということだよね
>>438のようにファイルに書き出すだけなら、そう

447 名前:やってcutでやるのが扱いやすそうだけど

もしどうしても配列にする必要があるときは、こんな感じでどうだろう
https://ideone.com/uPfCwc
空だと消えてしまうなら空にならないよう何か入れとけばいいじゃない(配列にしてから取り除く)
という案
[]
[ここ壊れてます]

448 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/11(月) 05:34:31.40 .net]
>>440
回答が遅れてすみませんでした

なるほど…その手はいけるんですね
ありがとうございます、活用させていただきます
自分は今回縛りがあってbashだけでやっているのですが、可能なら他のスクリプトに任すべきかな…(´・ω・`)

449 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/12/14(木) 00:31:41.37 .net]
そこは「他のシェルに」じゃないか

450 名前:名無しさん@お腹いっぱい。 [2017/12/29(金) 06:50:06.02 .net]
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

PPEE18BYYA

451 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 17:53:30.81 .net]
はじめまして
早速で申し訳ないのですが、以下のシェルスクリプトでdoを含むコマンドが一切使用できません。理由と解決策を教えてください。

#!/bin/sh
dir=`dirname ${0}`
echo -n "探す拡張子="
read que
ans=$(find ${dir} -name *.${que} | awk -F/ '{print $NF}')
if [ -z "${ans}" ];then
echo "${que}は見つかりませんでした。\n終了します。"
exit
else
echo "${ans}"
fi

452 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 17:59:26.22 .net]
>>444
すみません訂正します。
select文のみどこに書いてもSyntax error: "do" unexpectedというエラー出てしまいます。

453 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 18:43:33.26 .net]
doが何のこと言ってるのかよくわからんが実行の仕方が間違ってんじゃね
まず問題がどこにあるかを明確に切り分けろ

454 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 20:31:51.74 .net]
>>446
さっき書き直したのですが、改善しませんでした。
エラー内容はさっきと同じで、 Syntax error: "do" unexpectedです。
441でも、どこに記述しても変わらなかったため、問題の部分を消して使っていたので、doの部分を貼り忘れてました。すみませんでした。

#!/bin/sh
dir=`dirname ${0}`
echo -n "検索する拡張子:"
read que
while [ -z "${que}" ]
do #ここのdoは問題なし。
echo -n "拡張子を入力してください。\n検索する拡張子:"
read que
done
ans=$(find ${dir} -name *.${que} | awk -F/ '{print $NF}')
if [ -z "${ans}" ];then
echo "${que}は見つかりませんでした。\n終了します。"
exit
else
echo "${ans}"
fi
#============ここから問題の部分===========
select var in ${ans}終了
do
if [ ${var} = 終了 ];then
exit
fi
if [ ${que} = gz -o xz];then
tar -xf ${dir}${var}
fi
done

455 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 20:59:27.67 .net]
xz ]やないの?

シンタックスエラーって出てるんだからまず自分を疑おう



456 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 21:01:57.76 .net]
どこに貼ってもだめならselectの構文がなんかおかしいんじゃないの

457 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 21:16:18.25 .net]
>>448
スペース入れても変わりませんでした。

>>449
構文がおかしい部分を自分では見つけられませんでした。

458 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 21:41:13.34 .net]
do unexpectedなら直前の「${ans}終了」ちゃうんけ

459 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 22:01:36.46 .net]
>>451
変数じゃなくしても、終了を消しても、別の変数に変えてもSyntax error: "do" unexpectedは消えませんでした。

460 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 22:17:55.91 .net]
とりあえず「間違いなく動作する」select構文をまず単品で書け
ネットのコピペでも構わん。出来る限りシンプルなやつで
動いたならそれを少しずつ改造して動かしてを繰り返しつつお前の目的に近づけろ

461 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 22:28:27.56 .net]
shでselectってできたっけ

462 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/08(月) 23:44:18.33 .net]
SC2039: In

463 名前: POSIX sh, select loops are undefined.
bashならとりあえず動く、#!/bin/bash にしとけば
[]
[ここ壊れてます]

464 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 23:56:10.56 .net]
>>453
ありがとうございます。コピペ&作り直しでできました。

>>454
Ubuntuでやっていたのでできました。

>>455
書き換えました。


皆様ありがとうございました。
もしかしたら似たようなものがすでにあるかもしれませんが、とりあえずできたものを>>454に貼っておきます。

465 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 23:57:24.21 .net]
#!/bin/bash
PS3="入力してください:"
menu="曖昧 前方一致 後方一致 完全一致 拡張子"
echo "検索するディレクトリを入力してください
入力しなかった場合、このファイルがあるディレクトリを検索します。"
while [ -z "${dir}" ]
do
echo -n "ディレクトリ入力:"
read dir
if [ -e "${dir}" ];then
break
else
unset dir
echo "そのようなディレクトリはありません。"
fi
done
echo "検索方法を選択してください:"
>>455に続く



466 名前:名無しさん@お腹いっぱい。 [2018/01/08(月) 23:58:02.00 .net]
>>457続き
select var in ${menu}
do
echo ["${var}"]で検索します。
echo -n "検索する単語を入力してください:"
read que
case "${var}" in
曖昧)
ans=$(find ${dir} -name *"${que}"*);;
前方一致)
ans=$(find ${dir} -name "${que}"*);;
後方一致)
ans=$(find ${dir} -name *"${que}");;
完全一致)
ans=$(find ${dir} -name "${que}");;
拡張子)
ans=$(find ${dir} -name *."${que}");;
esac
echo "${ans}"
exit
done

467 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/09(火) 07:32:28.94 .net]
正直見辛いしその程度なら一行コマンド打つんでいらないっす

468 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/09(火) 12:43:53.77 .net]
* が展開されてうまく動かなかった

469 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/09(火) 20:01:44.41 .net]
Linuxの話ならLinux板で聞いてください

470 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/10(水) 13:12:44.56 .net]
odコマンドって規定で行番号は付くは省略するわでほんとUNIX哲学的じゃねーな
xxdとかのほうが遥かに扱いやすいわ

471 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/10(水) 16:21:53.96 .net]
行番号ちゃうし

472 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/11(木) 12:57:39.11 .net]
od -An -v

473 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/13(土) 15:24:43.34 .net]
規定がっていう話でしょ
それと同じで ls も規定で勝手に表示を整えるのをやめてほしい。
Plan 9のlsは規定でls -1みたいな挙動らしいけど。

474 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/13(土) 15:30:27.80 .net]
規定なら従っといた方がいいじゃん
罰則あるかもしれんし

475 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/13(土) 15:31:53.68 .net]
それは規約じゃ



476 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/13(土) 19:01:27.06 .net]
default = 既定

477 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/13(土) 22:58:37.21 .net]
違反すると罰則あるのは規定じゃなくて規約だろって話

478 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 10:57:30.90 .net]
だから「Default=規定」って書いたんじゃねーの?
規約じゃないって意味で。

479 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 11:45:22.78 .net]
ワケワカメ

480 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 15:52:04.52 .net]
なんだこの流れ
全員頭悪いの?

481 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 16:00:17.68 .net]
流れ?

482 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 16:20:16.87 .net]
全次郎?

483 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 17:49:06.78 .net]
規約じゃなくて規定なら別に従う必要ないって話なだけじゃないのか

484 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 17:50:28.44 .net]
default=既定≠規定

485 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 19:12:18.41 .net]
>>465の誤字を>>466が茶化したのに理解されずにグダグダになった流れ



486 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 19:28:08.33 .net]
すまん誤字に全く気付かなかった

487 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/14(日) 19:34:54.90 .net]
あーなるほどそういうことか。
普通に「既定」に脳内変換してたせいで意味不明な喧嘩に見えてたわ

488 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/15(月) 00:06:01.79 .net]
脳内変換てw馬鹿なだけやんかw

489 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/15(月) 08:02:47.35 .net]
すぐそうやって火種を撒く……

490 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/15(月) 22:28:34.05 .net]
$'\n' こういう $'何か' っていう書き方って bash 限定?
sh でもいける?

491 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/16(火) 12:48:12.73 .net]
bash限定

492 名前:名無しさん@お腹いっぱい。 mailto:age [2018/01/16(火) 15:07:55.74 .net]
POSIX xargs
pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
には-0オプションがありませんが,どうにかしてxargsにナル文字区切りのデータを渡せませんかね。
もしくは xargs -0 がエラーになるOSをご存知でしたら教えて下

493 名前:さい。
FreeBSD, MacOS, Debian GNU/Linuxともにxargsに-0オプションはありました。
[]
[ここ壊れてます]

494 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/16(火) 16:09:39.07 .net]
Solarisとかあやしそうだね

495 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/17(水) 00:51:10.26 .net]
>>485
そうみたいね
https://unix.stackexchange.com/questions/67193/solaris-xargs-command-for-solaris
https://docs.oracle.com/cd/E19253-01/819-1210/6n3j74k03/index.html



496 名前:481 mailto:sage [2018/01/17(水) 04:46:35.14 .net]
>>485
>>486
ありがとうございます。
ファイルパスに関するシェルスクリプトを作ろうとしており,
ファイル名に改行文字が含まれている場合を考慮してナル文字区切りでデータを扱いたかったのです。
が,もうそんな特殊なファイル名にしている側の責任ってことにします。
仕事だったらもうちょっと考えるところですが個人で扱うので自分が気をつければいいだけなんで。

リンク等ありがとうございました。

497 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/17(水) 08:37:13.99 .net]
pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html
POSIXのfindには+終端もあるみたいだから、
用途によってはxargsを使わずに変なファイル名が扱えることもある。
例によってSolarisにはないが、POSIXに準拠してないということで切れる。

498 名前:481 mailto:sage [2018/01/17(水) 09:45:47.24 .net]
>>488
ありがとうございます。

> 例によってSolarisにはないが、POSIXに準拠してないということで切れる。

恥かしながらSolaisってPOSIX準拠を謳っていないことを今知りました……
よくシステムコールAPIの説明で「SolaisまたはPOSIX」とありますが,
その真意をようやく掴めました。

---
awkのRSにナル文字を指定できればxargsの代替として使えるかもしれないと思ったんですが,
$ printf '%s\0%s\0%s' 'First' 'Second' 'Third' | awk -v RS="$(printf '\0')" '{ print $0 }'
みたいなことをやっても撥ねられる
(シェルがナル文字についての警告を出して,「FirstSecondThird」とだけ表示される)
のでやっぱりナル区切りを扱うのはやめておこうと思いました。
大人しく空白区切り・改行レコードで行きます。

499 名前:481 mailto:sage [2018/01/17(水) 09:55:31.15 .net]
なんかこうすると上手く行った (ように見えます)。

$ printf '%s\0%s\0%s' 'First' 'Second' 'Third' | \
awk ' \
BEGIN {
RS="\0"
ORS="\n"
}
{
print
} \
'

なんでこれが良くて >>489 がだめなのか分からないのが怖いので結局ナル文字区切りはやめることにしました。
連投&スレ汚し失礼しました。

500 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/18(木) 11:41:43.86 .net]
sedでiフラグをdフラグと一緒に使うことはできないのでしょうか。

501 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/18(木) 11:44:10.00 .net]

sed
mevius.2ch.net/test/read.cgi/unix/1085730992/

502 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/18(木) 19:40:41.47 .net]
>>492
誘導ありがとうございます。一応の解決を見ました。

503 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/26(金) 00:50:46.41 .net]
hoge.sh <(cat hoge.txt fuga.txt piyo.txt)

### hoge.sh
#!/bin/bash
wc -l $1 # 正しい行数
wc -l $1 # なぜか0

おせーてエロいひと

504 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/01/26(金) 06:57:46.46 .net]
>>494
つ cat hoge.txt fuga.txt piyo.txt | (wc -l; wc -l)

505 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/01(木) 22:35:58.02 .net]
こういうhoge.shがあったとして
```
#!/bin/bash
set -x
for x in aa bb cc; do
echo $x
done
```
実行するとこうなる
```
$ bash hoge.sh
+ for x in aa bb cc
+ echo aa
aa
+ for x in aa bb cc
+ echo bb
bb
+ for x in aa bb cc
+ echo cc
cc
```
けどこうしたい(forやifが出力されないようにしたい)
```
$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc
```
どうしたらいい?



506 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/01(木) 22:38:33.65 .net]
つづき。ためしにこうしてみた
```
#!/bin/bash
for x in aa bb cc; do
set -x
echo $x
set +x
done
```
実行したら set +x も表示された(これは

507 名前:いらない)
```
$ bash hoge.sh
+ echo aa
aa
+ set +x
+ echo bb
bb
+ set +x
+ echo cc
cc
+ set +x
```
[]
[ここ壊れてます]

508 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/01(木) 22:40:28.83 .net]
grep -vでもしたら

509 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/01(木) 23:21:30.45 .net]
echo $x
の前に
echo + echo $x
と記述する

510 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/01(木) 23:48:49.07 .net]
bashだからじゃね?

511 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/02(金) 01:26:01.46 .net]
fishてどう?

512 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/02(金) 01:47:58.90 .net]
$ cat hoge.sh
#!/bin/bash
for x in aa bb cc; do
(set -x
echo $x)
done

$ bash hoge.sh
+ echo aa
aa
+ echo bb
bb
+ echo cc
cc

なんつって

513 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/02(金) 08:54:06.42 .net]
>>502
> (set -x
> echo $x)
この方法でできました。ありがとうございます。
もっと簡潔に書けるといいのだけど。

514 名前:名無しさん@お腹いっぱい。 [2018/02/08(木) 16:21:59.61 .net]
すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど
i=256;j=0 ; while [ ! $i -eq 1 ] ; do i=$(( $i /2 ));echo $i; j=$(($j + 1)) ; done ;echo ans:$((32 - $j))

もっとてっとり早く出すコマンドはありませんか? できれば256を入れたら8とかさっさと返してくれるような奴を
あとよくわからんけど 計算で256と2を入力したら後ろの8とかを出すコマンドはないですか?
覚えるとか調べるは嫌いなんで、なるべく手間のかからないものを教えてください
 

515 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/08(木) 17:19:18.65 .net]
サブネットマスクぐらい暗記か手計算しろよ



516 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/08(木) 18:06:11.03 .net]
>覚えるとか調べるは嫌いなんで、

生きてる意味あんのか、これで?

517 名前:名無しさん@お腹いっぱい。 [2018/02/08(木) 19:05:19.51 .net]
>>505
手間がかかるから面倒だよ
20万以上やるし

ああ これででるのね うしろに変なゴミが付いてるがどうでもいいか
:echo " l(65556)/l(2)" | bc -l
16.00044020841915062248
:echo " l(1024)/l(2)" | bc -l
10.00000000000000000010
>>506
また努力するするのが誇らしいとか思ってる馬鹿?ww
俺が考えるならこの機械とか利用価値はないよ
ゲーム開発のUNITYのスレに行けば似たような奴が沢山いるよ

まぁしばらくはマシーンを買う金がないからlinuxとイヤイヤ付き合うしかないが
ほんと手間がかかるな

518 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/08(木) 19:20:30.57 .net]
ある意味面白いやつだな

519 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/08(木) 20:11:48.67 .net]
>また努力するするのが誇らしいとか思ってる馬鹿?ww

こんなこと考えたこともないけど
思い込みが激しいっていうか頭腐ってるだろ
ああ死んでるんだったっけ

520 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/08(木) 20:31:31.63 .net]
落ち着け

521 名前:名無しさん@お腹いっぱい。 [2018/02/08(木) 20:57:59.75 .net]
>>509
そういう手間が掛かるのはちょっと…
利用価値がないし

522 名前:名無しさん@お腹いっぱい。 [2018/02/08(木) 21:47:56.46 .net]
バイト雇って計算してもらいましょう

523 名前:名無しさん@お腹いっぱい。 [2018/02/08(木) 23:17:47.05 .net]
>>512
俺自体が無職だよ

さて間抜けからビットコインを盗まんと

524 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/09(金) 01:51:26.42 .net]
>>513
頼むわ
間抜けは存在自体がガンだから

525 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/09(金) 09:19:26.94 .net]
犯罪の予告と教唆かよ



526 名前:名無しさん@お腹いっぱい。 [2018/02/09(金) 22:09:51.06 .net]
>>515
予告と教唆じゃなくて実行中だよ
とろくさいやつだなw
or2.mobi/index.php?mode=image&file=193749.jpg
or2.mobi/index.php?mode=image&file=193750.jpg

3週間たってだいぶリナックスにも慣れてきた
ある程度稼がせてもらったらウインドウズに戻るよ
ライブは少し使いにくい

527 名前:名無しさん@お腹いっぱい。 [2018/02/09(金) 22:12:54.21 .net]
なんかシェルスクリプト総合とか書いてあったから来てみたけど
しょぼそうな連中しか居ないけど…

ここのひとってシステム管理とかで食ってる連中が多いの?

528 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/09(金) 22:39:19.88 .net]
煽ったらなんかもらえるのか?

529 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/09(金) 22:54:21.43 .net]
なんか急に変なの出てきたな
どっかにスレのアドレスでも貼られたのか

530 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/10(土) 00:05:29.76 .net]
いや元々お前らの方がずっと変だけどw

531 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/10(土) 05:51:23.70 .net]
変と思いながら見続けて今さあながら「変だ!変だ!」と言う人って・・・

まあ相手にされるかは別にして居たいなら居ていいと思うよ

532 名前:名無しさん@お腹いっぱい。 [2018/02/10(土) 11:31:48.71 .net]
>>517
面白いネタがあれば食いつくんじゃない?
つまらんネタしか無いから過疎ってる。

533 名前:名無しさん@お腹いっぱい。 [2018/02/10(土) 19:55:51.78 .net]
ほんとに揃いも揃っておまえらは無能な連中だよ
こんな能無し共が良いかねを取って裕福な生活をしてるのに
何で俺がしこしこビットコインを盗まんとならんのか……
よしよしw 今日はあがりはデカそうだな

534 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 20:16:20.69 .net]
1111
2222
3333
という内容のファイルに対して,
• 3333 が見付かれば 3333 を,
• 見付からなければ 2222 を
• ⋮
という操作を施したいです。そして,これをパイプに繋ぎたいです。
私が考えたのは↓のスクリプトですが,
for q in 3333 2222 1111; do
cat <<-'EOF' |
1111
2222
3333
EOF
grep $q && break
done
難点があります。
1. パイプでファイルを渡せない。
2. 順番に依存している (実際のファイルでは 3333 が最後にくるとは限らない)
どうか助言願います

535 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 20:19:41.66 .net]
あ,すいません。期待する動作は,
かりに理想のスクリプトを idea.sh として,
$ cat ./org.txt
2222
3333
1111
$ cat ./org.txt | idea.sh
3333
$ cat ./org.txt | sed -e '/3333/d' | idea.sh
2222
$ cat ./org.txt | sed -e '/3333/d' -e '/2222/d' | idea.sh
1111
という感じです。



536 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 21:01:11.15 .net]
標準入力を受け取れるように作ればいいんじゃないの?

idea.sh
sed -e "/$1/d" < /dev/stdin

$ cat ./org.txt | ./idea.sh ‘3333’ | ./idea.sh ‘2222’ | ./idea.sh ‘1111’

537 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 21:10:36.33 .net]
awk使うのが妥当。
awkが嫌なら、標準入力をファイルにコピーしてから複数回に分けて処理するしかないな。

538 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 21:26:45.83 .net]
やりたい事はシンプルなのに標準入力使おうとしてるせいで妙に面倒になってるな
awkかgrepでよさそうだが

539 名前:名無しさん@お腹いっぱい。 [2018/02/15(木) 21:36:30.68 .net]
事前にソートしたら?

540 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 21:38:59.09 .net]
tacは?

541 名前:名無しさん@お腹いっぱい。 [2018/02/15(木) 21:41:36.03 .net]
$PATHの中身って最初は空じゃないの?
$PATHをechoしてみたら,その中に
~/.bashrcや~/.bash_profileでexportされてるパス以外のモノが含まれてた
でも$PATHに初期値を設定できるならわざわざ~/.bashrcや~/.bash_profileでexportする必要なくない?
どうなってるのか教えてくれ

542 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/15(木) 22:34:13.00 .net]
OSによるけどinit.dの中とかlogin.confとかでデフォルトを設定する。
ここ書き換えると全ユーザに影響が出るので、個別設定は.bash_profileとかに書く。
exportするのは万一PATHなしで起動されてしまったとき用。

543 名前:名無しさん@お腹いっぱい。 [2018/02/16(金) 02:23:59.63 .net]
>>504
> すんませんけど 今割り当て端末数からこんな感じでサブネットマスクを出すのを作ったんですけど

ipcalcコマンドで行けるんじゃね?
知ってるだけで使ったことないけど

他にもiptabとかipcountとかあるらしいな

544 名前:名無しさん@お腹いっぱい。 [2018/02/16(金) 08:44:35.62 .net]
>>525
最初に自身で書いてたようなんで十分じゃないの?
パイプで渡せないというのが何を嫌がってんのかによるけど
テキストなら貯めてechoしたっていいんじゃ
DATA="$(cat -)" && cat $KEYWORDFILE | while read KEYWORD ; do ( echo "$DATA" | grep "$KEYWORD" ) && break ; done

データでかいから捜査対象の方を1パスで捜査したいってことなら
シェルスクリプトでがんばるより別のことでがんばろう

545 名前:名無しさん@お腹いっぱい。 [2018/02/16(金) 20:37:24.42 .net]
>>533
ありがとやっと有益なレスが出たよ
他のやつは揃いも揃って無能な役立たずばっかりだから



546 名前:名無しさん@お腹いっぱい。 [2018/02/16(金) 20:41:32.04 .net]
ショッアーーーーーーーーー!!!
さってビットコインを盗むか

547 名前:名無しさん@お腹いっぱい。 [2018/02/16(金) 21:23:29.93 .net]
アホにレスした俺もアホだった。
やっぱアホはスルーに限る。

548 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/17(土) 02:29:48.74 .net]
>>533
俺も普通は ipcalc 使ってるけど最近は sipcalc というのもあるらしい。

紹介してくれてる iptab とか ipcount 含めて今度試してみようと思う

549 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/20(火) 18:16:48.11 .net]
シェルスクリプトの函数で扱える文字数に上限はないのでしょうか。
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
↑ここが多分公式の文書だと思うのですが,使用可能な文字の種類に言及こそすれ,文字数については触れていないように思いますが……
ファイル名などの上限と同じく255文字でしょうか?

550 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/22(木) 02:57:44.82 .net]
>>539
255文字かどうかは、質問するまでもなくすぐにわかると思いますよ。

551 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/22(木) 05:46:35.30 .net]
ワロタ、試せよwそして調べろよって話だよな

552 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/24(土) 22:51:48.88 .net]
$ :> "$(yes a | head -n 255 | tr -d '\n')"
$ :> "$(yes a | head -n 256 | tr -d '\n')"
sh: 1: cannot create aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: File name too long

553 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/02/25(日) 16:39:26.69 .net]
ファイル名の文字数上限はファイルシステムに依存する

554 名前:名無しさん@お腹いっぱい。 [2018/03/03(土) 23:53:36.62 .net]
シェルスクリプトで有るコマンドを実行した時、
標準出力の内容を緑に、標準エラー出力の内容を
赤にしたいんだけどどうすればいい?

本当に聞きたいことはエスケープシーケンスではなく、
標準出力と標準エラーをそれぞれ別々に加工する方法ね

555 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/03(土) 23:53:52.11 .net]
ちなみにファイルに吐き出さずにやりたい



556 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/04(日) 01:26:00.19 .net]
お前にはなんか教えたくない

557 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/04(日) 01:40:31.82 .net]
なんかググればすぐ出てきそうな

558 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/04(日) 02:21:55.51 .net]
それがないんだよね。標準エラー出力を標準出力に
変えてしまうのは有るけど、それじゃ別々にやるのは不可能だし

559 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/04(日) 16:46:18.09 .net]
条件が厳しいからどうしてもシェルスクリプトでやりたいなら
先ずシェルを作るところから始めないといけない

560 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 00:43:32.66 .net]
bashやzshなら簡単に出来るぞ

561 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 01:06:07.74 .net]
出力を切り離してパイプで別々のコマンドでフィルタする程度じゃ全然駄目だから
こういうのを簡単にできると言い切る人はきっとものすごく優秀な頭脳の持ち主だと思う

562 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 01:28:58.62 .net]
これは書いていなかった俺が悪いんだが、
bashやzshを使わずにposixの範囲でやりたいんだよね。
少なくともdashやashで動くものがほしい

でその方法が実際にあることは知ってるんだけど、
もっとシンプルな方法はないのだろうかと言うのと
俺がその方法をここに書いちゃうと
身バレしちゃうので書かなかった

563 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 12:24:32.78 .net]
>>551
> 出力を切り離してパイプで別々のコマンドでフィルタする
だけやぞ

564 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 18:09:38.99 .net]
POSIXに準拠したい気持は分かるけど,一次ファイルを作らないっていう謎の拘りが理解できない。
両立させるのは厳しいと思う。もうさ,
tempf="$(printf '%s%s%s%s' '/tmp/' "$(date +"%y%m%d%H%M%S")" '.' "$$")"; somecmd 2> "${tempf}" | \
printf '\e[1;32m%s\e[0m\n\e[1;31m%s\e[0m\n' "$(cat)" "$(cat "${tempf}")"; rm -rf "${tempf}"
でいいでしょ。もちろんPOSIX準拠。

あと偉そうなこと言うが,「身バレが怖いから持ってる (有益かもしれない) 情報を明かしません」って,
こっちからするとかなり不快だから,黙って何も知らないふりをしておいたほうがまだマシだよ。

565 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 18:12:03.21 .net]
落ち着け
最初の質問の時点で性格の幼稚さは見え透いてるだろ



566 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 19:58:23.46 .net]
>>550
やり方教えて

567 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 21:20:34.93 .net]
>>554
> 一次ファイルを作らないっていう謎の拘りが理解できない。
書いてなかったのが悪いんだろうけど、一時ファイルを使うと
ストリーミングで処理できなくなるんだよ
つまり前のプログラムの出力が完了しないと次のプログラムが動かない
POSIX準拠はbusyboxで動かす必要があるからこれも必須
この二点は今回の質問には直接関係ないから理由じゃなくて制約として書いた

568 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 21:25:58.36 .net]
そしてこっちの方で回答きたよ

くだらねえ質問はここに書き込め!Part 230
https://mao.5ch.net/test/read.cgi/linux/1515383155/315

同じ文章なのになんでこう反応が違うんだろうね
同じ文章なんだからレスする側の問題があるだろうね
質問する側と回答する側、立場は対等だって言ったら怒りそう

569 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 21:38:48.22 .net]
>>554
あとmktemp使ったほうが良いよ。
なんでぜったいにかぶらない方法があるのに
自分でなるべくかぶらないように努力するんだろう
結構多いよね。mktemp使ったほうがコード短くなるのに

570 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 21:48:54.27 .net]
自分自身は何もしてないのになぜこうも態度をでかくできるのか

571 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 21:57:02.07 .net]
別にでかくないでしょw ほかの人と一緒。
質問したからといってへりくだる必要はないと思ってるだけ
無知でもないしね

572 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 22:10:47.74 .net]
マルチカスか
教えたがりを徹底的にこき使っとけ
ここには二度とくるなよ

573 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 22:45:20.19 .net]
少なくとも聞く側の態度じゃぁないな

574 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 22:54:52.33 .net]
聞く側はこういう態度を取らないといけないって
体育会系とか年功序列とか年上は敬え的な考え方だよ
今時はやらない

575 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:15:38.51 .net]
545から漂う頭の悪さよ



576 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:21:32.35 .net]
>>558 のそれ「解答」じゃないじゃん。
無理って言われてるんだぞ? 理解できてる?

577 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:23:14.97 .net]
もういいじゃん
ほっとけよ

578 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:23:16.19 .net]
どういう態度取るべきとは思わないけど、
相手を不快にさせたら得られるはずの回答も得られなくなる可能性が上がるよ。
それでよければご自由に。

579 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:26:33.25 .net]
出力が色制御してきたら取り除いたりとか、マルチプロセスとかで変なところでブッタ斬り/ミックスされないように同期取ったりとか考えてたけど俺には無理だからもういいや

580 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:33:38.33 .net]
>>566

やりたいこと

> 標準出力の内容を緑に、標準エラー出力の内容を
> 赤にしたいんだけどどうすればいい?

標準出力の内容を緑にする・・・簡単
標準エラー出力の内容を赤にする・・・?

>>558で明らかになったこと ・・・ 標準出力と標準エラー出力を入れ替える方法

ここから標準エラー出力の内容を赤にするには
標準出力と標準エラー出力を入れ替えれて
処理すればいいって気づくよね?

581 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/05(月) 23:47:07.49 .net]
>>570
ん?
それだと今度は標準出力が (標準エラー出力に複製されたので) パイプを通らなくなるから、
標準出力の内容 (今は標準エラー出力に出力されている) を緑にできないんじゃ?



582 名前:もしかして同時じゃなくていいってこと? []
[ここ壊れてます]

583 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 00:20:35.13 .net]
もうほっとけ

標準出力、標準エラー出力に関する便利な小ネタでも教えてやろうかと思ったけどやめとくわ

584 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:01:07.43 .net]
>>571
片方ずつしか処理できないなら、
2回やれば両方できるだろ?
っていうかそれぐらいわかるだろw

585 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:01:45.64 .net]
>>572
> 標準出力、標準エラー出力に関する便利な小ネタでも教えてやろうかと思ったけどやめとくわ

おせーておせーて



586 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:03:40.69 .net]
|& ←このパイプは標準出力標準エラー出力ともに通すよ。
ただ質問者さんが望んでいるのは「標準出力か標準出力かが区別できる状態でのパイプ通過」だろうから、
それはちょっと無理なんじゃないかな。

あと態度がデカすぎる。一度死​んだほうがいいと思う。

587 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:14:26.43 .net]
>>573 まさかコマンド二回回すの? 標準出力と標準エラー出力分ける為だけに?
それ一時ファイル作るより余程冗長だぞw
もう一度シェルっていうかコンピュータの仕組みを勉強しなおしてきな

588 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:45:01.59 .net]
だから一時ファイルを作るとストリーミングに
できなくなるからだめなんだって
さっきも書いたろ

589 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 01:47:17.52 .net]
>>575
やっぱり>>558が今のところ一番シンプルな解みたいだね。
てか、標準出力と標準エラー出力を別々にファイルに吐き出せるんだから、
別々のプログラムにパイプでつなげられる機能があっても良いと思うんだけどね

590 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 02:48:45.93 .net]
君たぶんだけど意思疎通に係わる障害持ってるから病院で診てもらったほうがいいよ。
知り合いにそういう調子の会話する人がいて、ある日会社で大きな事件を起こして辞めさせられたあと
病院で検査したらそういう系統の精神病だったからさ。
煽りとかじゃなくて、君はどうも社会で孤立してそうだから、助けになりたい。

591 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 03:23:52.46 .net]
いや、おちょくってるだけだろ
まともに相手するだけ無駄やぞ

592 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 04:17:47.54 .net]
ここに限らず、質問系のスレにたまに沸くアレでしょ
5chが過疎って最近あんま見てなかったから
なんか懐かしい感じするわw

593 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 10:26:50.47 .net]
レス内容が煽りだけになったらおしまいw

594 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 20:25:23.40 .net]
あっちで粘着してるみたいだな
久々にアレな奴を見たわ

595 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 21:23:37.44 .net]
入力リダイレクトで複数ファイルを一度で流し込むのはどうしたら良いのですか?



596 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 21:44:48.81 .net]
catしてパイプ

597 名前:watarie [2018/03/06(火) 22:03:33.11 .net]
よろしくお願いします。
mac で bashです。 mdfindからパイプつないだ先でcpしたら

検索が間に合わなかったのかコピーし損ねがでてきます。
再度コピーしそこねたファイル名リストを同じようにこれに掛けると、
幾つか成功していくつかはコピーし損ねます。

function readMdfind() {
while read LINE;
do
mdfind "kMDItemFSName == "${LINE}" || kMDItemDisplayName == "${LINE%.*}"" | awk 'NR==1' | xargs -J % cp -p "%" "$1" 2>/dev/null
done <${2}

引数の1はファイル名のリストが入ったテキストで、2はコピー先のフォルダになります。
ファイル名は殆どが一意にしてあるので、とりあえずヒットしたら良い感じです。
一度で取りこぼしのない良い方法はありませんでしょうか。

598 名前:watarie [2018/03/06(火) 22:05:40.25 .net]
引数の件1と2逆でした 惑わせてしまい申し訳ありません。
正しくは1がコピー先フォルダで2

599 名前:がファイル名のリストです。 []
[ここ壊れてます]

600 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 22:33:41.80 .net]
>>585
回答ありがとうございます。

ということはそのまま
cat hoge huga | command
で、いいってことですか。なるほど。

レスつくまで色々ググって調べてみたのですが
command <( cat hoge huga )
でも全く同じ動作ですか?

601 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 23:27:44.61 .net]
>>588
二番目の方法,たぶんコマンドラインで試して成功したから書き込んでるんだろうけど,
それはプロセス置換と言って Bash筆頭に幾つかのシェルの独自拡張だからシェルスクリプトにするときは
シェバンを #! /usr/bin/env bash か #! /bin/bash とかにする必要がある。
cat hoge huga | somecommand で代替できることに可搬性を犠牲にするのは避けたいだろうから
(つまり #! /bin/sh というシェバンを捨てるのは勿体無いということ)
<(cat hoge huga) は避けれる時は (特にシェルスクリプトで使う時) 避けといたほうがいいんじゃないかな。

602 名前:586 mailto:sage [2018/03/06(火) 23:29:38.39 .net]
5行目あたりの日本語がおかしい。けど国語力ないので自然に直すの無理。
察してくれ。

603 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 23:43:28.43 .net]
>>589
なるほど!
#!/bin/sh が必ずbashにリンクされてるとは限らないから、
拡張表現で書かなくて済む場合は確かに可搬性を優先した方がいいですね。

ありがとうございました。

604 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/06(火) 23:49:32.51 .net]
>>586
mdfindを知らんので問題解決に直接ならないけれど`done < ${2}`ではなく`done < "$2"`のほうがいいよ〜
もっと言うなら`cat "$2" | while read LINE;`のほうがいいかもね〜
* POSIX sh互換シェルは変数名に数字が来たらそこで読み取りを中断するので波括弧で変数名の範囲を明示しなくていい
* 変数$LINEに^Dとかが渡された時catコマンドと<リダイレクトで違いがある
短いんだけど参考: pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_01

605 名前:588 mailto:sage [2018/03/06(火) 23:58:01.42 .net]
あー!
さらに調べたら、よくわかりました。
#!/bin/sh でbashを起動したらbashの拡張とか使えなくなっちゃうんですね。
だからシェバンを書き換える必要があると…
そういう意味だったんですね。
(ちゃんとmanにかいてありました)

ためになりました。



606 名前:名無しさん@お腹いっぱい。 [2018/03/07(水) 07:20:57.39 .net]
>>592
ん?どゆこと?
$ cat file | cmd
$ cmd < file
で違いがあるってこと?そうは思えないんだけど…

607 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/07(水) 08:34:45.43 .net]
$LINEに^Dってなんぞやってところだな

608 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/07(水) 08:37:52.19 .net]
>>586
まずはエラーをnullに落とさずに表示させろ

609 名前:watarie [2018/03/07(水) 09:23:48.67 .net]
>>592さん

610 名前:watarie [2018/03/07(水) 09:32:33.42 .net]
>>592さん
ありがとうございます。ちょっと英語で読解が難しいので時間を作って該当の箇所を読ませていただこうかと思います。
{2}の箇所を"2"に変更しました。
<の箇所をcatに変更しました。
非常に目に優しいくなりました。
読み込む箇所なので、怪しいと感じます。結果としては変わりませんでしたが、参照の箇所は興味がありますので読ませていただこうと思っています。英語で弱気になりますが^^;
ありがとうございます。

611 名前:watarie [2018/03/07(水) 09:37:28.43 .net]
>>596さん
すみません。確かにそうですよね。
初心者過ぎで逃げを当然にしてたバチがあたったようです。
吐き出したエラーは、
cp: /Volumes/Macintosh: No such file or directory
cp: HD: No such file or directory
などのファイルパスが、スペース区切りになってcp出来ませんでしたよというエラーでした。
ただ、検索に漏れた該当のファイルは何度めかにはヒットしますので上記のエラーとはならなかったということに。
spotlight特有のものだからと諦める

612 名前:オかないのか・・・

これがひょっとしたら手がかりになるかもしれませんが、わたしの力では全く・・・
[]
[ここ壊れてます]

613 名前:watarie [2018/03/07(水) 09:45:34.86 .net]
すみません、mdfindの検索結果のファイルパスが
スペースで割れてしまってcpに渡されたということでした。たぶん^^;

614 名前:watarie [2018/03/07(水) 12:55:37.74 .net]
解けました!ありがとうございます!
ダブルコーテーションを%の箇所で囲うのではなく、
1行取り出した先でパイプして囲えば良いと思い以下を試したところ出来ました。
mdfind "kMDItemFSName == "${LINE}" || kMDItemDisplayName == "${LINE%.*}"" | awk 'NR==1' | sed -e 's/^\(.*\)$/\"\1\"/' | xargs -J % cp -p % "$1" 2>/Users/mac10/Desktop/out
エラー出力素晴らしいです!
ありがとうございました!

615 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/07(水) 18:25:56.09 .net]
ずっとageっぱなし…(小声)



616 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/07(水) 19:48:17.38 .net]
mdfindとxargsに-0つけるのが定石だと思うけど、もう見てないかな。

617 名前:名無しさん@お腹いっぱい。 [2018/03/08(木) 00:41:50.66 .net]
>>578
今更だけど、あるんだよね。誰も教えたくなかったんだね。

618 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 01:55:58.38 .net]
まああるよね

619 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 07:30:07.37 .net]
ヒントくらい出すか……。でもあいつに教えたくないんだよなぁ。
卑屈だけど、気持は分かるだろ?
パイプに名前(ry

620 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 16:44:02.99 .net]
それ使うと出力側はこんな感じかな
while :;do sed -e 's/\(.*\)/^[[32m\1^[[m/' np1 & sed -e 's/\(.*\)/^[[33m\1^[[m/' np2 >&2; done

621 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 20:31:17.47 .net]
>>607
野暮な指摘だが、sedを使わない
printf '\e[32m%s\[0m' "$(cat)"
の方が分かりやすくね? つーか printf ってそういう「整形した出力」の為のコマンドだろうし。

622 名前:604 mailto:sage [2018/03/08(木) 20:32:49.31 .net]
>>695
ミスった… printf '\e[32m%s\e[0m' "$(cat)" だ。
こうすると "$(cat)" の部分で np1 を受けt[以下略]

623 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 20:51:46.21 .net]
>>606
名前付きパイプ(mkfifo)はプロセスが2個あって
片方が出力側プロセス、片方側が入力側プロセスに
別れない限りストリーミングにすることができない
(同一プロセスでは出力しながら入力ができないため)

今回の場合、標準出力と標準エラー出力の2つがあるから
出力側プロセス1個と入力側プロセス2個の合計3プロセスが必要になる
つまり別プロセスとして起動しなければいけない

もちろん出力の完了待ちのwaitも必要だし、作成したパイプの削除も必要。
特にCTRL+Cで中断された場合とか
また万全を期してパイプ名が被ることも考慮してランダムな名前にしたい

ここまで言えば名前付きパイプを使った方法は実装するのに行数がかかり
面倒な方法だと言うことがわかるだろう?

また>>557で書いたとおりbusyboxで動かす必要があるのだが、
そもそもbusyboxでmkfifoが存在しない場合もある
↑俺にとってはこっちのほうが重要

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:00:55.81 .net]
もう来なくていいよ
レス続けるならコテハン付けて

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:03:28.88 .net]
粘着かよ
気持ち悪い



626 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:03:48.79 .net]
レス続けたのは俺じゃないんだがw

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 21:57:56.36 .net]
うわ。まだ居たのかこのキ​チガイ…
まあ放置が一番いいな。俺のこのレスも彼を発狂させる原因になるやもしれんし。

628 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 22:15:10.19 .net]
まあ反論なく放置される(=俺の勝ち逃げ)という状況ってのが
俺にとっては一番であることには間違いないが


で俺がレスしたのは、放置してないからだよ?w

629 名前:604 mailto:sage [2018/03/08(木) 22:33:08.10 .net]
>>609
あ、しまった printf '\e' は GNU/Linux じゃないと動かないみたい。
Debian使ってんのがバレてしまったw
FreeBSDとかでも動作させる為には printf '\033' とやる必要がある。

630 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 22:42:34.38 .net]
>>609
出力 A 正常 出力 B 異常 出力 C 正常 の時
それだとACBまたはBACと表示されないか?
まぁそれで良ければ良いんだけど

631 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 23:32:13.81 .net]
ガチでアレな奴が粘着してるな
ここまで気持ち悪い奴は滅多に見ない

632 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/08(木) 23:54:18.50 .net]
>>556
exec > >(sed -e 's/\(.*\)/^[[32m\1^[[m/')
exec 2> >(sed -e 's/\(.*\)/^[[33m\1^[[m/')

後は普通に処理を書けばおk

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 01:48:35.86 .net]
どんだけ答え知りたいんだ
あっちのスレいけよこっちはこっちで楽しんでんだから

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 22:50:21.96 .net]
おいおい勘違いするな
>>556はbashやzshでのやり方を聞いてる。
POSIXの範囲でやりたいと言ってる俺ではない

635 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/09(金) 23:00:06.75 .net]
そういや>>619で思い出したけど、
busyboxのsedってなんか動きがおかしいんだよね。

(echo 1; sleep 5; echo 2; sleep 5) | sed 's/a/a/'

例えばこれを実行すると、1が表示されるのは5秒後になる
debianだとすぐに表示されるのに。一行遅れて表示される

だからsedは今回の俺の用途には使えなくてreadを使ってる



636 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 00:28:42.71 .net]
>>622
Ubuntu ではおかしいみたいですね。
Debian と openSUSE の busybox では記述通りの動きでした。

637 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:03:52.34 .net]
>>623
WSL上のUbuntuは問題なかった。
busyboxはビルドによって色々変わるだろうけど
よく分からんね

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:06:54.08 .net]
> openSUSE の busybox では記述通りの動きでした。
もしかして、sedはbusyboxじゃない方のsedになってない?

WSL上のUbuntuに入れたbusyboxのsed
↓つまりこれを実行するとやっぱり5秒後に1と表示される
(echo 1; sleep 5; echo 2; sleep 5) | busybox sed 's/a/a/'

やっぱりbusyboxが実装してる簡易版sedの問題な気がする

639 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 01:08:10.50 .net]
まあもともとbusyboxってそういうものだし
とりわけ騒いだりはしないけどさ

640 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 02:15:25.24 .net]
>>625
>>623 は busybox ash でシェルを起動して確認しています。
busybox sed 's/a/a/' にすると Debian も openSUSE も Ubuntu と同じ動作になりました。

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 09:07:03.16 .net]
おーほんとだ。Busybox v1.22.1 on Debianでも同じような動きになる。
ここまでハッキリしたバグに遭遇したの久し振りだわ
単に離れてただけかもしれんが

642 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 09:38:16.90 .net]
なにやら興味がある人がいるようでw

なんで俺の用途で使えないかというと、例えばこんな感じに
ユーザーのインタラクティブな入力を変換して出力したいから

↓ >(実際には画面に表示されない) の行がユーザーの入力

$ sh | sed 's/a/a/'
> echo 1
> echo 2
1
> echo 3
2

見ての通りユーザーが入力したコマンドの結果が一つ遅れて表示される
sedのよくあるユースケースでは問題ないんだろうけどね

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 12:15:21.67 .net]
>>629
挙動が変わるツールは珍しいなと思いました。
busybox ash の中で sh | sed 's/a/a/' とすると、
Debian (v1.22.1) まとも
Ubuntu (v1.22.1) 遅れる
openSUSE (v1.21.1) まとも(sh プロンプトが表示される)
CentOS (v1.15.1) まとも(sh プロンプトが表示される)
Windows (v1.29.0) 遅れる
でした。
ビルド時に引いているライブラリの差異なのでしょうか...

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 12:28:15.59 .net]
バッファリングが影響してそうなのかもしれないけど
正規表現の実装の都合な気もする。
はたまたカーネル

645 名前:ェ関係してるのかシェルの設定でなんかあるのか

正直、そういう違いが有るんだね。気をつけておくよと
事実を受け止めるぐらいでで深追いする気力はないw

話変わるけど、何もしない関数の定義、
foo() :

もしくは、echoするだけの関数の定義
foo(): echo foo

この書き方ってPOSIX準拠だよね?
bashやzshではエラーになった
[]
[ここ壊れてます]



646 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 15:57:33.44 .net]
>>631
foo() echo foo ならzshは理解するぞ
Bourne shell系はfoo() any-compound-commandだけ理解して
foo() any-commandは理解しない

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 18:45:48.71 .net]
>>631
POSIX準拠なのかはよくわかりませんが、sh ならば

foo()
foo1() echo "$1"

で、sh でも bash でも動かすなら

foo() { :; }
foo1() { echo "$1"; }

でいけると思います。

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 23:10:12.04 .net]
訂正
× foo(): echo foo
○ foo() echo foo


>>632
ごめん、zshでは試していなかった。
今zsh入れてたマシン壊れてるんだったw
別の環境にzsh入れたらたしかに動いたね

dash、ash、zsh では動いた
bashだけ動かなかった

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/10(土) 23:17:51.17 .net]
func() :
↑これ確かにシェバンを #! /bin/sh にすると通るけど
#! /usr/bin/env bash にすると撥ねられるな。
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05
一応現行POSIXのシェル関数の定義はここに書いてあるけど、func() : は恐らく適合してるな。
多分bashの文法チェックが少しばかりおせっかいすぎるんだろう。
でもPOSIXに準拠した記法なのにエラーになるって嫌だなぁ

650 名前:632 mailto:sage [2018/03/10(土) 23:21:43.98 .net]
あれ。yashでも「syntax error: a function body must be a compound command」って撥ねられるわ。
yashはかなり厳密にPOSIXに従ってる筈なんだけど…

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 00:25:29.87 .net]
またちょうどよくシバンの話がw

シェルスクリプトのファイルを直接実行するのではなく
ライブラリとして他のスクリプトから読み込むだけの場合
シバンいらないよね? またその場合の拡張子ってどうしてる?

シンタックスハイライトとか自動で適用させたいんだけど
余計なものはできるだけ排除したい

652 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 00:28:14.22 .net]
>>635
そうなんだよね。あと

> fname ( ) compound-command [io-redirect ...]

ここにio-redirectが書けたのがびっくり
どういう時に使えば良いんだろうか?

653 名前:632 mailto:sage [2018/03/11(日) 01:05:34.01 .net]
>>638

俺は未インストールコマンドの処理に使ってる

check_command()
{
type "$1" > /dev/null 2>&1 || {
printf '%s%s\n' \
"$1" 'をインストールして下さい。'
exit 1
} >&2

return $?
}

check_command "curl"

こうするとエラーメッセージが標準出力に出ないからパイプ繋いでてもおかしなことになりにくい。
もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 01:46:36.03 .net]
>>639
いや、そうではなくて関数定義の最後に書けるんだなーって話

その例で言えば、こういう書き方ってこと
(関数全体を別の所に出力したいときには便利か、うーん使うかな?)

check_command()
{
 type "$1" > /dev/null 2>&1 || {
  printf '%sをインストールして下さい。\n' "$1"
  exit 1
 }
} >&2

# ついでにどうでもいい所を俺の趣味で変更したw
# exitもreturnに変えたい。もしくはexit_if_command_not_foundみたいな関数名にしたい


> もっとも |& ←みたいなパイプなら無理だけど、そもそも標準エラー出力ごとパイプに使うなんて稀だろうという推測。

/dev/ttyに出力するって手もあるよ

$ (echo stdout-a; echo stderr-a >&2; echo tty-a >/dev/tty) |& sed 's/a/b/'
tty-a
stdout-b
stderr-b

655 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 02:00:39.65 .net]
>>636
yash覚えた

最低限機能しかももってないと思われるashで動けば
Bourne Shell 系全部でうごくだろうと思っていたから
そういうこともあるんだなーって思った



656 名前:632 mailto:sage [2018/03/11(日) 02:47:31.38 .net]
>>640
あ,そういうことか。勘違いしてたわw それはちょっと使い道思い付かん

ところで,
return $?
↑これ消した理由なに? C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
シェルスクリプトだと要らないのかな。今まで特にreturn行のせいで不具合が発生したこともなかったけれど。

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 11:42:23.58 .net]
>>642
何も書いてなければ、その時点の$?がそのまま返るだろ?

> C言語をやってるせいか関数が終了ステータスを返さないと不安で仕方無いんだけども,
Ruby(最後に評価された値を返す)やってるとreturnなんて書かないんだがw

658 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 11:44:13.17 .net]
> 今まで特にreturn行のせいで不具合が発生したこともなかったけれど。
まあ不具合は発生しないだろうね。

関数の最後でなにもしないなら、その時点の $? が返る所を
$?を取り出してreturnの引数で$?を返すようにしただけだからw

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:19:13.21 .net]
Cとか化石みたいな言語使ってる人って無駄が多いよね
生産性悪w

660 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:41:26.14 .net]
そういうこと言う奴って大体Cが出来ないコンプレックス抱えてるんだよなぁ

661 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:44:23.08 .net]
Cから学べること多いのになぁ

662 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 13:59:18.74 .net]
Cはハードに近いところを表現するのに適してるから絶対に無くならないけどね。
化石だけど生活には欠かせない燃料みたいなもんかな。
Cで書かれてるシェルのスレで否定しちゃうのはちょっと痛いね。

663 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 14:52:52.42 .net]
俺はCを否定してないぞ。C以外を使っていれば
returnしなくていい言語だってあることを知るだろうし、
returnを書くことに拘る必要はないってことだ

664 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:03:25.28 .net]
>>643
ruby使ってたってreturn書くことあるだろ
implicitとexplicitを状況に応じて使い分けることが大事

665 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:26:06.07 .net]
山月記ってアニメ化されないの?



666 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 16:39:38.95 .net]
>>650
ルビ厨の相手するなよ

667 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 17:07:11.55 .net]
>>652
Cに対するコンプレックス同様
Rubyに対するコンプレックスも見苦しい

668 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/11(日) 22:37:37.82 .net]
>>650
returnを省略できる場合に、returnを書くことはないよ

669 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 09:24:03.09 .net]
話をぶった切ってすまんが、なるべく依存関係が少ない・かつインタラクティブがある程度機能的なPOSIX互換シェルって何があるかな。
ksh98とかyashとかは使ったことあるけど、ああいう感じでもうちょい開発が盛んなやつとか知らない?

670 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:35:16.53 .net]
連続足し算だけど
#!/bin/bash

while true
do
add=expr 0
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done

でできるが
line 5: 0: command not found
1
----------
1
./tasizan-renzoku.bat: line 5: 0: command not found
2
----------
3
./tasizan-renzoku.bat: line 5: 0: command not found

と 気色悪い。 どうすれば正解なの?

671 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 17:39:55.92 .net]
expr 0が何も囲われてないが大丈夫か

672 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:48:20.94 .net]
すごいね、以下でエラーがなくなった。

#!/bin/bash
while true
do
add=(expr 0)
read x
add=$(($add + $x))
echo '----------'
echo ' ' $add
done

673 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:49:39.62 .net]
エラーがなくなった が 足し算の合計もなくなった

674 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 17:58:34.26 .net]
a=0
while read x; do
a=$((a + x))
echo ----------
echo ' ' $a
done

675 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 18:02:05.44 .net]
ありがとう。 合計を外側で定義することがわからなかった。
こうなると 



676 名前:d卓より便利! []
[ここ壊れてます]

677 名前:名無しさん@お腹いっぱい。 [2018/03/12(月) 22:12:41.08 .net]
【大統領】   Japは我々の家畜  <大イスラエル帝国>  安楽に暮らせる奴隷   【議定書】
rosie.5ch.net/test/read.cgi/liveplus/1520856333/l50

678 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/12(月) 23:38:42.01 .net]
また頭がおかしいのがわいてきた
UNIX板荒らさないでほしい

679 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/13(火) 00:08:45.00 .net]
コマンドにローマ字で名前付けるやつは多かれ少なかれキチ成分が入ってる (経験からくる偏見)

680 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/15(木) 11:45:55.61 .net]
>>654
書いといた方がデバッグが楽だぞ

681 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/15(木) 22:29:00.04 .net]
>>665
あんまりそう思ったことないな

682 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 03:48:34.81 .net]
for i in `seq -f %02g 1 10`

do
echo ${i}
done


このfor文の中で01の時に1、02の時に2を指定する方法ってありませんか?
簡潔に言うと先頭の0を取ったものを使いたいです

683 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:33:32.12 .net]
>>665
どうしてデバッグが楽なのか知らんが、
少なくともprintfデバッグすると
終了コードが0に変わるからデバッグしづらいな

684 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:52:03.87 .net]
>>667
2桁と決まっているなら

echo "${i##0}"


逆にしてこっちのほうが楽だと思うが

for i in $(seq 1 10)
do
printf "%02d\n" $i
done

685 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 08:52:41.56 .net]
訂正

printf '%02d\n' "$i"



686 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 20:01:50.50 .net]
拡張POSIX準拠らしいけど
echo {1..10} {01..10}

arch linuxだと普通のshでも展開してくれる

687 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 20:09:04.24 .net]
ありがとうございます

688 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 21:41:11.21 .net]
どういたしまして

689 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 22:02:49.28 .net]
>>671
> arch linuxだと普通のshでも展開してくれる
してくれなかったぞ

690 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/17(土) 23:05:13.47 .net]
> 拡張POSIX準拠らしいけど

拡張POSIXってしう仕様があるの?
POSIXを拡張したもので、POSIX非準拠って意味だと思ってたんだけど?

691 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 00:55:12.66 .net]
シェルスクリプトってさ、POSIXが標準だけど
実質bashがデファクトスタンダードって考えて良いのかな?
zshやfishを使っていてもbashはインストールされていると考えていい?

いや、あるコマンド作ろうと思ってるんだけど、
基本はPOSIXで動くようにするけど、bashがインストールされていれば
拡張機能が使えるようになる。という仕組みは
ほぼすべての人が拡張機能使えると考えて良いんだろうかなって思って

692 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:08:34.19 .net]
>>676
bash前提はだめ。
BSD系にはデフォルトで入っていないし、後から入れてもパスが違う。

693 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:10:24.11 .net]
>>674
ごめん
/bin/shのバージョン確認してみたら
GNU bash, バージョン 4.4.19だった

694 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:15:31.51 .net]
>>677
いやbash前提じゃないんだ。POSIX シェル前提。POSIX シェルだけで動く。
だけどbashがインストールされていれば拡張機能が使える
その拡張機能っていうのも、本質的な機能じゃなくて
なんていうかな、同じコマンドで実行結果も同じだけど情報が詳細に取れるって感じ

BSD系といってもMacはデフォルトでbashになったのは知ってる。
パスに関してはシバンではなくbashコマンド経由で実行すれば良いと思ってる
(切替可能なようにするのでどっちみちシバンには頼らないと思うし)

695 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 01:16:39.04 .net]
>>678
うん、たしかCentOS系はbashへのシンボリックリンクになってたはず
Debian系はdashなので拡張POISXは使えない



696 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 09:35:45.26 .net]
POSIX規定外のことをPOSIX拡張って書くのは誤解のもとだからやめた方がいい。
伝統的にシェルにはなくてPOSIXで増えた機能のことをPOSIX拡張とよぶことがあるので、意味が真逆。

697 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 09:54:45.87 .net]
可搬性を考えるとPOSIX準拠で書く癖をつけた方が
自分のためになるなあ

698 名前:名無しさん@お腹いっぱい。 [2018/03/18(日) 12:02:31.33 .net]
  ★★★The● best way to eliminate too much gap between rich and poor, is to decide the tax● rate of the progressive tax in the referendum(Root Tax).★★★

  この掲示板(万有サロン)に優●秀な書き込みをして、総額148万円の賞金をゲットしよう!(*^^)v
●  jbbs.livedoor.jp/study/3729/ →リンクが不良なら、検索窓に入●れる!

699 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 14:34:15.18 .net]
POSIX準拠で書くのは結構つらいので
デファクトスタンダードであるbash機能のみで書くといいよ

700 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 14:55:14.07 .net]
>>679
いっその事
ps -p $$ -o comm=
でシェルを見て処理を分けるとか

701 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/18(日) 15:53:34.91 .net]
>>685
見分け方は本質的なところじゃないんで
俺にとってはどうでもいい話だけど、
シェルの判定ではなくて機能チェックで見分けるよ

ブラウザをUserAgentで判定するのではなく
使いたい機能が使えるかどうかで判定するのと似たようなやり方ね

> ps -p $$ -o comm=
ちなみにそれcygwinではエラーになった

702 名前:682 mailto:sage [2018/03/18(日) 22:58:03.92 .net]
>>686
bash や zsh の機能を多く使うならば、その都度機能が動くかどうか判定するより、
起動シェルを見て分岐したほうが手間がないという意味合いで書きました。

cygwin の ps は -o オプションは無いのですね。失礼しました。
freebsd の環境で hoge.sh に ps -p $$ -o comm= と書いて、
/usr/local/bin/bash ./hoge.sh とすると、bash と表示されます。
(debian とかの ps でも ok)

cygwin の /bin/sh は /bin/bash なのでシェルを見るよりその都度使用する機能を判定するほうがよさそうですね。

703 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/19(月) 06:19:05.05 .net]
> > ps -p $$ -o comm=
> ちなみにそれcygwinではエラーになった

マジで!? POSIXでも定義されてるんだけどなぁ

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

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



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

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

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

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

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

709 名前:でしょうか?

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

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

#!/usr/bin/env bash

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

上の場合はmediainfoの終了ステイタスで判断して次にさらにif〜と進んでいるんですが、
LCかHE-AACかそのどっちでも無いかをcace〜muxer〜っとやるほうが確実なのかなと思いました。

その場合、
mediainfo $FILE | grep -E '^Format profile *: LC$|^Format profile *: HE-AAC / LC$'
で出てきた文字列をcaseに渡したいんですが、

case HOGE in
"*: LC" ) muxer〜;;
"*: HE-AAC / LC" ) muxer〜;;
* ) "AACではない";;
ecase

だった場合、HOGEにはどう書けばいいんでしょうか?

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

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

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

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


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

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

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

これで大丈夫

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

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

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



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

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

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

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

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

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

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

732 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:28:14.30 .net]
>>709
速いかどうか分からんけど awk でやるなら

printf 'Hello\nWorld\n' | awk -F '' '{for(i=1;i<=NF;i++) print $i}'

とかかなぁ。grep -Eo '.' ってのもあるけど

for c in $(printf 'Hello\nWorld\n' | grep -Eo '.')
do
echo "$c"
done

あとは fold コマンドとかで。

printf 'Hello\nWorld\n' | fold -w1

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

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

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

735 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/22(木) 02:48:27.27 .net]
改行を扱いたい場合は bash か zsh の read かな。

printf 'Hello\nWorld\n' | while read -r -n 1 c;do echo "$c"; done

awk の場合は RS に '\0' をセットすればいいかも

printf 'Hello\nWorld\n' | awk -vRS='\0' -F '' '{for(i=1;i<=NF;i++) print $i}'



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

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

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

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

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

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

#echo "$DATE"
mkdir $TMPDIR/backup_$DATE
cp -rfp /home/atashi/doc $BAKDIR

これだとcpが出来ないんですがどこが間違えていますか?

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

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

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

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

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

こうじゃない?

BAKDIR='$TMPDIR/backup_$DATE'

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

755 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 19:19:17.27 .net]
>>737
んー。こっちでは表示されるけれども…
Script started on 2018年03月25日 19時18分12秒
testuser@debian:~/var/tmp/temp$ cat ./to.sh
#! /bin/sh -

timeout 1 sleep 10
if [ $? -ne 0 ]; then
echo hoge
else
echo fuga
fi
echo owata
testuser@debian:~/var/tmp/temp$ ./to.sh
hoge
owata
testuser@debian:~/var/tmp/temp$ exit
exit

Script done on 2018年03月25日 19時18分30秒



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

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

758 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/25(日) 22:38:36.41 .net]
このコードってvalidですよね?
やってること・・・foo関数が最初に呼ばれた時に
OS判定(相当)のことをして、OS毎に処理を切り替えて実行
関数を上書きすることで、次回以降は判定することなく処理実行

#!/bin/sh

foo() {
echo first call

os_type=linux

[ $os_type = linux ] && \
foo() {
echo linux
}

[ $os_type = mac ] && \
foo() {
echo mac
}

foo
}

foo
foo

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

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

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

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

https://pastebin.com/F5QC2Yu5

763 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:13:47.05 .net]
ワロタw

fail() {
case "$1" in
0)
echo "Info :$2"
;;
1)
echo "Warn :$2"
;;
2)
echo "Error:$2"
;;
3)
echo "Success :$2"
exit 0
;;
4)
echo "Fatal:$2"
exit 1
;;

esac
}

764 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/26(月) 11:16:57.86 .net]
failwww ひどいなw

fail 0 " **** test start ****"

WAIT_SEC=5
time timeout -sKILL ${WAIT_SEC} unzip -t /home/xxxx/crypto.zip
if [ $? -ne 0 ]; then
fail 2 "hage"
else
fail 0 "hoge"
fi

fail 3 "**** test end ****"

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



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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

805 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:36:00.29 .net]
>>783

POSIX の xargs に -0 オプションは規定されてないので、
「ポータブル」という条件下ではできない。

まあ POSIX の find に -print0 オプションが入ったのもわりと最近なので、
そのうち xargs でも待ってればそのうち -0 が追加されるとは思うが。



806 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:39:13.18 .net]
答えはfor in * を使うこと
俺が代わりに答えておいてやるよ
なおshで\0を使うと言う答えではない

807 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:41:04.45 .net]
POSIXはprint0に対応する前に
ファイル名に制御文字を使用できないようにしろ

808 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 13:53:52.47 .net]
賛成

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 14:01:21.67 .net]
for使ってfindっぽいものを自作したとして
それをパイプで別コマンドに流そうとした時に
またファイル名に改行が含まれていた時問題が発生するんだよな

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:15:24.81 .net]
for で書くのなら、その結果のファイル名をわざわざ
他のプロセスにパイプで渡すなんてことはせずに、
そのシェル自身で処理するか、
あるいは他のプロセスに渡すなら引数を使え
ってだけの話だな。

>>764 が既に書いてる話なのに、なんでそこから
35コメも無駄に費やされてるんだか。

811 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:18:45.25 .net]
ちなみに for で書く以外のやりかたもあるけど、
これも >>764 が既に最後の文で書いてる。

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:30:33.97 .net]
posixの範囲じゃ改行が含まれたファイル名を
パイプでつなげられないってことかな

813 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:56:18.36 .net]
>>792
「POSIXの範囲内じゃ」は誤解を招く表現で、正確には
「POSIX Shell & Utilities の範囲内じゃ」だな。
「POSIX System Interfaces」を使えば問題なくできるからな。
まあシェルのスレなわけで「POSIXの範囲内じゃ」でも間違いとまでは言えないが。

あと、find -print0 が POSIX で規定されたってのは間違いだった。
そういう拡張もあることも言及はされてるが、規定には追加されていない。
でもって POSIX 的には「find -print0 | xargs -0」じゃなくて、
「find -exec コマンド {} +」を使えってことになってる。

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 16:20:44.05 .net]
でも、find -exec じゃシェル関数に渡せないからなぁ
findは諦めろってことかな

815 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 16:44:16.87 .net]
find を諦めるんじゃくて、シェル関数の方をあきらめて、独立したシェルスクリプトにしろってことだよ。
find -exec コマンド {} \;
だとコマンドの起動回数が多いからシェルスクリプトにすると遅いのが問題になるけど、
find -exec コマンド {} +
ならコマンド起動回数は相当に減るから、独立したシェルスクリプトにしても特に問題はない。



816 名前:名無しさん@お腹いっぱい。 [2018/03/29(木) 21:07:16.05 .net]
AWKの区切り記号をヌル文字にすればいいんでは。

817 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 23:50:16.88 .net]
ぬるぽ?

818 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 00:19:50.52 .net]
>>796
試してみたけどね。RSに\0入れられなくてね
もう全滅w

819 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 02:47:00.90 .net]
>>798
俺の所では通ったけど、もしかしてOS依存なのかな。
@Debian GNU/Linux

820 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 03:18:23.09 .net]
OSっていうかGNU系かどうかだね
GNU系はだいたい\0に対応している
BSD系とかは対応してない。だからMacとかつらい

私的なスクリプトならMacのコマンドをGNU化するやつ
入れて済ませても良いんだが

821 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 12:29:37.47 .net]
>>795
バカwww

822 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 12:30:43.62 .net]
このスレでこんなに草を見るとは思わなかった

823 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 13:42:54.12 .net]
シェル関数にこだわる理由が思いつかん。

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 15:22:07.88 .net]
そこにシェルスクリプトがあるから、的な何かかな?

825 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 15:47:33.25 .net]
コンパイルせずに実行できる(実質)唯一の共通規格言語だからじゃないの?
PythonとかはPOSIXの範囲外だからどこでも動くとは限らないし。
え? UNIX™なのにPOSIXと齟齬ありまくりの実装のAIXちゃん? 知らない子ですねぇ……。



826 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 16:25:04.06 .net]
localみたいにPOSIXじゃないけどだいたい
使えるってもの他にあったら教えて&#128225;

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 16:38:24.19 .net]
AIXはマジでどうにかして欲しい
seqすらないの本当に面倒臭い

828 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:03:19.85 .net]
AIX案件なんてあるの?

829 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:23:17.72 .net]
俺が行ってる現場だと1年くらい前までは現役でPowerでAIXを使ってたよ。
今はRedHatにリプレースされちゃったけど……そんなに嫌いではなかった。

>>807
jotも無かったっけ?

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:29:23.50 .net]
うちは親会社モニョモニョだから結構AIXが多くて嫌になる

>>809
手元のやつだとないな。AIX7.1だけど

831 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:26:28.33 .net]
>>804 >>805
それならシェル関数ではなく普通のシェルスクリプトでもいいだろう。
>>794 は単なるシェルスクリプトではなくシェル関数の利用にこだわってて謎。

832 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:31:30.33 .net]
シェル函数って
somefunc() {
echo "This is somefunc."
}
っていうやつでしょ?
>>794はそういう意味で使ったんじゃない可能性が出てきたな。
単に「パイプに渡せない」というような趣旨の要望を言いたかったのかもしれん。

833 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:47:44.46 .net]
>>812
たぶん find の -exec のとこに書けないって意味で書いてるだろうから、
シェルスクリプトじゃなくてシェル関数だと思う。

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:54:31.32 .net]
たとえパイプ経由でファイル名を渡せないって意味だったとしても、
find -exec でそれと同一機能が実現できるならそ別にいいじゃん。
>>794が find -exec の何を気に入らないのかやっぱり分からんな。

835 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:02:32.72 .net]
まぁでも「気に入らない」ってのは十分不採用の理由にはなるよな



836 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:09:13.58 .net]
趣味なら理由になるかもなあ。

でも仕事じゃ理由にならん。
要件を満たしてるってのは仕事じゃ最低限度の基準だからな。

POSIXに適合するシェルスクリプトにしたいっていう要件が最初に出てるのに、
趣味に合わないから採用しない、仕方ないから実装を諦めるなんて奴がいたら、
仕事なら無能扱いだよ。

837 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:13:23.18 .net]
そりゃ仕事と趣味は別だろ
何を当たり前の話をしてるんだ

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:31:21.92 .net]
いや、あの謎のこだわりに合理的な理由があるのか、
それともホントに完全に趣味だけの話なのかが気になってたんだよ。
合理的理由ナシ、完全に個人の趣味ってことでFAなら、それでいいんだスマン。

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 00:46:42.95 .net]
合理的じゃないけど合理主義だよね

840 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 01:12:03.45 .net]
aliasって面白いなー。これでなんか面白いことできそう

#!/bin/sh

alias foo="foo() { echo before; foo_; echo after; }; foo_"
foo() {
echo foo
}
unalias foo

foo
# ↓
# before
# foo
# after

841 名前:817 mailto:sage [2018/03/31(土) 01:41:51.42 .net]
やべぇ、このaliasの使い方、
めちゃくちゃ強力じゃないか?
文法の拡張が可能かもしれない
こんな所でネタにするレベルじゃないわ

842 名前:817 mailto:sage [2018/03/31(土) 02:06 ]
[ここ壊れてます]

843 名前::02.61 .net mailto: 黒魔術置いときますね

#!/bin/sh

def() {
alias begin="$1() { echo before; $1_ "\$@"; echo after; }; $1_() { $3=\$1"
alias end="}; unalias begin end"
}

def foo [ i ]
begin
echo foo $i
end

def bar [ j ]
begin
echo bar $j
end

foo 123
bar 456
[]
[ここ壊れてます]

844 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:30:40.57 .net]
そもそもaliasってシェルスクリプトの中で使えたっけ。
俺の環境では使えたけども

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:48:01.26 .net]
>>823
bashとかだとデフォルトでは無効
expand_aliasesを使えば有効にできる

ただ>>820の挙動が全てのシェルで同じなのかは調べてない
aliasの挙動をちゃんと把握してはないけど
どうやら行単位で実行前に、単純な文字列置換が行われてる感じだね

だからevalでもできないスクリプトの自己書き換えみたいなことができちゃう

参考(ちゃんと読んではいないw)
magicant.txt-nifty.com/main/2017/10/yash-2-285-b4d8.html



846 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:57:08.73 .net]
AIXの人はseqってどうやって代用してる?

847 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 09:20:43.88 .net]
awkでチョチョイでは?

848 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 22:32:30.06 .net]
みんな、変わった(?)の使ってるな。
Linux、BSD、Solarisなどのメジャーなもの以外で何がよく使われてるの?

849 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 22:52:09.24 .net]
Mac

850 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/01(日) 01:13:29.58 .net]
MacはBSD系ってことでまとめましょうw

851 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 07:41:52.65 .net]
$ man basename > man_basenam
でできるファイルを
emacsとテキストエディットで開いたものが次のものです。
https://imgur.com/a/8ggUs?
これはそういう仕様なのでしょうか?文字化けというか不思議な
コードになっています。できれば教えていただけないでしょうか

852 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 08:19:02.96 .net]
surf.ml.seikei.ac.jp/~nakano/JMwww/html/man/man1/man.1.html

バックスペースとアンダースコアがない プレーンテキスト版の man ページを得るには、コマンド


# man foo | col -b > foo.mantxt

を実行すること。

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 08:25:59.92 .net]
>>830
man エスケープシークエンス
で検索。

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 10:28:43.52 .net]
man manすればいい
TIPSに載ってる

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 14:17:49.92 .net]
あと、emacs に限って言うと
M-x man
(ESC x man リターン)
と叩いて、man のエントリー名を入れれば、
きっちり整形した結果を表示してくれるから、
col -b を使う必要はあまりない。



856 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 18:03:58.27 .net]
>>825
ググってみたらこんな方法があったよ。

yes '' | cat -n | head -100 | sed 's/ //g'

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 18:24:12.37 .net]
yesはなんか処理間違えると止まらなくなりそうで怖いんだよな

858 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:00:30.14 .net]
>>835
POSIX catには-nオプションがない[*1]のでnlコマンドを使う方法を提案する。
 $ yes '' | nl -b a -n ln | head -n 10 | sed -e 's/[ \t]*//g' | tr '\n' ' '

*1: pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html

859 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:07:04.97 .net]
 $ yes '' | nl -b a | head -n 10 | tr -d ' \t' | tr '\n' ' '
修正。もっと簡単にできるわww

860 名前:834 mailto:sage [2018/04/02(月) 21:28:17.87 .net]
これもしかしたらheadコマンドとnlコマンドの順番入れ替えると速度違う?
んなことないと思ってたけどビミョーに差があるかもしれん。
詳しい人検証してくれ……。
$ time

861 名前: for a in $(seq 10000); do seq 10000 > /dev/null; done
real 0m14.601s
user 0m0.452s
sys 0m3.736s
$ time for a in $(seq 10000); do yes '' | nl -b a | head -n 10000 | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 1m2.693s
user 0m5.672s
sys 0m21.032s
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 0m47.944s
user 0m1.472s
sys 0m17.820s
[]
[ここ壊れてます]

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:41:13.89 .net]
並行して動くか、出力の完了を待ってから動くかの違いだろ

863 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 23:47:22.15 .net]
パイプで繋いでプロセス4つも5つも上げるくらいなら、
素直にawk 1プロセスですませた方が軽くないか?

864 名前:836 mailto:sage [2018/04/02(月) 23:56:24.81 .net]
>>841
俺awkできないんだわ。恥かしいことにw
そのうち勉強しようしようと思っていて今にいたる。

awkでやるとどんな感じになる?

865 名前:836 mailto:sage [2018/04/03(火) 00:14:31.67 .net]
ていうかseqの既定の出力を勘違いしてた
 $ yes '' | head -n 10 | nl -b a | tr -c -d '\n[:digit:]'
こんなもんかな?
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -c -d '\n[:digit:]' > /dev/null ; done

real 0m42.358s
user 0m0.544s
sys 0m14.452s



866 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 00:40:30.08 .net]
awk 'BEGIN {for(i=10;i<=20;i++) printf "%d\n",i}'

867 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 01:08:09.19 .net]
yes '' | sed -n '=;10q'

868 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 14:22:10.27 .net]
sedでやるとは

869 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 18:22:16.97 .net]
何かゴルフっぽくなってきてるw

>>845
これ凄いね!

870 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 18:57:15.26 .net]
sedって計算完備なんだっけ。
やろうと思えばsed単体でseq作れるよね

871 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 19:03:30.37 .net]
sedでlispを作った人はいる

872 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 19:33:57.64 .net]
どうかしてるぜ

873 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 22:20:55.54 .net]
>>845
使うことないだろうけど感動した

874 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 23:45:32.30 .net]
そんなことより野球やろうぜ

875 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/04(水) 07:05:11.03 .net]
>>848
> sedって計算完備なんだっけ。
www.catonmat.net/blog/proof-that-sed-is-turing-complete/



876 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 00:02:39.79 .net]
家具家電彼女完備の家に住みたい

877 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 02:42:14.79 .net]
sinyabin.shの中でradiru.shを実行しています。
sinyabin.shの中の変数をradiru.shに引き継ぎたいんですが、どう書けばいいんでしょうか?

878 名前:852 mailto:sage [2018/04/05(木) 03:31:27.11 .net]
radiru.shには、
pushbulettに録音開始の通知
ffmpegを使ってaacのダウンロード
l-smashを使ってaacをm4aに詰め替え
aacの削除
dropboxへm4aのアップロード
ローカルのm4aの削除
pushbulettに録音終了の通知をするコマンドを記入

radiru.shは
$ sinyabin.sh チャンネル 録音時間 ファイル名
で録音出来るようになっているので、

録画したい番組毎にsinyabin.sh等を作りその中に、
$ sinyabin.sh チャンネル 録音時間 ファイル名
を記入しています。

radiru.shの中のl-smashでaacをm4aにする際に番組名やアーティスト名などのタグ付けも一緒にやりたいので、sinyabin.sh側であらかじめl-smashで指定するタグのオプションを記入出来ればと思いました。

879 名前:852 mailto:sage [2018/04/05(木) 03:41:17.05 .net]
radiru.shはaacのダウンロードだけにして、
Pushbulettへの通知、l-smash、Dropboxなどはsinyabin.shの方に書いたほうがいいんでしょうか?
そうすれば、ちょっと録音したいと思ったときいちいち番組毎のスクリプトをつくりその中にIDタグなど細かく書かなくてもすむから楽かなと。
でもそれだと、番組毎のスクリプトに「Pushbulettへの通知、l-smash、Dropbox」といったコマンドを書かないといけないので無駄かなあとも思いました。
どういうフローがいいと思いますか?

880 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:10:37.31 .net]
export すりゃいいんじゃない

881 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:22:06.60 .net]
こう質問の仕方が下手だと答える気失せるな
変数外に出せばいい

882 名前:セけ []
[ここ壊れてます]

883 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:59:32.39 .net]
852だけで良かったのにね

884 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 13:53:42.01 .net]
プログラミング素人っぽいし、加減がわかってないだろうから、
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。

885 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 18:12:51.21 .net]
>>856
radiru.sh に引数でタグ情報を渡せばいいと思いますが。



886 名前:名無しさん@お腹いっぱい。 [2018/04/12(木) 09:36:41.69 .net]
bashだと$LINENOでファイルの中での現在の行数が取得できるのですが、
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?

887 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:02:57.86 .net]
zshよくしらんけど、関数定義の手前の行番号を
変数にでも取っといて足し算すりゃいいんじゃね?

888 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:07:33.88 .net]
まぁやりようは如何様にでもあるんだろうが、
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん

889 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:14:56.99 .net]
$LINENOってどういう使い方を想定して作ったんだろうね

890 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:51:23.99 .net]
どこを見ればPOSIXシェルスクリプトの確かな仕様に出会えるのか知らないけど、
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

891 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 23:40:07.60 .net]
実装オプションにつけてあるIDコードの一つみたいだな。
コードの一覧は
ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html
にある。

オプション機能なので、実装されてるとは限らない。

892 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 00:40:09.23 .net]
LINENOが仕様どおりに実装されてないのは
この際見なかったことにして、現在使われてる
POSIX準拠シェルで完全に実装されてないものなんて有るの?

そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう
bash、ash、dash、zsh、ksh、mksh、yash、posh
他に知ってる?

893 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 16:31:32.55 .net]
$LINENO使って何をしたいんだろ

894 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:01:06.26 .net]
デバッグログ以外になにかあんの?
だからこそデバッグログとして使えない
$LINENOを何のために作ったのか理解できない

895 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:14:03.26 .net]
${(%):-%I}



896 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 20:10:19.92 .net]
$ ${(%):-%I}
-bash: ${(%):-%I}: 誤った代入です

897 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/17(火) 22:14:01.26 .net]
https://ja.wikipedia.org/wiki/IOCCC

> ^ Bourne Shellのソースコード( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は
> マクロ( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した
> 「ALGOLのような見た目のC」で書かれていることで悪名高い

898 名前:名無しさん@お腹いっぱい。 [2018/04/18(水) 10:39:06.43 .net]
自己解凍するファイルって便利だな
シェルスクリプトで解凍とインストール手順を記述して
それをバイナリと結合するだけでmsiみたいなことができる

899 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:04:27.31 .net]
>>875
それはちなみに sh アーカイブ形式って呼び名がついてる。
sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。

なお、ウイルスやマルウェアの温床だということで廃れた模様。

900 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:22:26.44 .net]
sharはそれでインストールまでするというより、tar.gz などのバイナリファイルを
テキストにしてメールやニュースで送るために使うことが多かった

901 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 16:21:07.45 .net]
>>877
へー、uuencodeしか知らんかった

902 名前:872 mailto:sage [2018/04/18(水) 21:50:42.61 .net]
あーわりと昔からある手法なのね……
VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで
画期的なアイデアに思えたんだわ……

903 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:47:33.56 .net]
echo "1 + 2" | bc > /tmp/a
とすると/tmp/aには2バイト、16進数で
33 0a のデータが入っています。

a=$(echo "1 + 2" | bc)
printf "$a" > /tmp/a
しかしこうすると$aには1バイトしか入ってないようです。

また [ "$(printf '1')" = "$(printf "1\n\n\n\n\n")" ]
これは一致した文字とみなされるようです

こういった挙動はどこを見れば理解できるでしょうか?

904 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:55:18.86 .net]
a="$(printf '1\n\n\n')"
とやってもaには1しか入っていない

a="$(printf '1\n\n\n2')"
しかしこうすると5バイト入ってる

その状態から a=${a%?} を末尾の2を削除すると
a には4バイト、1\n\n\n が入っている

うーん?

905 名前:名無しさん@お腹いっぱい。 [2018/04/19(木) 00:06:08.07 .net]
>>880
コマンド置換 $(...) の仕様

pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of
> the substitution. Embedded <newline> characters before the end of
> the output shall not be removed; however, they may be treated as
> field delimiters and eliminated during field splitting, depending on
> the value of IFS and quoting that is in effect. If the output
> contains any null bytes, the behavior is unspecified.

bashのマニュアルにも同様の記述がある

linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。



906 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:06:21.64 .net]
かといってこうやると4バイトでてるんだよなー

printf '1\n\n\n' | hexdump.exe -C

907 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:19:37.42 .net]
コマンド置換の仕様かぁ

普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー

ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ

908 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:24:31.94 .net]
あたりまえやろw

909 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:54:10.53 .net]
よくこんな単純なルールで辻褄取れてるよなー
思いつきで考えたとしか思えないルールなのにw

910 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/24(火) 02:26:08.83 .net]
単純なルールのほうが整合性は取りやすいんでは? 寧ろ複雑な規則だと実装に矛盾が生じたりしそう。

911 名前:名無しさん@お腹いっぱい。 [2018/04/27(金) 23:17:19.66 .net]
ちょっと質問
偶数日と奇数日で処理を分けたいんだけど、上手くできない
どうしたら良いのかアドバイスください

#!/bin/sh
DATE=`date '+%d'` # 日 を取得
buf=$(( $DATE % 2 )) # 計算

if [ ! $buf ]; then # 偶数
 hoge
else # 奇数
 fuga
fi

912 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/27(金) 23:43:49.55 .net]
その計算するとこ()の中に$いるっけ

913 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 00:55:01.80 .net]
>>888
#! /bin/sh -

DATE="$(date "+%d")"

if [ $((DATE % 2)) -eq 0 ]; then
echo "今日は偶数Day"
else
echo "今日は奇数Day"
fi

ある種の言語(

914 名前:Cとかだっけ?)はif文に0を放り込めるけど、
コマンドを逐次実行するだけのシェルスクリプトでは無理。
面倒だけど数値判定をしなきゃいけない。
あと、>>889氏の言う通り演算置換内の変数に弗記号は不要。
あと、コマンド置換は容易く入れ子にできて対も分かりよい$()を使おう。
POSIX sh 2003でもサポートされているので安心して。
[]
[ここ壊れてます]

915 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 01:37:16.44 .net]
BSDで標準コマンドだけで現在時刻(もしくは起動してからの)ミリ秒ってとれないのな
/proc/uptimeもBSDないみたいだしどうにかして取れないかなー

ファイルに書き込んでタイムスタンプで
取れないかなーとかもやってみたりもしたw
ファイルシステムによっては書き込まれるみたいだが
これも標準コマンドだけでどうやればー

できればなにも入ってない素のコマンドだけでやりたいんだよね
Perlでもやれるけど、dateコマンドに比べたら
起動時間が10倍も違うんだよな。

あ、ベンチマークというかコマンドの実行速度を細かく知りたいために使いたい。
timeコマンドは標準出力(エラーだっけ?)を乱すので使いたくない



916 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 01:49:17.29 .net]
あれとれなかったっけ?
なんか取れた気がしたけど気のせいだったか

917 名前:名無しさん@お腹いっぱい。 [2018/04/28(土) 19:41:21.09 .net]
>889-890
ありがとうできたよ。bufが空白になって常にelseに倒れてたから助かりました。
$の位置が良くわからなくて困っていたんだ

Cならいくらでも書けるんだけど、慣れない言語はちょとね・・・

918 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 20:34:44.86 .net]
>>891
timeコマンドの出力は標準エラーだよ。
標準出力の方は乱さない。

標準エラーが乱れる方も
(time sh -c '測りたいコマンド 2>&3' 2>/tmp/time.out ) 3>&2
みたいにすれば回避できるから、素直に time コマンド使う方がいい。

919 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 23:27:39.64 .net]
>>894
もう一つ問題があってなぁ。
dashじゃtimeコマンドビルトインじゃないんだよ
ビルトインじゃないからシェル関数で使えないんだよね

920 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 00:02:10.75 .net]
まあ使えないわけじゃないし候補にはなるけど、
OSごとに処理分けるの嫌だなぁ

921 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 00:07:48.59 .net]
/bin/timeって明示すれば?

922 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 02:10:30.87 .net]
もしくは
command -p time

923 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 08:34:10.39 .net]
いや、だからtimeコマンドだと
シェル関数扱えないからだめだって言ってるやん?

924 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 11:24:09.19 .net]
放置で

925 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 18:50:59.66 .net]
どうぞ



926 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/30(月) 09:52:20.53 .net]
mkfifo便利すぎる

927 名前:名無しさん@お腹いっぱい。 [2018/04/30(月) 10:17:56.64 .net]
シェルスクリプトの入門書を教えてください
ソフトバンクから出てるUNIXシェルスクリプト〜みたいな書名のものがAmazonでは評価高いみたいなんですが…
先輩方のおすすめを教えてください

928 名前:名無しさん@お腹いっぱい。 [2018/04/30(月) 14:27:06.11 .net]
>>903
こういう分野に関してはいまだにオライリーは信頼できる書籍を発行してるぜ。
まあ俺の持論だがw

https://www.oreilly.co.jp/books/4873112672/
↑これとか参考になる。コマンドの列挙だけじゃなく、システムとシェルの性質とか非常に基礎的な部分から触れてるのでよい(と思う)。

929 名前:900 [2018/04/30(月) 16:27:23.98 .net]
>>904
>システムとシェルの性質とか

これ正に知りたいことです
連休中本屋さん行くので是非中身読んで検討します
ありがとうございます

930 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:02:31.91 .net]
コマンドの出力結果を一時ファイルを作らずに
一行一変数に入れたいんですけどい

931 名前:い方法はないでしょうか?

変数はLINE1、LINE2・・・みたいな名前で
bash依存になる配列は使わない方針です。

foo | while read -r line; do
 LINE1=$line
done

みたいにするとサブシェルだから
ループ終わると消えてしまうし
[]
[ここ壊れてます]

932 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:34:46.41 .net]
sedかawkで代入文いっぱい出してevalかな。
特殊文字のエスケープちゃんと書かないといけないけど。

933 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:42:46.69 .net]
cat <<. |
1st Line
2nd Line
3rd Line
.
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s%s' 'LINE'"${ctlino}"'='"$(printf '%s' "'")""${lineval}""$(printf '%s' "'")" ';'
done |
printf '%s%s\n' "$(cat)" ':'
とりあえずこうすると
LINE1='1st Line';LINE2='2nd Line';LINE3='3rd Line';:
という出力が得られる。これを評価すればいいと思ったができねえ。

934 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:59:04.80 .net]
改良?
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done
→ LINE1='1st Line'; LINE2='2nd Li'"'"'ne'; LINE3='3rd Line'; :

935 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:00:08.10 .net]
改良?
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done |
printf '%s%s\n' "$(cat)" ':'
とりあえず単引用符のエスケープだけ。他にも必要なものがあればsedを挟んでいけばいいんでは。



936 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:12:01.86 .net]
> sedかawkで代入文いっぱい出してevalかな。
やっぱり残る手はそれか

937 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:18:49.70 .net]
$ radico rec -id=FMT -s=20180502040000
というコマンドがあったとして、「-s=」あとに今日の朝4時「date +"%Y%m%d"040000」の結果を入れたいんですが、一行で書く方法を教えてください

938 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:28:29.77 .net]
お前はこの前のレス群に対する結果とか報告してからにしろ

939 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 18:12:16.93 .net]
何も考えずぶん投げるけど変数exportとかじゃだめなのか

940 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 18:28:09.05 .net]
出来ました!

941 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 19:53:51.97 .net]
>>912
$ radico rec -id=FMT -s=$(date "+%Y%m%d040000")
コマンド置換くらい自力で調べーや

942 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:09:33.58 .net]
引数 $1 $2 $3 ・・・ のうち、特定の範囲n〜mを
別の関数の引数に渡すのってどうやればいいだろうか?
n〜mは条件で変わるものとする

943 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:27:56.41 .net]
>>917
一兆個のシェルを書いてきた俺がそんな事必要になった事がないから
お前の解こうとしてる問題が間違っている

944 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:34:19.62 .net]
>>918
やってることが簡単なパーサーのようなものですからね。
exprをシェルスクリプトで実装しているようなものです。
流石にこういう高度なことはやったことがないのでは?

945 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:27:50.67 .net]
shift $argnum
とかは?



946 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:47:14.90 .net]
>>920
それだと前からn個以降は実現可能だけど
範囲ができないんですよね。

947 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:51:49.30 .net]
bashだとこんな感じですね

foo() { echo "${@:2:3}"; }

$ foo 1 2 3 4 5
2 3 4

948 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:40:42.42 .net]
>>921
for文使えば?
selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2" && shift
done
}

selectargnum 3 5 "$@"

注意: シェル函数への第1,2引数は必ず非負整数で,引数の範囲内であるべし。

949 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:47:51.26 .net]
#! /bin/sh -

selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2"
shift
done
}

selectargnum 2 4 "$@"

もうちょっと親切に書くわ。

シェル函数selectargnumの
::仕様::
selectargnum <開始位置> <終了位置> <(処理したい)引数>
開始位置・終了位置は省略不可で,常

950 名前:識的な範囲であることを前提にしている。
::使い方::
上のコードを適当な名前のファイル(例えばselarg.sh)に保存して実行権限を賦与。
$ chmod +x ./selarg.sh
あとはファイル中のselectargnum函数の第1,2引数を書き換えて使える。
上の例なら
$ ./selarg.sh "第1引数" "第2引数" "第3引数" "第4引数" "第5引数"
に対して
第2引数
第3引数
第4引数
という出力が得られる。
[]
[ここ壊れてます]

951 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:50:36.20 .net]
seqを除いてPOSIX準拠。
もしもより厳密にPOSIXに従いたければ当該箇所を
seq $((toargnum - fromargnum + 1))
から
yes | head -n $((toargnum - fromargnum + 1))
としてもいいだろう。

952 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:17:05.15 .net]
>>922のせいで勘違いさせたようですね

> 別の関数の引数に渡すのってどうやればいいだろうか?
重要なのはこれ

another_function() {
for i in "$@"; do
printf "%s\n" "$i"
done
}

foo() { another_function "${@:2:3}"; }

another_functionはそのまま使って、
fooの部分をPOSIX準拠にして
以下のような出力を得たいということです

$ foo a "b 1" "c 1" d e
b 1
c 1
d

953 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:18:03.35 .net]
eval使うしか無いっすかね?

954 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:20:16.97 .net]
このコードの応用でできますかね?
いまいちこのコードがなにやってるのかよくわからんのですが

https://unix.stackexchange.com/questions/258512/how-to-remove-a-positional-parameter-from

for arg do
shift
[ "$arg" = "-inf" ] && continue
set -- "$@" "$arg"
done

printf '%s\n' "$@"

955 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:42:12.53 .net]
>>926
おいおいヒドいな俺の>>923-925は無視かよ
引数をどうにかしたいコマンドをsomefuncとして
#! /bin/sh -

selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(yes | head -n $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2"
shift
done
}

somefunc()
{
printf '%s\t%s\n%s\n' "$2" "$3" "$1"
}

somefunc $(selectargnum 2 4 "$@")

こういうので実現できると思うんだが?
なにかこれでは駄目な点があれば言ってくれ。
せっかくGW中とは言え頭使ったのにあまりにもあまりな仕打ちじゃマイカ



956 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:08:41.64 .net]
>>929
somefuncは分かりづらいんでこう書き換えるけど
somefunc() {
printf '%s\n' "$@"
}

$ test.sh "a" "b" "c" "d" "e"
b
c
d

こうなるところ
$ test.sh "a 1" "b 1" "c 1" "d 1" "e 1"
b
1
c
1
d
1

957 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:23:08.37 .net]
somefuncはこうしないとだめだな。
何番目の変数に入っているのか分かりづらい

somefunc() {
printf '1: %s\n' "$1"
printf '2: %s\n' "$2"
printf '3: %s\n' "$3"
}

958 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:23:43.87 .net]
なんかすごいどうでもいいことしてる気にならん?

959 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:26:07.99 .net]
しょうがないだろう。
引数には空白、シングルクォート、ダブルクォート、改行が
含まれる可能性があるんだよ

960 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:29:26.87 .net]
一見うまくいったと思いきや
$ test.sh "a" "b" "c" "d" "e"
1: b
2: c
3: d

変数Aに改行が含まれている文字列を入れ
$ A="b
b
b
b
"

以下のように実行するとおかしくなる
$ test.sh "a" "b${A}b" "c" "d" "e"
1: bb
2: b
3: b

> なにかこれでは駄目な点があれば言ってくれ。

駄目な点を言った

961 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:32:29.46 .net]
なお、俺が書いたコードだと以下のように正しく出力される

$ test.sh "a" "b${A}b" "c" "d" "e"
1: bb
b
b
b
b
2: c
3: d

>>928を参考にして以下のように書いた

selectargnum() {
func=$1 start=$2 length=$3
shift 3
i=0 last=$((start+length))
for arg in "$@"; do
: $((i+=1))
[ $i -gt $length ] && shift
[ $i -ge $last ] && continue
shift
set -- "$@" "$arg"
done
$func "$@"
}
somefunc() {
printf '1: %s\n' "$1"
printf '2: %s\n' "$2"
printf '3: %s\n' "$3"
}
selectargnum somefunc 2 3 "$@"

962 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:34:38.30 .net]
ただ問題は、>>935のコードを書いた俺自身が
なんでこのコードで動くのかよく分かってない所だなw
誰か俺の書いたコードが何をやってるのか教えてくれw

>>928のコードはなにやら引数を一周させているみたいだ。
俺が書いたコードは、その一周を途中で中断させているようだな?

963 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:37:45.65 .net]
eval使ったほうが簡潔かつ速い気がしてきたw
set -- の所、何度も引数をずらす処理をしているわけだしね。

964 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:38:19.15 .net]
長い
読む気にならん

965 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:39:32.30 .net]
長くて読まないのはわかるが、
なぜ読まないということをわざわざ宣言するんだろう?



966 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:42:04.26 .net]
まあ長いのは、>>929のコードに合わせたからであって、
メインの処理はこれだけなんだけどね

i=0 start=2 length=3 last=$((start+length))
for arg in "$@"; do
 : $((i+=1))
 [ $i -gt $length ] && shift
 [ $i -ge $last ] && continue
 shift
 set -- "$@" "$arg"
done

printf '1: %s\n' "$1"
printf '2: %s\n' "$2"
printf '3: %s\n' "$3"

967 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 05:49:25.62 .net]
>>935
ちょっとリファクタリング(ってほど大層じゃないが)
selectargnum() {
 func="$1"; start=$2; length=$3
 shift 3
 i=0; last=$((start + length))
 for arg in "$@"; do
  i=$((i + 1))
  test ${i} -gt ${length} && shift
  test ${i} -ge ${last} && continue
  shift
  set -- "$@" "${arg}"
 done
 "${func}" "${@}"
}

968 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:31:02.21 .net]
>>941
文字増やしてるだけじゃねーかw

969 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:31:17.96 .net]
不要な文字

970 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:50:55.78 .net]
リファクタリングは文字数減らすことを言うのじゃないけど

971 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 07:41:52.01 .net]
不必要な機能

972 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 09:41:05.71 .net]
一旦SQLiteにでも格納すれば何でも出来るで

973 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 12:57:05.87 .net]
なんか余計に読みづらくなっただけのような

974 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:11:25.55 .net]
解こうとしてる問題が間違っていると言ったやろw

975 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:13:23.38 .net]
bashだと簡単にできるようになったことのどこが
間違っているというのだろうか?



976 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:14:48.71 .net]
>>944
> リファクタリングは文字数減らすことを言うのじゃないけど

リファクタリングは文字数を増やすことじゃないって話

977 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:16:44.77 .net]
>>949
問題が間違っているとハッキリ書いとるやろwアホなん?

978 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:17:25.13 .net]
なぜ問題が間違っているというのか?
結論を最初に持ってこないように

979 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:22:50.10 .net]
>>952
あ、それが分からんのかw
引数の意味をパースすれば任意の位置指定でのスライスなど不要やからな
つまりgetoptで十分な問題を間違った角度から解こうとしとるっつー事やw
てかおまえ安価ぐらいできんのか

980 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:33:39.18 .net]
どういう理屈で、引数の意味をパースすれば任意の位置指定での
スライスなど不要になるのでしょうか?

981 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:41:59.15 .net]
>>954
まず安価しろ

982 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:43:07.07 .net]
例えばfindコマンドのように

find . -type f -exec chmod 600 {} \;

-execが来たら、chmodコマンドを;までをオプションとして
渡して実行みたいなのはスライス相当のものがないとできませんね

983 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:44:07.01 .net]
自分がやったことがないことだからって
問題が間違ってるということにはなりませんよ

984 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:44:46.06 .net]
>>953
根本的に何がしたいのかに依るんじゃねーのそれは
引数を解釈したいならgetoptでやるべきだが、今回やりたいのは引数のスライスそのものじゃね?
bashなら一行でできるそれをbash依存せずにやるにはどうすればって話なんじゃないか
まぁなんか妙なのが湧いてて話が無駄に複雑になってる感が否めないが

985 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:47:13.94 .net]
まあ言わないでもわかるでしょうが、
わざとスルーされないように言っておきますと、
-execは残りの引数を全て、指定したコマンドの引数として実行するものではなく
; までを引数とします。だから以下のように複数の-execもしていできます。

find . -type f -exec echo {} \; -exec echo {} \;



986 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:53:29.10 .net]
>>958
位置が固定ならいきなりスライスでも構わんが
今回のやつは任意の位置を指定したいと言っとるやろ
つまりその任意の位置がどこか分かった時点で引数の解析は終わっとるから
必要な引数も選別できているはずなんや
つまりそこからさらに位置指定でスライスしたいというのは
引数解析のアプローチが間違っとるいう訳やな

987 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:10:06.58 .net]
>>960
そして、その選別した引数(複数)を別の関数に渡すんだろ?
配列があれば、配列に選別していった引数を入れていけばいいだろうが
bash依存しないなら、配列は使えないよな。
お前ならどうするんだ?

988 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:10:06.74 .net]
>>960
任意の位置をどう指定するのかが要望ないからそこは>>922みたいな位置の直書きを想定してた
多分位置の指定まで引数に組み込むような汎用性高いものは要求されてないだろう
つまりいきなりスライスでいいと思ってる

989 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:17:44.04 .net]
>>961-962
関数に渡すならその引数に割り当てた変数に保存しとくだけやな
可変個ならevalするやろしw
どっちにしろもっと多くの状況がわからんと最適解は得られんわw

990 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:21:33.10 .net]
>>963
> 関数に渡すならその引数に割り当てた変数に保存しとくだけやな

>>917を読み返してみましょうか?
> 引数 $1 $2 $3 ・・・ のうち、特定の範囲n〜mを
> 別の関数の引数に渡すのってどうやればいいだろうか?
> n〜mは条件で変わるものとする


その引数に割り当てた変数とはなんですか?


結局↓これですか?
> 934 自分:名無しさん@お腹いっぱい。[sage] 投稿日:2018/05/03(木) 04:37:45.65
> eval使ったほうが簡潔かつ速い気がしてきたw

991 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:22:57.28 .net]
>>964
せやでw
こいつは問題を複雑に考えすぎとるだけやw

992 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:23:53.17 .net]
あれほど問題が間違っていると偉そうなこと言ったくせに
問題は間違ってないってことでいいんだろうな

993 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:24:26.11 .net]
>>965
そっちじゃない。
いきなり問題が間違っているといちゃもんを付けたことに
謝れって言ってる

994 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:25:12.82 .net]
>>966
正確には問題自体を複雑に考えすぎとるやなw
こいつの問題設定自体が間違っとるんやw

995 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:25:16.94 .net]
>>963
> どっちにしろもっと多くの状況がわからんと最適解は得られんわw

最初の質問の>>917に全て書かれてるじゃん
他に何の状況が知りたいのさ?



996 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:26:18.22 .net]
>>968
なんで問題設定に話をすり替えてるの?

問題は>>917。問題が間違ってるといちゃもんを付けたのは>>918

997 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:26:43.00 .net]
>>967
なんやおまえ質問した本人なんかw
ならもっと情報をさらけだしてみw
おにいちゃん達が手取り足取り教えてあげるやろからw

998 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:28:32.21 .net]
>>971
なんだお前が問題が間違ってるといちゃもんつけたやつか?
問題は間違っていませんでした、ごめんなさいって謝れば?

999 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:29:43.06 .net]
>>972
せやでw
てか教えて欲しいくせに何いきなりキレとんねんw
キチガイかおまえはw

1000 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:32:04.43 .net]
はぁ?教えてもらうも何も>>935で自力で解いたし
>>937でeval使ったほうが良いかもって、
それは最初からわかってるよアピール(笑)もしたし
お前はなにか役に立ったのか?

俺に問題が間違ってるといちゃもんを付けた挙げ句
結局、俺の足元にも及んでないじゃんw

1001 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:34:28.22 .net]
>>974
だからな?
もう少し柔軟なアタマと経験を持っとればそんな問題自体にぶちあたらんと言っとるのやでおいちゃんはw
人に教えてもらいたかったらもう少し素直になった方がええでおまえw

1002 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:38:23.58 .net]
>>975
お前に経験がないから問題にぶち当たってないんだろうw

それで、お前質問に答えずに逃げてるよな?

>>960
そして、その選別した引数(複数)を別の関数に渡すんだろ?
配列があれば、配列に選別していった引数を入れていけばいいだろうが
bash依存しないなら、配列は使えないよな。
お前ならどうするんだ?

1003 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:40:51.17 .net]
>>976
いくらお子ちゃまでもナチュラルに話がループするバカにつきあう気はないで生憎w

1004 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:40:58.71 .net]
偉そうに>>960で引数の選別をする方法で
できるような言い方をしているということは、
"このやり方の続き" でやる方法も当然思いついてるはず
質問に答えようか。

まさかここまでいって、この方法じゃ実現不可能だった
なんていうはずがないよなw

1005 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 15:39:01.57 .net]
やたらめったに長ったらしいコード書いたアホが元凶



1006 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 15:57:16.13 .net]
たしかに俺のコードは長すぎたし引数に改行が含まれると各行を引数だと見做してしまう
修正が困難な不具合があるからね(もし可能だという方がいるなら是非教えてほしい)。
実は俺自身もシェルスクリプトの経験はあまりないんだ。まだ仕事してねーし。
それが原因で場が乱れたとするなら申し訳ない。
ただ、言わせてもらうが、俺は寧ろ荒れた原因は「問題が間違ってる; 質問は正しい態度で」なんていう
主張をageながら口説いてる奴にあると思うがな。

1007 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:20:04.93 .net]
どっちもはしゃぎ過ぎ
それに、安価だのageだの馬鹿みたい

1008 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:29:15.75 .net]
>>980
いや、だから>>935で自力で解いたってw
eval使ったほうが良さそうだけど
(ここまで自力の結論というかeval版は質問前に作っていたがね)

1009 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:29:46.34 .net]
>>981
> それに、安価だのageだの馬鹿みたい
まったくだw 俺も最初からその2つは無視してるw

1010 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:31:30.06 .net]
IDが出ないスレでこれほど見難い言い争いはあんま見ないな。いや醜いかw

1011 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:41:10.54 .net]
ここって建設的じゃないよな、ホント

1012 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:10:05.54 .net]
自力で解いたっつてんだろ、何度も。偉ぶってんのはどっちなんだか。

1013 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:33:34.69 .net]
醜すぎw

1014 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:54:41.55 .net]
はい、次スレ
シェルスクリプト総合 その27
https://mevius.5ch.net/test/read.cgi/unix/1525337663/

1015 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 19:24:32.42 .net]
この人は問題を解きたいんじゃなくて
問題を自分のルールで解かせたいだけなんだと思う



1016 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 19:33:59.23 .net]
自分のルールってなんのことや?

1017 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:13:25.91 .net]
そうじゃなくて呈示されたコードの完成度が低くて、かつ
自分で作ったコードが要件を満たしていたから「お前ら馬鹿ばっかだな」になるんでしょう?

1018 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 20:15:23.07 .net]
ただのお子ちゃまやないかw
間違っとる言われてボクは間違ってないてすねとるだけやでw

1019 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:27:22.30 .net]
>>991
要件じゃなくて、あれはバグだよ
正しく動いてないじゃないか

1020 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:28:19.18 .net]
いまいち誰が誰だかなわからない追うのめんどくさすぎなのに、論評続けるねえ
質問内容に文句つけ続けのオッサン:一理あるが、一理でしかない。しつこいわっ
質問したヤツ:自力で解いたとかウザいわ。だったら最初から質問すんなwおっさんの一理を理解して素直に受け取れ

1021 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:37:05.47 .net]
>自力で解いたとかウザいわ。だったら最初から質問すんなw

書いた途端に解が分かったとかザラにあるだろ
お騒がせしました、とか書けない人格はアレだけど

1022 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:38:34.10 .net]
>>995
一行目は問題にしてない、全く。言う通りだし
二行目を問題にしてる、ほぼそれが全部

1023 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:58:18.53 .net]
能力はありそうに見えるのにもったいないよね。ああいうので仕事を失しなうってのは。
俺の同僚にも居たわ。正直に言って、俺より優秀だった

1024 名前:フに人当たりが強すぎてやんわり退職させられて
先月会ったらトビやりながら独学でコーディングしてるらしい
[]
[ここ壊れてます]

1025 名前:名無しさん@お腹いっぱい。 [2018/05/05(土) 15:07:28.61 .net]
すいません。すごく細かいことなんですが、
シェルの変数に関する展開で、
${somevar:-otherstring}
という、somevarに変数が格納されていなればotherstringを変数の値として採用するという仕組みがありますよね。
ここにコマンド展開が使えるということに最近気がつきました。
${somevar:-$(somecommand)}
これは、展開の順序としては
I. コマンド展開→変数の展開
 somecommandがresultを返し、${somevar:-result}になってresultが展開される
のか、
II. 変数の展開→コマンド展開
 ${somevar:-$(somecommand)}が$(somecommand)になってresultが返る
のか、
どちらか分かりますか?
ぶっちゃけ、この違いが影響するような状況に遭遇したことがないのですが、よりよいシェルスクリプトの理解の為にどうかよろしくおねがいします。



1026 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/05(土) 15:36:58.33 .net]
IIなんじゃねーの(鼻くそホジホジ)

1027 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/05(土) 23:01:08.19 .net]
somecommandを副作用のあるコマンド(touchとかrmとか)にしでsomevarがある状態とない状態でそれぞれどうなるか比べてみればいい。たぶんIIだと思うが。

1028 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 01:02:57.40 .net]
>>1000
おぉう。そんな手があったとは。勉強になります。
おっしゃる通りIIでした。
somevarに変数が格納されている時、somecommandは実行されませんでした。

1029 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 10:46:14.65 .net]
echo 999

1030 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 10:46:54.81 .net]
exit 1000

1031 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 411日 22時間 39分 28秒

1032 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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