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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:53:21.38 ID:BBiLRgnj0.net]
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ
シェルスクリプト総合 その28
mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

592 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:17:00.01 ID:lBOHSSIo0.net]
>>590
例えば
ファイルの名前がwhizprog.shだったとして
test "$( ps -p $$ -o 'comm=')" = 'whizprog.sh'
↑これが失敗・失敗しないで判定できるんじゃね?
尤もこれはシバン#!/bin/shというPOSIX未定義の構文を使ったばあいで
シバンを書いてないと使えない手だけど。

593 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:22:22.65 ID:8OkJCHKT0.net]
>>592
ん? assert実行するためのソースコード書き換えの話だよ
debug.sh script.sh で読み込んだ、script.shの書き換えは簡単だけど、
その script.sh から . コマンドで読み込まれるコードまでは書き換えられない

だから . コマンドを検出して再帰的に・・・面倒なんだよなw

余談だが、
> test "$( ps -p $$ -o 'comm=')" = 'whizprog.sh'
これはPOSIX準拠なのだろうが、busyboxではpsはwしか使えないw
ps w

594 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:50:01.93 ID:lBOHSSIo0.net]
>>593

ああなるほど そんなことまでは考えてなかった。
正直,あなたに教えてもらった方法で大満足です。ありがとう。(欲を言えば行番号を自分で……しつこいねw)
とりあえずこんな感じに落ち着きました↓
#!/bin/sh

assert()
{
exec >&2
eval "test ${2}" || {
printf '%s: %d: %s\n' "${0}" ${1} "${3-"Assertion ${2} failed."}"
exit 1
}
}

main()
{
set -eu
umask 0022
export PATH="$( command -p getconf PATH ):${PATH}"

assert 18 '"a" = "b"' && :

exit $?
}

main "$@"

595 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:06:21.14 ID:8OkJCHKT0.net]
update.sh script.sh でassert行の行番号を更新して上書き保存するってのもありかもw
それなら.コマンドの先も対応できる。いちいち更新しないといけないのが面倒だけど

596 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:44:08.29 ID:lBOHSSIo0.net]
更新するコマンドを別に作るんじゃなくてデバッグ時に更新も行うようにすれば(結局 手間は同じだけど)
だってデバッグする時ってその直前に必ず行番号やらを更新したいでしょう。

597 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:51:38.21 ID:wKJLu9V5a.net]
だんだんそもそもやりたかったことから離れてる雰囲気だけは感じた

598 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 22:33:00.25 ID:8OkJCHKT0.net]
>>596
まあ、そうなるよねw
まあ、方針次第だな

>>597
ようするに、シェルスクリプトの世界にもトランスパイラが欲しいって話さ

ちなみにどれだったか忘れたがシェルスクリプトの文法を
解析するやつ(ASTを作る)はすでにある
それを使えばそんなに難しくはないと思う(とは言えやったことはない)

599 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:15:08.44 ID:hLxIIZfE0.net]
もうシェル自体に手を入れてデバッグモードみたいなのを実装した方がいいんじゃね?

600 名前:デフォルトの名無しさん [2018/11/10(土) 23:18:28.98 ID:7gTt1pZ+0.net]
もうシェルでなにしたいんやおまえ



601 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:41:45.94 ID:wKJLu9V5a.net]
シェルブリットバーストを撃ちたい

602 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:58:52.52 ID:lBOHSSIo0.net]
>>599
一応POSIXでsh -xは定められてる

603 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:03:09.99 ID:Tyd11AGx0.net]
sh -xまじ使えねぇ
なぜ行番号を出すようにしなかったのか

604 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:16:53.30 ID:Tyd11AGx0.net]
>>600
assertじゃないの?

605 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:30:20.21 ID:PRctJ18Z0.net]
>>603
ほ ん と そ れ

そして今調べて気が付いたがsh -xじゃねーなw
set -xだわ。

> The -a, -b, -C, -e, -f, -m, -n, -o option, -u, -v, and -x options
> are described as part of the set utility in Special Built-In Utilities.
> The option letters derived from the set special built-in
> shall also be accepted with a leading <plus-sign> ( '+' ) instead of a leading <hyphen-minus>
> (meaning the reverse case of the option as described in this volume of POSIX.1-2017).
pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_04

606 名前:デフォルトの名無しさん [2018/11/11(日) 00:55:22.01 ID:TQKm/8h90.net]
>>604
なんでワイに聞くねんwバカなんかおまえ?

607 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:56:50.21 ID:AsOVz6G5M.net]
それを質問の意味で受け取るとか日本語大丈夫?

608 名前:デフォルトの名無しさん [2018/11/11(日) 01:00:58.12 ID:TQKm/8h90.net]
日本語が大丈夫ってどおゆう意味や?

609 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 01:05:43.58 ID:Tyd11AGx0.net]
おちつけ、今はまだ慌れるときじゃない。

610 名前:デフォルトの名無しさん [2018/11/11(日) 01:09:59.72 ID:TQKm/8h90.net]
慌れるて日本語あるんか?ちょっと落ち着けやw



611 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 02:43:07.51 ID:Tyd11AGx0.net]
りっしんべんが余計だった

612 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 12:28:16.92 ID:PRctJ18Z0.net]
C言語ではなくシェルスクリプトでシグナルって活用してる?
kill(1)ユーティリティの-s KILLオプションくらいしか使ったことがないので
いまいち便利さが分からない。
利用者定義シグナルSIGUSER1とか 使いこなせたらシェルスクリプトでできることの幅が広がりそう

613 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 12:33:00.83 ID:Tyd11AGx0.net]
CTRL-Cされたときとかプログラム終了時に
作業ファイルを削除することぐらいかなぁ

あとはシグナルじゃないけど、bashの疑似シグナル
ERRとかDEBUGとかで遊んだことある

サービスなんかだとシグナル送ったら設定ファイル再読込したり
ddだったら進捗状況表示したりするね

614 名前:デフォルトの名無しさん [2018/11/11(日) 22:34:54.73 ID:0F8Q4Ddx0.net]
>>612
終了処理をちゃんとやらないといけないような処理の場合に trap 使ってシグナルに対して
特定の変数を 1 にするだけとか、そういうやり方で終了処理後にその変数見て 1 になって
いたら exit みたいな感じでシグナル利用するな。

後は普通に kill で他のプロセス終了させたい場合。pkill 使う事もある。

615 名前:デフォルトの名無しさん mailto:sage [2018/11/12(月) 12:58:25.45 ID:JkRQG90v0.net]
実行してるシェルスクリプトに行番号を付けるのさ,
PS4変数にn=$((n+1))みたいなのを入れてset -xとやればうまくいくかな と思ったんだが無理っぽいな。
どっかで無限ループして何も出力されないw

616 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 19:40:03.28 ID:0Ele5WZ80.net]
算術式のなかにコマンド展開を突っ込むのってPOSIX違反かしら
echo $(($(< ./file.txt wc -l)-1))←こういうの。

617 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 20:47:22.69 ID:tvSD0Nan0.net]
>>616
pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04
これを読む限りは特に規定されてるようには見えない

618 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 15:25:56.02 ID:P8pvRdrO0.net]
>>617
なるほど。今手元にあるGNU/Linuxでは普通に動くけど
やめたほうがいいかもね。
Solaris 10とかで失敗しそう(使うことないだろうがw

619 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 15:29:13.15 ID:Da4Ohzbn0.net]
えぇ・・・

俺普通にこんなの使ってんだけど?

value=$(( ${value:-0} + 1 ))

普通に展開されるんじゃないの?

620 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:18:09.15 ID:P8pvRdrO0.net]
>>619
まあ俺も使い捨てのスクリプトでは使うけど
ただPOSIX 2017では
x=3; x=$((x+1))
↑これすら正常に動くとは定義されてないんだよね
ただ単に
x=3のとき$((x))は$(($x))と「同じ値になる」とだけ。
だから例示されるスクリプトでも
x=$(($x + 1))
みたいに書かれてる。



621 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:40:42.71 ID:Da4Ohzbn0.net]
>>620
> x=$(($x + 1))

shellcheckではそれ不要だから外せって言われるよ?
shellcheckが完璧だとは思わないけど、
あえてそうしてるんだからPOSIXだと思うんだけどなぁ

622 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:46:17.02 ID:P8pvRdrO0.net]
>>621
shellcheckはそれに関しては間違ってると言えるな
なぜなら もう言ったが
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
↑ここで
x=$(($x-1))とはっきり書かれてるんだよ。

623 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 17:07:17.10 ID:Da4Ohzbn0.net]
>>616
あ、大丈夫みたいだよ。
コマンドも展開されるって書いてある

$((expression))

The shell shall expand all tokens in the expression
for parameter expansion, command substitution, and quote removal.

624 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 17:18:05.78 ID:Da4Ohzbn0.net]
あ、なるほど。わかった。

${a} って書いたときの、aの部分が式なんだ。$は含まれない。それと同じで
$((a)) もaの部分が式で>>623に書いてあるように、先に展開される仕様だから
$(($a))だと先に$aの部分が文字列として展開されて$((123))のように解釈される

だから https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるように

> $ a='1+1'
> $ echo $(($a * 5)) # becomes 1+1*5
> 6

これだと、式が評価される前に文字列として展開されちゃうから変な計算になるが

> $ echo $((a * 5)) # evaluates as (1+1)*5
> 10

${a}と同じように$((a))と書くと、ちゃんと算術演算が行われるんだ

ということで、やっぱり$(($a))は間違いで$((a))が正しいようだね

625 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 18:02:30.17 ID:Da4Ohzbn0.net]
間違いっていうのは仕様違反って意味じゃなくて
算術演算をするなら$をつけないのが正しいって意味ね。

算術演算の前に$とかコマンドが展開されるっていうのも
仕様なのでそれも書いたとおりに動作する

626 名前:デフォルトの名無しさん [2018/11/14(水) 19:06:25.03 ID:vF6ts/2/r.net]
大きなファイルがいくつも入ったディレクトリのmvして分かったけど
ファイルがいくつあっても全部のcpが終わったあとにrmされるんだね
てっきり1ファイル毎かと思ってた

627 名前:デフォルトの名無しさん [2018/11/14(水) 19:23:07.48 ID:bryEJhFFa.net]
>>626
途中で中止した時に移動先を削除するだけで済むからじゃないかな。

628 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 19:34:11.25 ID:P8pvRdrO0.net]
>>625
んー。でも俺には
> If the shell variable x contains a value that forms a valid integer constant,
> optionally including a leading or ,
> then the arithmetic expansions "$((x))" and "$(($x))" shall return the same value.
は$((x))の「時だけ」$(($x))と等しいと読めるがな。
いずれにしても算術展開で算術計算をする際に変数を使いたいときは
$(( ($x) + 1 ))
にしてるわ。どっかで$(( x + 1 ))がエラーになるのが怖いので。

629 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 21:35:28.76 ID:tEjpeAN9a.net]
>>626
renameはアトミック操作にすべきって思想が強いから
違うファイルシステムにmvするときはそうだな

630 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 21:50:05.93 ID:D6nmDs23M.net]
$(())が展開できるものは限定されていて、$((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
これは$(())の中だけはx=$xであると解釈できなくもないけど、算術演算をするなら$をつけないのが正しいとは読めないな。



631 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 22:59:44.88 ID:Da4Ohzbn0.net]
> $((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
一つあれば十分じゃん。逆に展開されない根拠はないんだし

そもそも ${expression} と $((expression)) という記述があるんだから
expressionの中は同じ意味のはずだろう

632 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:06:12.49 ID:Da4Ohzbn0.net]
> どっかで$(( x + 1 ))がエラーになるのが怖いので。

それがエラーになるなら、とっくに検出してるだろうな。
複数のシェルで確認してるからさ

それ関連で注意が必要なのは $(($#-1))
zshだと81になる。

633 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 07:34:42.91 ID:CPG8nmHa0.net]
>>631
いや算術演算するときは$をつけないのが正しいとは何処にも書いてないけど

634 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 08:48:01.92 ID:sJsqi8La0.net]
というか,shellcheckでの検査結果うんぬんよりも本家POSIXの記述のほうが優先して考慮されるべきだと思うのだが。

635 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 10:49:23.03 ID:gWaB1LhD0.net]
本家POSIXに$((x))が動くと書いてあるだろ

636 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 11:23:09.13 ID:gWaB1LhD0.net]
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
に書いてあるだろ

> Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value.
> The format for arithmetic expansion shall be as follows:
>
> $((expression))
>
> The expression shall be treated as if it were in double-quotes, except that a double-quote inside
> the expression is not treated specially. The shell shall expand all tokens in the expression for
> parameter expansion, command substitution, and quote removal.

まず、$(( )) の中にある。これがexpressionだ。
expand all tokens in the expression 式の中にある以下のトークンの展開、
for parameter expansion, command substitution, and quote removal.
パラメータ展開、コマンド置換、クォートの削除

> Next, the shell shall treat this as an arithmetic expression and substitute the value of the expression.
その次(Next)に この式を arithmetic expression (算術式)として扱う

つまりだ。パラメータ展開( $(($x))の$xの展開 )が行われるまでは、まだ算術式として扱う前なんだよ

そもそもだな。 x=123を見て分かる通り。変数名はxだぞ。$xじゃない。
他の言語では変数名が$で始まるものがあるが、シェルスクリプトにおいて、
$は、パラメータ展開、コマンド置換、算術展開等を行うための記号だって書いてあるだろ?

特殊変数の説明だって、$@じゃなくて@、$*じゃなくて*、$#じゃなくて#、$$じゃなくて$ と書いており
変数名とは最初の$は含まれない部分だってことが読み取れるだろ

637 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 11:44:50.73 ID:sJsqi8La0.net]
>>636
そのすぐあとに
x=$(($x - 1))
という記述があるんですが。
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01

638 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:00:52.72 ID:gWaB1LhD0.net]
>>637
あるからなんだよ?

パラメータ展開が行われるから
x=$(($x - 1)) は x=$((100 - 1)) となって動くだろうさ
それは x=$((x - 1)) がだめな理由になってない

639 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:27:06.72 ID:sJsqi8La0.net]
>>638
発端は>>620
> > x=$(($x + 1))
>
> shellcheckではそれ不要だから外せって言われるよ?
> shellcheckが完璧だとは思わないけど、
> あえてそうしてるんだからPOSIXだと思うんだけどなぁ
これなんだが。
つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。
x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。
ただ,POSIXには前者の記載はあって後者はないから,
shellcheckの「後者にしろ」っていう判定は絶対におかしい。

640 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:34:01.42 ID:gWaB1LhD0.net]
shellcheckは間違いだから不要と言ってるんじゃなくて、
意味がないから不要って言ってるんだよ。

お前コードチェックツールで変数が使われていませんって
指摘されたら、文法上は間違ってねーよって文句言うのかよ?



641 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:36:27.53 ID:zXViJGdda.net]
ファイッ

642 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:36:35.34 ID:gWaB1LhD0.net]
> shellcheckの「後者にしろ」っていう判定は絶対におかしい。

後者にしろって言う判定は、前者が間違ってるって話じゃなくて、
後者もOK、だから後者はPOSIX違反ではない(POSIX違反を提案するわけがない)って話だよ

もうちょっと落ち着けよ。お前否定されたらすぐカッとなるだろw

643 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:41:58.45 ID:gWaB1LhD0.net]
> つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。
> x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。

後者が動くのであれば
>「$x」が不要という主張は完全に間違い
という主張の方が間違ってる。

そして後者は実際に動く

644 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 13:09:09.63 ID:sJsqi8La0.net]
前者も実際に動くんですがそれは

645 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 13:35:59.93 ID:gWaB1LhD0.net]
だから前者が動かないなんていてないだろ
前者に$(($x -1))の$xの$が意味がないから
(POSIX準拠で問題がない)後者の方が良いって話であって

たまにいるんだよな。誰かにより良いコードの提案をされたら
俺の書いたコードが間違っているっていうんか、仕様どおりだ!って怒るやつ
仕様違反だとか間違ってるかどうかの話なんかしてない
(正しいコードの範囲で)より良いコードにしましょうってことなのに

646 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 14:51:03.70 ID:sJsqi8La0.net]
すまん。怒らせるつもりは毛頭なかったんだわ。
ただ,「標準でははこうなってますよ」と示しただけ。
まあちょっと俺の言い方もキツかったな。
言い訳させてもらうと,今までPOSIXの仕様書も読まずに
$(())算術展開は``に書き改めるべきとか,その割に[[文を使ってたりだとか
そういう人間と多く議論してきて,こっちもかなり厳密さを求めるようになってしまっていた。
正直なところ仕様違反でもほとんどの環境で動くなら,別にそっちを使ってもいいかもね。

647 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 14:58:36.45 ID:gWaB1LhD0.net]
だから仕様違反じゃないつってるだろうが
なんでこいつ理解能力無いんだろう?
冷静なふりして、冷静じゃないだろ

648 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 15:08:37.91 ID:gWaB1LhD0.net]
$(($x - 1)) と $((x - 1)) のどちらも仕様違反じゃないのに
$(($x - 1)) が動くってことは、 $((x - 1)) は仕様違反に違いニダ!って
どういう思考回路なんだろ?

$(($x - 1)) と $((x - 1)) は前者が先に$xのパラメータ展開が行われるため動作に違いがある
https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるとおり。
それはおそらく意図しないものだろうから警告される。

お前がPOSIXの仕様を読んでいない相手と議論してきたとか知らんが、
お前なんかよりも shellcheck の作者の方がよっぽどPOSIXの仕様に詳しいだろうよ
なにせシェルスクリプトの構文解析機を作ってるし、
世界中から間違いがあったら指摘される立場にあるんだから

649 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 20:59:56.50 ID:8sDmawlrM.net]
またvoid君かよ

650 名前:デフォルトの名無しさん [2018/11/16(金) 18:15:57.23 ID:4Z/2Zn+la.net]
Windows用の busybox.exe なんてものがあることをたった今知った。
こんなのあったんだな。

まあしかしよくよく考えてみればWindows用のgccとかのコンパイラでコンパイルすれば良いだけだからさほど凄いことではないか。



651 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 20:52:55.20 ID:0Fk/0vf10.net]
case "$(<なにかの処理>)" in
'A'|'aaa') echo 'B' ;;
*) echo "$(<なにかの処理>)" ;;
esac
みたいな文でさ,<なにかの処理>を(できれば変数とか使わずに)一つにまとめたいんだけど
できるかな。

"$(<なにかの処理>)"の結果が'A'か'aaa'の時のみ'B'を出力して,それ以外の場合はその処理のまんまを出力したい。

RESULT="$(<なにかの処理>)"
case "$RESULT" in
'A'|'aaa') echo 'B' ;;
*) echo "$RESULT" ;;
esac
でもいいんだけどな〜んか無駄がある気がするんだよね……近い場所で二回同じ変数使ってるっていうのが。

652 名前:デフォルトの名無しさん [2018/11/16(金) 21:08:59.95 ID:4Z/2Zn+la.net]
気のせい

653 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 23:08:25.02 ID:pv33BTTMM.net]
算術展開で$付けるのはナンセンスだからやめたほうがいい

654 名前:デフォルトの名無しさん [2018/11/16(金) 23:43:45.38 ID:HodhQ/sE0.net]
いい感じのバカっぽさw

655 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 00:11:39.03 ID:dLBGWOhBM.net]
>>654
お前の書き込みがな

656 名前:デフォルトの名無しさん [2018/11/17(土) 00:41:14.93 ID:eQWBxdMf0.net]
なんか悔しかったんかなw

657 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 01:07:52.12 ID:LhPQgZnG0.net]
>>651
変数を使わないの書き方の基本の一つは引数(パラメータ)を使うことだよ
引数を変数の代わりとして使う。そのやり方に2パターンある

・パターン1 関数を作る(呼び出し先の関数の引数にする)
foo() {
 case "$1" in
  'A'|'aaa') echo 'B' ;;
  *) echo "$1" ;;
 esac
}
foo "$(<なにかの処理>)"

・パターン2 引数を再設定する(自分自身の引数にする)
set -- "$(<なにかの処理>)"
case "$1" in
 'A'|'aaa') echo 'B' ;;
 *) echo "$1" ;;
esac

パターン2はこのままだと自分自身の引数がなくなってしまうが、
set -- "$(<なにかの処理>)" "$@"
とすることで、残しておくことが可能。以降は引数の番号をずらして
扱うかshiftで元に戻すなりするか、引数の個数が固定なら、
set -- "$@" "$(<なにかの処理>)" と逆にしてもよい

余談だが、そんなコードを書くぐらいなら素直に変数を使えばいいと思うかもしれないが、
シェルスクリプトの変数がグローバル変数なのに対して、
引数は(レキシカルスコープ的な)ローカル変数になってるという重要な違いがある
localやtypesetを使った変数のローカル化はダイナミックスコープなのでそれとも違う

658 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 01:38:27.92 ID:dLBGWOhBM.net]
>>656
お前が?w

659 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 09:28:35.93 ID:XLrbbNN30.net]
>>657
setって便利だよね
関数の最初に
set -- $? "$@"
として最後に
return $1
とすれば終了コードも保存できるし。

660 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 18:51:09.82 ID:ikDL4PRg0.net]
ちょっと力を貸してほしい
https://paste.ubuntu.com/p/hx6cFRKJKm/
今、↑こういう引数処理を書いている。
動作としては
$ ./argprs.sh -abc VAR -pqr FILE --long-opt --opt-req-par="foo bar" -- --not-opt
短いオプション1: a; 'VAR'
短いオプション2: b
短いオプション3: c
短いオプション4: p
短いオプション5: q
短いオプション6: r
被演算子1: FILE
長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'
被演算子2: --not-opt
こういう出力ができるはず。つまり-aと--opt-req-parはパラメータを取って、--以降はオプションとして解釈されないっていうやつ。
ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。
動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。



661 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 19:14:04.69 ID:DG9kgnl30.net]
なんで、aのあとにVARくるんだ? 仕様がおかしくないか?

VARが単体の値もしくは、-cの値っていうのならまだわかるんだが

662 名前:デフォルトの名無しさん [2018/11/17(土) 19:19:32.18 ID:eQWBxdMf0.net]
エクセルマクラーと同じ病気やね

663 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 19:49:25.15 ID:DG9kgnl30.net]
tarで試したが、これで動くのかよ・・・

tar czvf a.tar.gz a
tar fczv a.tar.gz a

パラメータ取る短いオプションが複数あったとき
どう解釈するのが普通なんだろ

664 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:09:39.20 ID:DG9kgnl30.net]
getoptやgetoptsは短いオプションがパラメータを取るとき、
短いオプション以降がパラメータとみなされるようだ

-abcde で cがパラメータを取るとき、
-a -b -c de と解釈される

実装によってバラバラなのは当然だろうが
こっちのほうが楽だろうな

>>660の仕様だと、aとcがパラメータを取るとき
-abcde VAR をどう解釈して良いのかわからない
-abcde VAR1 VAR2 とすりゃいいのかもしれんが、
これは人間にとってわかりやすいんだろうか?

665 名前:デフォルトの名無しさん [2018/11/17(土) 20:18:41.59 ID:eQWBxdMf0.net]
バカは考えるだけムダやぞw

666 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:23:56.08 ID:UtANxJrV0.net]
>>663
tarはハイフン無しでオプションを書くといい感じに並べ替えてくれる

667 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:45:00.33 ID:ikDL4PRg0.net]
つまり
-aVAR
-xyza VAR
みたいなのは許容して
-axyz VAR
は許容しないようにすればいいのかな。

まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw

668 名前:660 mailto:sage [2018/11/17(土) 21:16:27.44 ID:ikDL4PRg0.net]
こうしてみました。
短いオプションの解析ルーチンの遅さは改善してませんが
値を取るオプションの解釈を皆さんから提示された方式に変えました。
https://paste.ubuntu.com/p/n7m8qZHwMb/

669 名前:デフォルトの名無しさん [2018/11/17(土) 21:33:05.69 ID:eQWBxdMf0.net]
>>668
提示てwバカにされとんのやぞおまえw

670 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 22:38:36.24 ID:ikDL4PRg0.net]
こういういったシェルスクリプトを書くの大変なので自動的に生成してくれるのがあればいいですけどね。
Pythonのdocoptみたいな。



671 名前:デフォルトの名無しさん [2018/11/17(土) 22:57:50.85 ID:eQWBxdMf0.net]
>>670
そういったシェルはそもそも必要とされとらんのやぞ

出来るからといってやりすぎになるのはバカの悪癖やw
改めた方がええでおまえw

672 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 23:25:40.65 ID:4Do7jDVB0.net]
ふつーに、getopts でええやん!
入力補完を使ったら、別にコマンドが長くてもわかりやすさ優先でかまへんわ。

673 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 23:58:26.07 ID:2WlUsnTW0.net]
Ruby にも、OptionParser, ARGV.getopts などのモジュールがあるので、自作などしない

674 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 00:47:33.69 ID:tOYW/MHy0.net]
>>667
遅い原因はcutを使うからなんだけどねw

>>668
__cnt_opd__のせいでごちゃごちゃしてる。
なんに使ってるかと思ったら、番号出してるだけだよな?
オプションは普通順番には依存しないので最終的には不要なはずだ。
逆に分かりづらくなるから、こういうのは書かないほうが良いぞ
もしくはその部分を関数に分離してそっちでカウントするとか

あと並べ替えてもいいんだな

>>670
よし、作るんだ!

>>673
作者「なかったから自作したんやで」

675 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:05:23.45 ID:tOYW/MHy0.net]
>>668
とりあえず邪魔なんで、本質的なコードと、どうでも良いコードは分けた
https://paste.ubuntu.com/p/DRf6Nzz8kM/

676 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:17:46.87 ID:tOYW/MHy0.net]
余計な変数を消したり、被演算子の部分を外出ししたりした
https://paste.ubuntu.com/p/p7VwzJZ8Hv/

あとオレがリファクタリングするときによくやるんだが、
(他人の)リファクタリングする前のコードは長いことが多い

全体を把握しやすくするためにあえて一行にしたりして短くしている。
最終的にこのような書き方をするというわけではなくて一時的な処置

677 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:19:40.72 ID:tOYW/MHy0.net]
あと、これもしたな。こんな部分、あとでどうとでもなるんだからここでやることじゃない

長いオプション1: long-opt
長いオプション2: opt-req-par; 'foo bar'

長いオプション1: --long-opt
長いオプション2: --opt-req-par; 'foo bar'

678 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:21:35.58 ID:dx8aUZPH0.net]
caseの後の変数はダブルコーテーションで括らなくていいって知ってた?

679 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:26:08.97 ID:tOYW/MHy0.net]
長いオプションの部分をフラットにした。
https://paste.ubuntu.com/p/Y4nTQBnTFw/

あとはクソめんどくさい一文字の部分だな。
どうするか考えとらんのだがw
仕様は変えるかもしれん。

680 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:27:00.28 ID:tOYW/MHy0.net]
>>678
うん。だから徐々に消してるよw



681 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:28:24.11 ID:tOYW/MHy0.net]
あ、いくつかパっと見でわかるミスがw
まあ途中のコードは参考だから
俺がどうやってリファクタリングしているか

682 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:04:33.63 ID:tOYW/MHy0.net]
とりあえずは大まかな仕様は変えてない
https://paste.ubuntu.com/p/SQFnqmCJs2/

変数をなくそうか、でもそうすると再帰ありの関数を追加するか
setを使わないといけなくてごちゃごちゃする。
いろいろ悩んだがとりあえずそのままにしている。

cutの呼び出しはなくしたので速くなってるはず。
といっても、この程度だとLinuxなら体感できないはずなんだがWSLでやってる?

1文字オプションの分解の所がやはり面倒だな。
知らないオプションはエラーにするようにすれば、
1文字を抜き出す必要はなくなるかもしれないが

683 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:13:58.54 ID:tOYW/MHy0.net]
>>670
> Pythonのdocoptみたいな。

あと一応あるで
https://github.com/docopt/docopts

goバイナリでオプション解析して、シェルスクリプトで
evalできるコードを出力して、そのコードで環境変数を
設定するという仕組みで、純粋なシェルスクリプト実装ではないけど

684 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:21:13.13 ID:tOYW/MHy0.net]
ちなみにオプション解析の部分は一般的に最初に一回だけ行う部分なので
被らないようにしたり、無理して変数をなくす必要はないんだけどね

685 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:17:51.79 ID:Fz4U8sel0.net]
>>674
オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
rm -i -f
としたときに「確認する」のではなく「強制的に消し」たいので。
alias rm='\rm -i'
の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?

686 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:19:37.66 ID:Fz4U8sel0.net]
>>682
エスパーかな?
その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?

687 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:23:02.81 ID:Fz4U8sel0.net]
連投すまん。
ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで,
そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。
だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。

688 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:35:21.66 ID:Fz4U8sel0.net]
${numbar:-0}←これすごいアイデアですね。
シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、
「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。

689 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:59:50.57 ID:tOYW/MHy0.net]
>>685
> オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
それなら変数に入れておけば良いんだよ。
競合するオプションなら、変数を同じにしておけば良い

基本的に「オプションの解析」では変数に値を入れるのみ
その場で処理はしない。変数に入れた値が後者で上書きされるから
必然的に後者が優先される


> その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?

time dash -c 'i=0; while [ $i -lt 1000 ]; do echo a | cut -c 1 > /dev/null; i=$((i+1)); done'

Linuxでこれを実行すると約1秒。WSLでこれを実行すると15秒。fork(サブプロセス生成)が行われるとこれだけの差がでる
元々forkは遅いのだが、WSL上だと更に輪をかけて遅くなるのがわかる

これをforkなしのシェルだけで実行できる同等のコードに置き換えるとWSLで50ミリ秒に減る。Linuxだと20ミリ秒にへる
time dash -c 'i=0; while [ $i -lt 1000 ]; do v=abc; v=${v%"${v#?}"}; echo $v >/dev/null ; i=$((i+1)); done'

もっともforkなしのコードは万能ではなく、文字列の最初の一文字を取るために「文字列の最初の一文字を取り除いた残り」を
求めてから、全体から抜き取っているために、文字列が長くなると極端に遅くなる。

文字列を1文字ずつ処理するコードを書いたとして、1000文字〜1万文字程度が限界。(数秒〜数十秒かかる)
それ以上の長さの文字列を1文字ずつ処理するコードを書くならsedあたりで1文字ずつに分解して処理したほうが良いだろう
POSIX準拠しなくていいなら${v:0:1} を使ったほうが速いと思う(計測はしてない)

だけど一般的なオプション程度の長さであれば十分速い。少なくともcutを使うよりも遅くなることはないだろう

690 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 18:05:11.85 ID:tOYW/MHy0.net]
>>668
今回は長いコードが邪魔だったので使ったけど、
例えばnumberが環境変数としてexportされていたりしたら
おかしいことになるので最初に初期化するほうが良いけどね
毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし

それよりも、所見では使い道がわからない
${var:+value}の方が凄いアイデア
シェルを作った人はよくもまあこんな応用例が
高いものを作ったもんだと思うよ



691 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 23:06:30.15 ID:Fz4U8sel0.net]
test <string>は<string>が非空に限り成功するのね。これも知らんかったわ……。

692 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 17:53:42.80 ID:OLor19Fe0.net]
しつこくてすまん。
シェルスクリプトの引数解析の話なんだが
(-cが引数を取るオプションとして)
「$ somecmd -c -- --not-a-opt」
っていうコマンドラインにおいて,
・「--」を-cオプションの引数として見るか
・「--」はいかなる場所(オプションの引数の位置だとしても)においても
 以降が被演算子であることを示すものであると見るか
どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で
エラーになる。

693 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 18:33:47.11 ID:UM5ff+tU0.net]
引数取るなら何であれ引数に決まってるだろ
どうでもいいけどさ、その被演算子ってのやめてくんない?
演算子なんて登場してないんだから

694 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 18:55:25.78 ID:OLor19Fe0.net]
operandって被演算子のことだと思うんだけど。
まあ「--」を引数と見るってことね。ありがとう。

695 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 19:16:12.30 ID:UM5ff+tU0.net]
だからそのoperandが出てこないって話

696 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 20:33:17.21 ID:cLxfY5McM.net]
operand
https://wa3.i-3-i.info/word13306.html

697 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 21:01:13.07 ID:UM5ff+tU0.net]
>>696
はい。どうも。 exprとか引数が何かしらの式であるものは
演算子以外の部分が被演算子(オペランド)になることはありえるけど
なんでもかんでもオペランドなわけではないよね

698 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 21:31:00.38 ID:OLor19Fe0.net]
ああ。ほんとだ。The Open Groupの文書を参考にする限り
somecmd -c XXX FILE
とあった場合被演算子はFILEでXXXはオプション引数だね。勘違いしてた。

699 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 12:14:20.49 ID:I8hvszb00.net]
Qiitaで知ったけどこの構文便利だね。
${VAL+:} false
↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。
今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。
コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。

ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。

700 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 12:41:53.30 ID:emfrr2Lm0.net]
>>699
なんだそりゃ? 相変わらずのQiitaクオリティなのか?

変数が定義されているかの一般的なチェック方法はこれだろ?
[ "${VAR+1}" ]



701 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:04:21.10 ID:jPqivsUqa.net]
定義されてるかどうかってどういう時に用いるんだ
C言語やってた頃は二重インポート防ぐためとかやってたけど同じような感じ?

702 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:31:59.62 ID:I8hvszb00.net]
>>700
「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?

いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して
testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。
君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。

703 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:49:43.89 ID:I8hvszb00.net]
dashでも[はシェル組込だね。実際testユーティリティを外部コマンドに頼ってるシェルって今現在存在しているのだろうか。
Heirloom shellあたりだとありえそう(試してないけど)

704 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 15:54:11.31 ID:emfrr2Lm0.net]
> 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
ぐぐればコレばっかり見つかるはずだが?

> testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
全てのシェルで [ はビルトインだ
シェルに組み込まれていないというものがあれば教えてくれ

705 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 16:18:05.53 ID:emfrr2Lm0.net]
falseコマンドはPOSIXでシェルのビルトインではない
もっともどのシェルでもビルトインになっているが

706 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:26:54.56 ID:I8hvszb00.net]
>>704
> ググればこればっかり
ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。
> 全てのシェルで[はビルトイン
test(1)ユーティリティは,あくまでPOSIXにおいて組込ユーティリティじゃないという話。
根拠はこれ: pubs.opengroup.org/onlinepubs/9699919799/idx/sbi.html
> シェルに組み込まれていないというものがあれば教えてくれ
ご査収ください→https://www.unix.com/man-page/v7/1/sh/#neo-man-page-output

707 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:36:50.26 ID:b7tmfxF40.net]
>>706
falseがビルトインって話じゃなかったの?w

708 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:38:22.47 ID:b7tmfxF40.net]
> ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。

"${VAR+:}"で検索したけど5件しかなかったよ?

"${VAR+x}"だと約 3,410,000 件

709 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:41:59.00 ID:I8hvszb00.net]
ちなみに「すべてのシェル」と言うくらいなのだから,
主要でありPOSIX互換を謳うGNU Bash, Zsh, Debian Almquist shell(dash), yash, MirOS ksh(mksh)くらいについては知らべてるとは思うものの,
POSIXの記述を知らないようなので,
一応,これら5つのシェルがtest(1)ユーティリティを組込コマンドにしているという根拠を以下に挙げておこう。
GNU Bash: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
Zsh: zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands
dash: man7.org/linux/man-pages/man1/dash.1.html
yash: https://yash.osdn.jp/doc/ja/#alpha-order
mksh: https://www.mirbsd.org/htman/i386/man1/mksh.htm

710 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:44:33.96 ID:I8hvszb00.net]
>>707
以下>>704の書き込みを引用
> > testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
> 全てのシェルで [ はビルトインだ
> シェルに組み込まれていないというものがあれば教えてくれ

ということでfalse(1)ユーティリティの話ではなく
test(1)ユーティリティがシェル組込みかどうかという話でした。



711 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:47:23.27 ID:I8hvszb00.net]
ちなみにfalse(1)ユーティリティもPOSIXにおいてシェル組込みとして定められている訳ではない。

712 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:49:01.92 ID:362BcdsM0.net]
となると処理速度的にはどっちが良いの?

713 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:50:38.66 ID:b7tmfxF40.net]
いや、俺が言ったことを復唱されてもこまるんだがw

ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ
builtinやtypeがないシェルもあるからね

714 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:51:02.76 ID:b7tmfxF40.net]
>>712
大差なし

715 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 18:05:17.83 ID:I8hvszb00.net]
>>712
大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして
そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので
速度は${VAR+:}のほうが上。

716 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 18:06:48.53 ID:I8hvszb00.net]
>>713
typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。
つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。

717 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 19:13:13.38 ID:b7tmfxF40.net]
へー、poshはPOSIX互換じゃなかったのか

>Debian Policy に準拠した普通のシェル
>posh は、pdksh の軽装版であり、Debian ポリシーの準拠を目指し、 いくつかの特別な機能を付け加えたものです。
>
>警告: Debian の /bin/sh スクリプトの多くは、実際はポリシーに準拠していると は限りませんので、
>posh を /bin/sh として使うと破損箇所が判明するかもしれま せん。

って書いてある割に大したことないな

718 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:44:49.31 ID:I8hvszb00.net]
まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw
poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。
実際,俺は使っていないものの,同級生にはfishを勧めてる。

719 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:55:10.29 ID:32uSmIhta.net]
ポジクッス警察がいるから多少はね?

720 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:57:06.31 ID:b7tmfxF40.net]
それじゃ俺も言っておかなきゃいかんのか?

まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくなくて
POSIXに準拠していなくても、現実にPOSIX互換の標準シェルとして
デフォルトシェルで採用されているのであればそれに対応すべきだと思っている

だから、dash、(busybox)ash、bash、ksh あたりは対応必須で
zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは
デフォルトシェルとして採用されている事例があるのかわからんが



721 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:58:50.94 ID:b7tmfxF40.net]
俺は現実主義なんでね。標準とか仕様がどうこうよりも
現実としてそれは選択肢にならないのであれば、選択肢にならないし
非標準でも選択肢としてなり得るのならそれを使う

722 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 23:48:23.42 ID:u7Q7GReoM.net]
ポジコレ棒で葬ってやんよ

723 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 07:40:30.00 ID:rsPEFWOD0.net]
もっと面白い書き込みして、どうぞ。

724 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:05:00.87 ID:Yow09MRJ0.net]
>>715
その前提条件で言えば false も組み込みじゃないかもしれないのだから同じじゃないの?
変数が定義されていれば false は実行されないけど、未定義かどうかを確認したいから
実行するわけで。
ただ、fork and exec に関して言えば test コマンドが 1.1ms, false コマンド は 0.8ms 程度
(コマンドバイナリのテキストセクションがメモリキャッシュされている場合で、実行環境は
Intel Xeon E3-1220 3.1GHz/Linux kernel 4.15.0/glibc 2.27)。何千回も実行する様なケース
なら違いが分かるかも。

725 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:16:11.88 ID:wMoGqmE60.net]
POSIXでビルトインの方が速いって決まってるんだっけ?

726 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:29:43.54 ID:nRWf72Y30.net]
>>725
外部コマンドはforkが発生するから結果的にビルトインの方が速い

727 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:32:22.92 ID:wMoGqmE60.net]
いやPOSIXでどうなっているかの話だよ

728 名前:デフォルトの名無しさん [2018/11/25(日) 13:54:00.21 ID:eaHucPl10.net]
なんやこのバカwwww

729 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 14:01:17.29 ID:nRWf72Y30.net]
>>727
下のページをざっと見る限り規定されてないように思う
オーバヘッドがある分遅いのは自明だからPOSIXが云々は関係ない話だとは思う

pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

730 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 18:36:53.00 ID:74eaLfxV0.net]
多分,なんでもPOSIX POSIXと言うので,からかってやろうとしたんだろう。
「お前の主張は全部POSIXに起源があるのか?」ってな。
まあ結果としてはネタにマジレスの嵐だった訳だがw



731 名前:デフォルトの名無しさん [2018/11/26(月) 12:25:16.95 ID:RdZe26lCr.net]
必死すぎる言い訳のせいで逆にひかれてしまったパターンw

732 名前:デフォルトの名無しさん [2018/11/26(月) 12:32:05.28 ID:mqDjQZG/M.net]
とっても惹かれます

733 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 12:44:40.04 ID:sgq1LDCF0.net]
スプラッターやめろ

734 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 17:46:57.26 ID:M+tccdiG0.net]
echoでログを残そうとしています。
echo "メッセージ" > ログファイル

で、ログファイルはNASに保存しようと考えているのですが
NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに
cshだと、echoのとこで止まってしまいます。
止まらないようにする方法とかないですか?

735 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 20:45:32.63 ID:dIk0IZ2NM.net]
>>734
その「何らかの原因」を解決するのが先決じゃねーの?
素知らぬ顔でログ残ってないならそこで止まってもらった方が良くね?

736 名前:デフォルトの名無しさん [2018/11/27(火) 00:51:26.43 ID:IxTjeZ9T0.net]
>>734
NFSならマウントオプションである程度はなんとかなるのでは?
Windowsの共有(cifs)の場合は知らない。しかし何かオプションあると思うけどね。

737 名前:デフォルトの名無しさん mailto:sage [2018/11/27(火) 02:59:30.28 ID:vfcz+SK40.net]
なぜかアホの子ってnfsをローカルファイルシステムと同様に信用しちゃうよね

738 名前:デフォルトの名無しさん mailto:sage [2018/11/27(火) 07:15:38.13 ID:EYppSGpIM.net]
唐突にお前の仲間の話しされても困る

739 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 08:43:07.23 ID:lgqPOMnJr.net]
>>737
信用ってのは常につながると思っちゃうってこと?
それはいかんね

740 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 09:03:44.81 ID:6Gc6vrWs0.net]
NFS特有のエラーがあるとは思いもしなかったりするんだよな。
挙げ句の果てにファイルロックがうまく動かないとか言い出す。



741 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 12:41:41.17 ID:V/2Czdkr0.net]
所詮、ネットワークを介したファイル共有だからね
ディスクはアクセスできない = 故障 と考えていいけど
ネットワークは一時的な切断やエラー、大きな遅延が想定される
だからリトライやタイムアウトといった処理を行う

通常のディスクアクセスを行うコードは、こういった
ネットワーク特有の事象について考慮されてない場合が多い

だから(NFSの設定により)ネットワーク通信が正常に完了
できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態)
もしくは一時的な接続不良でエラー終了したりする

742 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:10:37.32 ID:N04UITTm0.net]
シェルスクリプトの関数の名前の直後の括弧って あれはshに
「これは関数の名前ですよ」って教えるためのものっていう認識でOK?
foo() {
echo foo
}
↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと
初心者ながら思ったんだけど そういう訳でもなさそうだし。

743 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:12:50.29 ID:aLWNsKMba.net]
えっ

744 名前:デフォルトの名無しさん [2018/11/28(水) 20:22:26.38 ID:wHjpMIAFa.net]
引数は $1, $2 とかで受け取る。
呼び出す側は普通のコマンド実行のように書く。

745 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:31:09.87 ID:Vqd4vFOqM.net]
>>742
ともかく ( とか、普通使わない文字を挟んでおかないと、
foo {
だとただの引数になっちゃうから。

746 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 13:01:23.15 ID:Msn7clch0.net]
>>745
なるほど。
「(」はサブシェルの開始だと思ってたけど
そうでもないんだね……。
シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw)
対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。

747 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 13:04:56.47 ID:lCOis1qI0.net]
小学生が政治語ってるのを聞いてる気分だ

748 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 14:34:26.85 ID:Msn7clch0.net]
「どうして解散するですか?」

749 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 15:57:37.21 ID:QFUJhwUI0.net]
Python を使えばいいんじゃないかな

750 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 16:07:41.49 ID:lCOis1qI0.net]
Pythonは構文が複雑怪奇すぎる
かっこは関数呼び出しの引数の開始だと思っていたのに
関数を定義するときにも使うらしい

とかいうだろうな



751 名前:デフォルトの名無しさん [2018/11/29(木) 16:11:55.77 ID:qd4rCcG0M.net]
wwwww

752 名前:デフォルトの名無しさん [2018/11/29(木) 19:19:50.88 ID:8tueZiBHa.net]
そしてあらゆる言語が気に入らず、新たな言語がまた一つ作られるのであった。

753 名前:デフォルトの名無しさん [2018/11/29(木) 19:39:24.56 ID:qd4rCcG0M.net]
− 世界には1,400もの競合するプログラミング言語があった −

「1,400だって!? バカげてる! み全ての用途をうまくこなす統一言語の開発が必要だ!」
「そのとおりだわ!」

やがて…

− 世界には1,401もの競合するプログラミング言語があった −

https://imgs.xkcd.com/comics/standards.png

754 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 20:23:55.28 ID:DaeVxseX0.net]
>>753
男女の仲違いでもう2個増えるんだろ?

755 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 20:25:46.41 ID:dRsmoy+za.net]
新しいのを作るんじゃなくて既存のを潰さないとな

756 名前:デフォルトの名無しさん [2018/11/29(木) 20:45:38.03 ID:C+POVdju0.net]
(中二なんかな・・・)

757 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 21:43:22.71 ID:Msn7clch0.net]
中二だろうがなんだろうが良いソフトウェアを作ってくれればそれでいい。

758 名前:デフォルトの名無しさん [2018/11/29(木) 22:17:13.73 ID:C+POVdju0.net]
>>757
そおやってすぐ他人に頼ろうとするからいつまでたってもクズなんやおまえ

759 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 01:40:39.33 ID:ZZJKHSVT0.net]
ワロタ

760 名前:デフォルトの名無しさん [2018/11/30(金) 08:21:31.28 ID:ShAjvwZw0.net]
目的を見失ってるよね
道具であるはずの言語そのものを作り出すってのは
だからって、なんでもアセンブラってわけにもいかないが



761 名前:デフォルトの名無しさん [2018/11/30(金) 09:15:03.33 ID:vx8Iixcxa.net]
タイヤは永遠に発明され続ける。

762 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:32:04.72 ID:n+1J2GMZa.net]
(車輪じゃね?)

763 名前:デフォルトの名無しさん [2018/11/30(金) 09:38:04.79 ID:vx8Iixcxa.net]
あ、そうか。まあどっちでもいいが。

764 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:40:18.92 ID:5+dLrTA80.net]
現代だって刀鍛冶とかいるじゃん

765 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:53:55.88 ID:pEng5xY00.net]
発明、改良と生産は違う

タイヤ、車輪で行われてるのは、発明ではなくて生産
発明こそ行われなくとも、小規模な改良は続いている

刀鍛冶も生産だろう。改良している人がいるのかは知らんが。

様々なデザインの洋服など、改良しているわけじゃないが
新しいものを作るっていうのはなんというべきだろうね
生産なんだが古い、新しいという概念はある。
だけど好みの違いでしか無いので改良とも違う

多くのものは改良されて続けているが、改良するためには
まず生産能力が必要。同じものを作れなければ改良はできないだろう

766 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 10:02:51.33 ID:pEng5xY00.net]
今の言語は最高とまでは言えない。
いつしか高級言語への進化が止まって、
単なる改良しか行われなくなってしまった

高級言語を超える、超高級言語が必要
俺にはそのアイデアがあるが、なにぶん能力がないw
目的は、超高級言語の開発だが、そのためには
まず言語が作れるようにならないといけないだろうな


ちなみに超高級言語のアイデアとは、現在設計書として
自然文で書いてあるものをプログラム言語として
記述可能にしようというもの。今の言語はモジュールやクラス構造までは
プログラム言語で記述できるが、プロジェクト全体の構造までは記述できない

例えば、Railsなどのフレームワークのmodelsやcontrollersといったディレクトリ構造は
プロジェクトで決まっているにもかからわず、ドキュメントで書くしかない。
だからmodelsに置くべきものをcontrollersにおいたり、modelsではやっては
いけないような処理をやることが出来てしまう。コンパイルエラーにも実行時エラーにもならない

767 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 11:38:14.68 ID:n+1J2GMZa.net]
3行で

768 名前:デフォルトの名無しさん [2018/11/30(金) 12:29:51.33 ID:vx8Iixcxa.net]

高級言語が
必要

769 名前:デフォルトの名無しさん [2018/11/30(金) 12:30:21.78 ID:+/lt4tPpr.net]
タイヤと
車輪は
同じもの

770 名前:デフォルトの名無しさん [2018/11/30(金) 12:47:31.33 ID:vx8Iixcxa.net]


止めよう



771 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 13:04:32.40 ID:iEacaeBh0.net]
実は
CASEツール
です

772 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 15:46:57.55 ID:ZZJKHSVT0.net]
それずっと前にKnuthが実践してた文芸作譜と同じじゃね?
そしてアレは超絶面倒な作業。

773 名前: mailto:sage [2018/11/30(金) 23:23:00.81 ID:MkfLpznc0.net]
>>766
>高級言語を超える、超高級言語が必要
ちょっとワクワクしてしまいましたことを、ここに告白いたします

774 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 01:32:04.95 ID:3WCvWAVjM.net]
言語に縛られてるから駄目なんだよ

とか言ってみる

775 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 02:53:09.42 ID:7CoKqMj50.net]
「縛られるのが好き」ってプログラマ、結構多いんですよ

とか言ってみる

776 名前:デフォルトの名無しさん [2018/12/01(土) 07:47:52.11 ID:U3mK8vlPr.net]
下ネタはもっと堂々と言わな逆にいやらしく感じるで

777 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 10:18:14.73 ID:Ly5JuDld0.net]
全部縛ってヤってなんぼだと思うんです。

とか言ってみる。

778 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 10:47:37.07 ID:Km1sjdO20.net]
お前らくだらない話ばっかり盛り上がるな

779 名前:デフォルトの名無しさん [2018/12/01(土) 12:34:48.97 ID:U3mK8vlPr.net]
さほど盛り上がっとらんやろw
人と関われよw

780 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 02:44:47.66 ID:+c90NOTB0.net]
まあ 使える言語は多いほうが手広いわな



781 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 17:31:01.53 ID:OYZHkh2Or.net]
>>776
知ってる一つの言語でなんでもしようとしちゃう
っていう意味かとおもてた

782 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 18:30:06.74 ID:RWr+AACs0.net]
自由に安くやってが最も困る。

783 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 18:22:49.34 ID:VVlGsdy50.net]
find(1)ユーティリティの速度に関しての疑問なんだけど
https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html#lbAO
ここに
「検査 -name を -type の前に置いているのは、すべてのファイルに対して stat(2) システムコールを行う無駄を省くためである。」
とある。これは「find(1)は-nameのほうが-typeより処理速度が速い」ということを言っているよね。
実のところ手元ではfindが優秀すぎるのか知らんが-nameを-typeより前に書いても後に書いても速度に変化はなかった。
が 基本的にはfindで複数の条件を指定するときは-nameを先頭あたりに置いたほうがいいのかな。
findのソースコードを見てないので推測になるが-permや-newerもstat(2)を実行してるぽいので-nameより遅い筈。

784 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 18:56:51.46 ID:bTQB60BC0.net]
statが遅いと言うのも幻想

785 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 19:07:42.58 ID:HBlgjyZNM.net]
最近のファイルシステムはreaddirでタイプが取得できるよ

786 名前:デフォルトの名無しさん [2018/12/06(木) 00:12:43.36 ID:pQ33EIUW0.net]
>>783
linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html#lbAE
-Olevel
1
これはデフォルトの最適化レベルであり、伝統的な動作に当たる。 式を並べ替えるとき、ファイル名にのみ基づいた検査 (たとえば、 -name や -regex) が先に実行されるようにする。

787 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 09:10:09.33 ID:cC0kDT7D0.net]
>>786
へえ!そうなんだ。
ってことはGNU/Linux使ってる限りは順番はどうでもいいんだな
ありがとう。

788 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 15:10:37.27 ID:cC0kDT7D0.net]
引数に一律にコマンドで操作を施したあと、それらをもう一度引数として扱うにはどうすればいいかな
$ a.sh arg1 arg2 arg3
みたいに起動されたとして$1,2,3にはarg1,2,3が入ってる。
これを$(echo $1 | tr '[:lower:]' '[:upper:]')みたいなコマンド置換を使ってARG1,2,3みたいに変形させる。
問題はこの後にa.shの中の別のコマンドに
somecmd "$@"
のような形でARG1,2,3を与えたいってこと。
while [ $# -eq 0 ]とshiftを使う普通のやりかたではループを抜けた後に$@が空になってしまう。
どうにかして引数の構造を維持したいんだけども……。

789 名前:デフォルトの名無しさん [2018/12/06(木) 16:06:47.11 ID:59uVculK0.net]
>>788
eval set -- $(printf ' "$(printf "%%s" "$%d" | tr "[:lower:]" "[:upper:]")"' $(seq $#))

790 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 16:38:57.36 ID:cC0kDT7D0.net]
>>789
ありがとう。



791 名前:デフォルトの名無しさん mailto:sage [2018/12/12(水) 21:07:46.42 ID:7+bnD1C/0.net]
ここかどうかわからんのだけど、メールの添付ファイルのテキストCSV部分を切り出してDB格納しようと思ったら、
シェルスクリプトでヘッダから切り出すしかない?

792 名前:デフォルトの名無しさん mailto:sage [2018/12/12(水) 21:36:28.16 ID:xr4it+i10.net]
そういう専用ツールがないんだったらそうだろうな

793 名前:デフォルトの名無しさん mailto:sage [2018/12/13(木) 19:34:10.52 ID:Nc8J2Ufn0.net]
>>550
別件でググっていたら、言及しているドキュメント見つけた
${1+"$@"} で動かないシェルもあるようだ

web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html

> 最も有名なシェルの移植性の問題の一つは,`"$@"'との関連です.位置に 依存する引数が無いとき,
> POSIXでは`"$@"'を何もないことと 等価になっていますが,オリジナルのUnixバージョン7の
> Bourneシェルはその代 わりに`""'として扱い,この動作はDigital Unix 5.0のようにそれ以降の 実装でも提供されています.
>
> この移植性の問題を回避する伝統的な方法は,`${1+"$@"}'を使用する ことです.
> 残念ながら,この手法はMac OS Xでも使用されている,Zsh (3.x と 4.x)では動作しません.
> Bourneシェルをエミュレートしているとき,Zshは `${1+"$@"}'で単語の分離を実行します.

794 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 07:48:44.86 ID:AoQUSXZn0.net]
Bashってシングルクォートの内部でない限りバックスラッシュでシングルクオートを直接エスケープできるんだな。
マニュアルにも書いてないけど他人のスクリプト見て発見した。
$ squo=\'
$ echo $squo
'
↑こうできる。Bashは楽でいいなぁ

795 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 09:07:44.57 ID:rkLF3tWt0.net]
>>794
水を差すようで悪いがposixで規定されているから他のシェルでも同じになる

796 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 09:55:51.26 ID:0jv0YmXXa.net]
なぜそれを特別に思ったのかわからんけど他は出来なかったりするの?

797 名前:デフォルトの名無しさん [2018/12/17(月) 19:35:33.43 ID:41bJ0tdVa.net]
\ はエスケープだし使う事はあるので特に目新しい感じはしない。

sambaでファイルサーバ作ってWindowsからもファイルが書かれるような状況だとファイル名にスペースだの括弧だの普通に入れられてLinuxでログインしている端末からだとエスケープせざるを得なかったりする。
俺の場合はそれで一文字だけエスケープはよく使う。

798 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 21:17:48.10 ID:lO+98ZHR0.net]
Linuxで普通にファイル名にスペース入れられるんだから
sambaとかwindowsは全く関係ないけどね

799 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 23:45:58.91 ID:LS1nUj7m0.net]
CUI使いとGUI使いの違いだな
CUIでわざわざくそめんどくさいスペースなんぞを好き好んでは使わない。GUIではふつーにわかりやすくもなるから使う、普通に入れるのはあたりまえ

800 名前:デフォルトの名無しさん [2018/12/17(月) 23:52:42.27 ID:oCmK2PVR0.net]
めんどくさくないけど?エアプなんキミ?



801 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 23:54:51.53 ID:faSovs330.net]
有志のコードに
ファイル名が空白入りだと事故るものがあったような?

自分は
安全とって全部アンダーバー変換しておく

802 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 00:10:28.35 ID:DLVg/wUV0.net]
>>800
めんどくさいめんどくさくないはまあ人次第だけどな
CUIでなんやかんやキーボード打ってる時に、エスケープしたり"や'囲ったり、そもそもスペースはもろもろコマンドでデリミッターだったりで、めんどくさいと思うけどな
人次第ではあるが、そゆのが想像できなずにエアプと言えるのがエアプっぽいと思わなくもない

803 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 01:24:02.71 ID:2j/3pVMu0.net]
>>801
有志って言ってもタダの素人だっただけの話じゃん

804 名前:デフォルトの名無しさん [2018/12/18(火) 03:02:35.05 ID:HuP+yDtL0.net]
>>798
もちろんファイル名には / 以外は何でもありだが Linux だけ使ってると普通はあまりそういうファイル作らないじゃない。一々エスケープしなきゃならないしシェルスクリプトで扱いづらいし。
まあ趣味の問題ではあるけどな。

805 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 03:52:25.12 ID:aYYQx5Ta0.net]
libreofficeから「報告書 2018-12-18」という名前で保存することの何が面倒なのか?

806 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 05:00:11.76 ID:CtnsxEVc0.net]
うわあ

807 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 05:48:13.89 ID:aYYQx5Ta0.net]
ファイル名にスペースが使えるOSが悪いんだって言いたいのかな?w

808 名前:デフォルトの名無しさん [2018/12/18(火) 06:17:30.36 ID:mQMHvFDr0.net]
>>802
アルファベットや数字打つのとなんら変わらんけど?
そもそもシェルには補完ゆうもんがあるんやでエアプさんw

809 名前:デフォルトの名無しさん [2018/12/18(火) 09:37:03.21 ID:92SsvGE7a.net]
>>805
ああ。WindowsみたいにGUIメインで使ってるの?それだけだったら面倒じゃないかもね。

810 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 10:24:35.01 ID:H+ovSSRq0.net]
>>808
なにをいいたいのかイミフすぎだな、プロフェッショナルwすぎて
補完時にもバックスラッシュ打たなきゃならんだろ?打たなくていい環境なの?そういう環境もあるんだよ
なんかただ馬鹿にしたいだけのお人か?しょうもない



811 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 12:13:46.40 ID:bhmdNwABa.net]
なんで自分以外みんな非効率って思ってるのここの人たち
最強は俺だから落ち着けよ

812 名前:デフォルトの名無しさん [2018/12/18(火) 12:15:53.17 ID:92SsvGE7a.net]
Tabキー押すと自動で保管したり変換したりしてくれる場合は楽かも。
楽ってだけで見た目エスケープだらけの見辛い状態にはなるが。

813 名前:デフォルトの名無しさん [2018/12/18(火) 12:25:17.53 ID:Lulkb9OFr.net]
>>810
はいはいエアプさんはそろそろお昼寝の時間でちゅよ〜w

814 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 15:34:29.41 ID:kLOm0zeN0.net]
アホすぎなレスで笑うww

815 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 15:42:44.01 ID:DOEC5j1K0.net]
こいつらプログラム言語はシェルスクリプトしか使ったこと無いんか?
シェルスクリプトは珍しく引数の文字列をクォート(もしくはダブルクォート)で
くくるのが必須じゃない言語だが他の言語は殆どクォートでくくるんだぞ

"foobar" も "foo bar" も入力のしやすさに大差ないだろ
エスケープが必要なのは \ 等であってスペースはエスケープ不要なごく普通の文字なんだが
いつものことだが(シェルスクリプト以外の)経験の差を感じるよな

816 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:01:13.36 ID:kLOm0zeN0.net]
何をお怒りか存じませんが、括らなくてもいいから括らないのが普通になるんでございますよ。当然括るのが必須なら括るのが普通。シェルスクリプトでもスクリプトファイル書くときは変数展開では普通に括るし
コマンド叩くときにはいつも括ってるの??

817 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:03:24.94 ID:kLOm0zeN0.net]
>スクリプトファイル書くときは
ああ、ワンライナーなんぞでもだな。ここんとこ間違い/不要

818 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:21:43.27 ID:DOEC5j1K0.net]
>>816
> 何をお怒りか存じませんが、
わかってないのか? スペースが含まれてるファイル名に対応するのは
プログラマとして当然の話だということだよ

819 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:24:38.45 ID:kLOm0zeN0.net]
>>818
別にそれは普通だな。>>816でそう書いているんだけど?
そんな話じゃないぞ。自分の範疇でが主な話だよ?俺はな

820 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:28:29.69 ID:DOEC5j1K0.net]
>>819
わかってないのに、途中から割り込んでくるなよ
最初からLinuxでもファイル名にスペースを入れるのは普通だって言ってるだろ
sambaとかwindowsは全く関係ない



821 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:33:56.90 ID:kLOm0zeN0.net]
>>820
>>815 で具体的に誰かになんて言ってないやん
ああ、それに対しても>>799だっただけどなあw また、>>818と同じ意味で>>797に対しても
わかんねえかなあw経験を生かしてご理解ください

822 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:56:33.71 ID:DOEC5j1K0.net]
アホすぎなレスで笑うww

823 名前:デフォルトの名無しさん [2018/12/18(火) 17:14:23.03 ID:92SsvGE7a.net]
WindowsだとC言語とかでパスの区切りが \ になってて毎回 \\ と入れなきゃいけないのも面倒だな。
実は / でも大丈夫だったりはするが。

824 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:18:15.10 ID:1JLRyxNd0.net]
今はパスにスペース入れるのも普通だし、対応もできるけど
トラブルのもとは根絶したいから、自分は使わない、それだけ

825 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:24:06.70 ID:kLOm0zeN0.net]
>>822
ww ざんねんなこって。いろいろとw

826 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:31:06.24 ID:1JLRyxNd0.net]
パスをコマンドの引数にする必要がある場合、
例えば、hogecommand --foo_option="filepath=[パス],otheroption=bar" なんていうのがある時、
パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
シングルクォートが使えるシェルならいいが、Windowsのように使えないものもあるから、
バックスラッシュなどでエスケープしたり、コマンドが以下の様な別の区切り文字を用意していたりする。
--foo_option=[filepath="/path/with space/",otheroption=bar]

対処方法がなかなか見つからないこともあり、面倒くさいので、
自分からすすんでスペースを入れようとは思わない。

827 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:46:09.05 ID:DOEC5j1K0.net]
× パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
○ コマンドの引数の形式を適当に決めると、パースするときに一工夫がいるようになってしまう。

828 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:50:36.86 ID:DOEC5j1K0.net]
ちなみに気づいていないようだから言うと
>>826はパスにスペースが入っていると困る問題ではない

hogecommand --foo_option="filepath=/path/with space/,otheroption=bar"

,でsplitして、○○=を消せばいいだけだから何も困らない
この例で困るのは、パスにカンマが含まれている場合であって
スペースではない

829 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:16:22.51 ID:1JLRyxNd0.net]
>>828
ああ、わるい、オプションの階層が一段階足らなかった。

hogeコマンドが、別のライブラリ(foo)のオプションを呼ぶような場合に、

hogecommand --hoge_option=foo_option="filepath=[パス],otheroption=bar"
hogecommand --hoge_option "--foo_option filepath=[パス],otheroption=bar"

こんなパターンがあって、そのままではやはりパースに一工夫が必要で面倒くさい。
ちなみに、上はmpv、下はyoutube-dlで使われている。

830 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:19:12.99 ID:DOEC5j1K0.net]
別のコマンドを呼び出すなら、別のコマンドにそのまま渡せばよかろう?

hogecommand --foo_option="どんな内容でも"

betsucommand どんな内容でも

はい。おしまい



831 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:24:29.26 ID:n1+CJQ+h0.net]
ちなみにファイル名により柔軟なのはWindowsよりも寧ろLinux(というかUnix系)だぞ。
Windowsは「con」とか「aux」とかも駄目だしバックスラッシュやコロンが含まれても駄目。
Unix系のOSは「\0(空文字)」と「/(スラッシュ)」だけが不適合で,あとは全ての文字をファイル名として
使用できる。

832 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:35:11.65 ID:/rMHixhE0.net]
開業コードもつかえるのはまれにネタになる

833 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:33:16.76 ID:2j/3pVMu0.net]
>>810
今時はWindowsのコマンドプロンプトだって必要に応じてエスケープしてくれるぞ?

834 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:34:34.10 ID:2j/3pVMu0.net]
>>831
\0も使えたと思うが...
消せなくなったりするけどさ

835 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:57:59.19 ID:uKKjGArEH.net]
>>834
消す前に作れねーだろ

836 名前:デフォルトの名無しさん [2018/12/18(火) 22:59:29.33 ID:mQMHvFDr0.net]
消せるわこのエアプw

837 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 23:44:21.87 ID:n1+CJQ+h0.net]
名前に\0を含むファイルは作れないと思うけど。
少なくともPOSIXでは禁止されているし,pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_170
ext4でも作成できない。

……「エアプ」はどっちだろう。

838 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 23:56:48.31 ID:DOEC5j1K0.net]
正直ファイル名に\0が使えようが使えまいが
シェルスクリプトで\0が扱えないのでどうでもいい

839 名前:デフォルトの名無しさん [2018/12/19(水) 04:45:08.43 ID:gf1Tua9E0.net]
エアプってなんなん?

840 名前:デフォルトの名無しさん mailto:sage [2018/12/19(水) 07:27:20.06 ID:+7lasSiAM.net]
¥x00



841 名前:デフォルトの名無しさん [2018/12/19(水) 12:42:42.59 ID:guVdMf63r.net]
>>839
おまえらの事やんw

842 名前:デフォルトの名無しさん mailto:sage [2018/12/20(木) 00:17:43.13 ID:6pIAvd2J0.net]
Airぷ

843 名前:デフォルトの名無しさん mailto:sage [2018/12/20(木) 00:39:10.52 ID:0M5ZFUn5M.net]
for i in {0..255}; do touch "./hoge$(printf "\x$(printf "%02x" $i)")foo"; done

844 名前:デフォルトの名無しさん mailto:sage [2018/12/22(土) 13:28:39.38 ID:t1Sp89dZ0.net]
エロ動画サーフィンで広告サイトが開いてしまったら、
デスクトップのシェルスクリプトにドラッグアンドドロップすることで
そのサイトのIPアドレスをHOSTSファイルに追加する

845 名前:デフォルトの名無しさん mailto:sage [2018/12/22(土) 13:59:19.13 ID:aa5NQG9N0.net]
なんていうことをしていたら、hostsファイルの行数が
数千行になってしまった

846 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 08:08:03.20 ID:W0WvAA710.net]
sedだと簡単に動く一文字以上の半角スペースを一文字スペースに置換するコレ
echo "$strings" | sed -E 's/ {1,}/ /g'
bashだとどーしてもうまく動かず次のように[]で囲ってやるとなんとか全連続スペースじゃなく一部
だけが置換できた。
${strings// [ \{1,\}]/ }
それ以上どうしようもなかったので、次のような関数を作った
function Rep2One(){
local str=$1
local chr=$2
while :
do
str="${str//$chr$chr/$chr}"
if [[ ! $str =~ $chr$chr ]]; then
break
fi
done
echo "$str"
}

srings=`Rep2One "$strings" " "`

これで任意の2文字以上の連続を1文字に置換できたが、
sedみたいに一発でかっこよく記述できない?
至る所でbashからsedやgrep起動してたんだが、
bashのなかでできることはbashだけでやった方が大分速いことがわかったんで
なんとかbashの正規表現だけでやりたい

847 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 08:14:34.77 ID:yUjQiXy10.net]
なんでそんなに正規表現に拘るのかわからん

#!/bin/sh
while IFS= read -r line; do
echo $line
done

 

848 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 12:09:04.04 ID:W0WvAA710.net]
>>847
おお、早速
thx
単に知らなかっただけです。
任意文字の繰り返しを1文字に置換したいときはどーするんですか?

849 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 12:13:13.41 ID:W0WvAA710.net]
結局、bashの正規表現は2文字以上全置換を記述できないんですかね?
bashの正規表現でわからないことがいろいろあるんですよ。
文頭置換したいとき'^'に相当するのはどう書くかとか?

850 名前:デフォルトの名無しさん [2018/12/23(日) 13:58:44.05 ID:nNQ759QC0.net]
ま、とりあえずこれでも見ろ。

bashの変数内文字列置換まとめ
https://qiita.com/aosho235/items/c36568830a8d47288284



851 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 14:09:56.35 ID:yUjQiXy10.net]
>>848
IFSで指定しろ

852 名前:デフォルトの名無しさん [2018/12/23(日) 14:18:28.55 ID:nNQ759QC0.net]
でもってこれ。bash のパス名展開。

https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBG

この中に +(pattern-list) というのがある。
なので例えばこんなことも出来る。

a="a b c d" # ← 複数のスペースを適当に入れた文字列を a にセット
b="${a//+( )/ }" # ← 全ての1文字以上のスペースを1文字のスペースに変換して b にセット

853 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 15:08:28.31 ID:eEMSqKaq0.net]
>>848
ちょっと目的と違うかもしれんが
trコマンドの-sオプションもお勧めだよ。
POSIXで定められているので汎用性高いし、あとawkやsedを使う方法より若干高速

854 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 15:10:20.98 ID:yUjQiXy10.net]
外部コマンドを呼び出している以上
遅くなることに変わりはない

855 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:10:20.07 ID:eEMSqKaq0.net]
「awkやsedを使う方法より」

856 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:20:58.12 ID:yUjQiXy10.net]
「awkやsedを使う方法より若干高速
と言ったって外部コマンドを呼び出している以上
遅くなることに変わりはない」

857 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:57:53.53 ID:snCJQSVKM.net]
awkやsedより遅いの?違うでしょ?日本語勉強しなよ。

858 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:02:15.89 ID:yUjQiXy10.net]
bashだけでやるより遅いって話をしてる所に
awkやsedよりも早いって言うことに意味がないと言ってる

859 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:12:57.88 ID:jos3UrGDa.net]
まーた始まったよ(パリポリ

860 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:15:39.87 ID:YhyQsVDP0.net]
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た



861 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:15:41.10 ID:yUjQiXy10.net]
しーかたないねー(パリポリ

862 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:46:37.96 ID:eD9rxy9Z0.net]
あ?やんのかこら

863 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:47:26.96 ID:GvU/LsqE0.net]
>>857
質問者の意図を汲み取りましょうw

864 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 20:07:54.91 ID:0+7qAFFh0.net]
今時汲み取り式なんて・・・

865 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 20:36:12.95 ID:W0WvAA710.net]
>>852
ほんと感謝します
ようやくすっきりしました。
そのサイトにも行き着いていたのですが、ちゃんと読めていませんでした
ありがとうございました。

>>853
trコマンドは知ってますし、今回も使いました。
今回の処理は結局、全処理c++で書き直したりもしてるんで、
他のツール使えばできるとかの情報は全く必要なく
あくまでもbash単体で処理するにはどうするかということでここで質問しました
bashでの正規表現に関する情報があまりなくて、
20年ほど前に買ったオライリーのbash本にも正規表現の記載が一切なく
bashの正規表現に制限があるならそれを教えてもらうことも目的でここで聞きました。

866 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 09:38:30.84 ID:GigxKnwz0.net]
watchで表示更新時間ごとに変数の加算は出来ませんか?

867 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 11:17:37.79 ID:SKc2oSlY0.net]
無理。自分でwatchを実装しろ

868 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 11:19:29.41 ID:SKc2oSlY0.net]
訂正 自分でシェルスクリプト版watchを実装しろ

869 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 08:42:00.02 ID:btIksil/0.net]
区切り文字を指定して文字列を分割するときに
区切り文字が一種類の場合はcut(1)とかを使うし
区切り文字がBREで表わされるような場合はAWKを使うけど
各フィールド毎に特定の区切り文字があるような時はどうすればいいかな。

今やろうとしていることはISO 8601形式の日付を空白区切りに分解することで
2018-12-30T08:36:50+09:00
↑こういう文字列を
2018 12 30 08 36 50 + 09 00
↑こういう空白区切りに分解したい。
その為には「第1,2,3フィールドはハイフン,第4フィールドは文字T,第5,6,7フィールドはコロンで分割する」
っていう具合の処理を考えないといけない。
正直,sedを使えばいいんだけど,もうちょっとスマートな方法があれば教えてほしい……。
sedだと↓
sed -n -e 's/\([[:digit:]]\{4\}\)-\([[:digit:]]\{2\}\)-\([[:digit:]]\{2\}\)T\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)\([+-]\)\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)/D:\1\2\3\4\5\6\7\8'"'"'\9/1p'
↑こんなことになるw

870 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:20:55.12 ID:Ob5186rT0.net]
>>869
入力形式が確定しているから単純化して
sed 's/[-+:T]/ /g'
とかはどう?



871 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:23:20.84 ID:Ob5186rT0.net]
>>870
書き込んでから気づいたがこれだと+の周りが処理できないな

872 名前:デフォルトの名無しさん [2018/12/30(日) 10:40:37.85 ID:btIksil/0.net]
>>871
そうなんだよね……
もし+に特殊な処理をしないならば
tr '-+:T' ' '
で一発なんだけど、できないんだよ。

873 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:53:56.67 ID:MMB+AHvh0.net]
sed 's/+/ + /;s/[-:T]/ /g'
では??

874 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:01:57.94 ID:/wKH6dhf0.net]
>>869
#!/bin/sh
t="2018-12-30T08:36:50+09:00"
IFS="-T:+"
set -- $t
echo $1 $2 $3 $4 $5 $6 + $7 $8

875 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:08:31.89 ID:MMB+AHvh0.net]
タイムゾーンはマイナスありか

876 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:25:42.74 ID:MMB+AHvh0.net]
sed 's/-/ /;s/-/ /;s/\([+-]\)/ \1 /;s/[:T]/ /g'
なんか泥臭いけど

877 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:28:51.37 ID:/wKH6dhf0.net]
#!/bin/sh
t="2018-12-30T08:36:50+09:00"
IFS="-T:+"
set -- $t
case ${t%?????} in
*+) echo $1 $2 $3 $4 $5 $6 + $7 $8 ;;
*-) echo $1 $2 $3 $4 $5 $6 - $7 $8 ;;
esac

878 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:32:49.36 ID:/wKH6dhf0.net]
date -d "2018-12-30T08:36:50-09:00" "+%Y 略" (飽きた)

879 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:48:16.88 ID:btIksil/0.net]
>>874
それだとアメリカとかのタイムゾーン-03:00に対応できなくね?

880 名前:879 mailto:sage [2018/12/30(日) 11:49:02.96 ID:btIksil/0.net]
>>877
すまん。ちゃんと対応してくれてた。



881 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 16:00:37.71 ID:yEx+bcWd0.net]
GNU grep の場合

$ echo '2018-12-30T08:36:50+09:00' | grep -Po '([0-9]{2,4}|(?<=:[0-9]{2})(\+|-))' | xargs

882 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 16:49:11.50 ID:btIksil/0.net]
>>881
すげー。
でも後から自分でデバッグできなさそうなのでやめておくw

883 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 18:51:33.10 ID:iF2NHAVN0.net]
t="2018-12-30T08:36:50+09:00"
echo "${t:0:4} ${t:5:2} ${t:8:2} ${t:11:2} ${t:14:2} ${t:17:2} ${t:19:1} ${t:20:2} ${t:23:2}"

884 名前:デフォルトの名無しさん mailto:sage [2019/01/01(火) 13:16:40.82 ID:0CXB5czV0.net]
:digit:より0-9のほうが打件数少ないのはなんなんだ

885 名前:デフォルトの名無しさん mailto:sage [2019/01/01(火) 13:57:25.01 ID:WRhsD0vEa.net]
単に意味を優先した表現方法があるだけやろ

886 名前:デフォルトの名無しさん mailto:sage [2019/01/05(土) 11:12:13.83 ID:dE0KuiGH0.net]
本当に一部のシステムでの話だけど
[:digit:]がロケールの数値表現にも合致する場合がある
「1」とか。

887 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 14:59:50.50 ID:01rSRjtda.net]
test.txtの内容が
hoge
fuga
puge

で、
sed -i -e s/hoge\n// test.txt
とやったのに『hoge(改行コード)』が消えてくれないたすけて
test.txtの一行目を削除 → 2行目が一行目に、
みたいにトコロテンしたい

888 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:08:57.37 ID:01rSRjtda.net]
自己解決・・・
sed -i -e ':a;N;$!ba;s/hoge\n//' test.txt
ってやったらできました・・何この呪文。。

889 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:30:19.88 ID:RynyI9pj0.net]
sed -i -e '/hoge/d' test.txt じゃダメなん?

890 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:36:38.32 ID:01rSRjtda.net]
>>889
で、できました
それ使っていきます ありがとうございました



891 名前:デフォルトの名無しさん [2019/01/07(月) 19:03:53.04 ID:fnTlHl64a.net]
grep -v もよろしく

892 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 19:52:44.45 ID:fRqqYmWxa.net]
一行目を消したいのかhogeを消したいのか

893 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 19:54:56.69 ID:52D4hsE60.net]
全部消したい。何もかも

894 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 20:31:04.88 ID:Opohu4pM0.net]
要らない
何も
消してしまおう

895 名前:デフォルトの名無しさん [2019/01/08(火) 09:33:22.38 ID:LJT6VvGba.net]
そんなあなたに rm

896 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 04:57:31.17 ID:yVo/NDAD0.net]
ネットワーク通信(特にhttpクライアント)に関するコマンドって
大きくwgetとcurlとfetchなんかがあるけどもみんなはなに使ってます?
大抵のLinuxにはwgetが、MacとWindowsにはcurlが初期搭載されてるので
そのどっちかだとは思う。

897 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 09:31:04.31 ID:d7ZwxpvN0.net]
スクリプトの場合はオプションが面倒くさくいのは関係ないから
個人的には自由度の高いcurl一択かな

直接コマンド打ってダウンロードするときはaria2cを使ったりする

898 名前:デフォルトの名無しさん [2019/01/10(木) 10:00:22.11 ID:jQehovm3a.net]
昔から使ったていたというだけの理由で wget

899 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 11:40:29.86 ID:DS8wsvUQ0.net]
wgetが入っていればwget、curlが入っていればcurl
両方入っているなら、ファイルにしたいときはwget、出力結果を見たいときはcurl

900 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 16:56:41.32 ID:jhx89QXs0.net]
PowerShell では、Invoke-WebRequest のalias が、curl, wget

get-alias (gal) で表示できる



901 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 18:31:34.76 ID:yVo/NDAD0.net]
>>900
え、それつまり
$ curl ...
としたときのオプションは実はcurlのじゃなくて
Invoke-WebRequestに向けたオプションってこと?
そんなに互換性があるオプション体系だとは思わないのだけど
なぜエイリアスにしてあるんだろう……。

902 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 20:31:11.75 ID:UUY7OixDM.net]
呼ばれたときの名前によって処理を切り替えてるんじゃないの?知らんけど

903 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 22:34:40.34 ID:qJAnpZ0RM.net]
cURL以外使わん

904 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 03:35:07.12 ID:tAdCcMWb0.net]
bashで「=」という文字をコマンドにすることってできますかね。
「=」を「bc -l <<<」に割り当てて
$ = '4 / 5.1'
みたいな簡易電卓として使いたいなと思ったんだけど
alias =='bc -l <<<'やfunction = { bc -l <<< "$1" }はダメ……。
一応GNU Bashの「コマンドに使っていい文字」ではあるんだけど、使えない

905 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 05:36:31.36 ID:YPYEBq870.net]
=というファイル名のシェルスクリプト書いたら?
bashもいらんし

#!/bin/sh
echo "$@" | bc -l

906 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 08:51:55.60 ID:EZ88NWNa0.net]
function = { bc -l <<< "$1"; } ってすればできる(セミコロンが必要)






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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