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

レス数が950を超えています。1000を超えると書き込みができなくなります。
2020/08/21(金) 15:17:55.64ID:mArnj/tT
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

シェルスクリプト総合 その33
https://mevius.5ch.net/test/read.cgi/tech/1584893550/
2020/11/13(金) 13:19:38.00ID:A88QmKc9
>>864
逃げるなよw
具体的なケースが重要

PATH変数とHTTP_PROXY変数だっていいたのだろうが "それだけ" だろう?
しかもシステム設定を変えるわけじゃない。
何度も言うが自分と子プロセスにしか影響がない。
意図せず変更してしまう可能性がどれだけあるのかと
あと環境変数じゃないなら小文字使えや
2020/11/13(金) 13:23:59.15ID:A88QmKc9
>>865
また知ってる単語を使ってみましたみたいな文章だなw
カスケードで読むってなんだよ。誰がそんな用語使ってるんだ?

シェルスクリプトが別なら変数は共有されない
非同期で動かすというなら、それぞれ別のサブシェルになるから
これも変数は共有されない

sourceしたりというなら、グローバル変数のことだろうが
それなら、シェルスクリプトはグローバル変数しかないから
大規模に向かないって言えばいいだけのことだろ?

グローバル変数しかなくてもプリフィックス(を名前空間として考える)を
変数名につければいいだけだがな。それはPOSIXにこだわらないなら
localとかtypesetでローカル変数作れるし
2020/11/13(金) 14:48:01.16ID:4qY0TlDt
>>866
影響のでかたについては説明済み。
http_proxy系環境変数は一般的に小文字。

逃げてるというならそれでいい。
めんどくさいアホの相手はもうおしまい。
2020/11/13(金) 15:20:10.18ID:S1mNTw0c
結局,「自分が思う(無根拠な)あやうさ」
を放言した結果,鉞が四方八方から飛んできて収集付かなくなった感じかね。

元の発言
> シェルスクリプトの欠点の一つとして
> シェル変数を気軽に上書きできるという点がある
> うっかりシステムに関係する変数を書き換えると
> 大騒ぎになるかも
からしてまあシェルスクリプト分かってんのかってツッコみたくなる点が幾つもあるし。
もう散々上で叩いたからこれ以上は責めるのを止すが。
2020/11/13(金) 18:14:52.09ID:4qY0TlDt
それは双方同等。
「自分が思う(無根拠な)大丈夫さ」だから。

ま、一回事故らんと身に染みないことではある。
2020/11/13(金) 18:21:34.11ID:A88QmKc9
>>868
だから影響の出方は
"僅かな"有名な環境変数を書き換えると
自分と子プロセス"だけ"に影響があるって話でしょ?
ずーっとそういってる

大した影響がないと
2020/11/13(金) 18:22:01.01ID:A88QmKc9
>>870
実際に事故ったときの
環境変数の名前は?
2020/11/13(金) 18:27:23.64ID:A88QmKc9
自分の体験談を言えばいいだけだと思うんだがねぇ
たまたま自分のアプリで LD_LIBRARY_PATHという変数を使っていたら
これと同じ環境変数を○○アプリが使っていて困りましたとかさぁ

実際の体験談ね。架空の体験談じゃなくてw
2020/11/13(金) 19:29:50.68ID:du2laNOa
PATHを書き換えて、コマンドサーチパスの優先順位変わって意図しないバージョンのコマンドを実行してしまって、コマンドの互換性に問題あって、大事なファイルを破壊してしまったとか
そういうのはあるんじゃない
2020/11/13(金) 19:55:53.16ID:A88QmKc9
>>874
それはあると思うよ。

だからうっかりシステムに関係する変数を書き換えると大騒ぎになるかもというが
実際には注意が必要なのはPATH変数ぐらいの話だよねという結論に俺はしたいわけw
2020/11/13(金) 21:49:53.46ID:uCeIaRFr
>>869
>四方八方から飛んで
そのレスの前で飛ばしてるのは一人だと思うが
2020/11/14(土) 00:25:29.47ID:ZrW/GOpe
>>870
どっちもどっち論に逃げずにさ,
一つだけでもいいから実例をあげてくれるだけでいいんだよ。
2020/11/14(土) 00:37:43.34ID:3AniUInE
>>877
もうええから。
おのれが事故るまでわかるまい。
2020/11/14(土) 12:11:16.48ID:ZrW/GOpe
ここまで問いつめて一つも実例が出ない……。
あのね,自分の考えを矯正せざるえない正しい情報は耳障りかも知れないけど,
もう一度聞いてくれ。
「環境変数(⊂シェル変数)を外部から書き換えて,システムに損害を及ぼす」
ことは可能だけど,
シェル引数がプロセス間でどう引き継がれるかというのはPOSIXで定められていて,
要すれば「変数の書き換えの影響が及ぶのはその書き換え後にそのプロセスから
遂行したシェル(スクリプト)のみ」っていう決まりなのよ。
で,「変数を書き換えるとシステムに損害を及ぼす」ようなシェルスクリプトっていうのは
「システムを管理するシェルスクリプト」であって,
そんなシェルスクリプトを「遂行する前に」変数を書き換えられるような状態においては,
もはや「環境変数の書き換え」なんていう攻撃℃闥iを取らなくても,
簡単にシステムをぶっ壊せる。
逆に例えばマトモな許可設定がなされてるサーバーに対して,
クライアントが環境変数を書き換えてサーバーのシステムを壊すなんてことはできない。
2020/11/14(土) 12:14:10.37ID:ZrW/GOpe
はぁ〜〜無駄な熱量を使っちまった……
バカは放っておくのが一番なのは理解しているんだが,
初学者がもしもこのバカの発言を間に受けたら
勉強が進んで己の知識を修正するまで
間違った知識で行動する訳で,それは可哀そうなのでね。
881デフォルトの名無しさん
垢版 |
2020/11/14(土) 12:19:51.30ID:WE59Iknb
シェルスクリプトはセキュリティホール
揺るぎない真実に向き合え
2020/11/14(土) 12:30:38.87ID:kdUuCuZx
>>879
攻撃の話はしてないよ
単に環境変数を書き換えることで他のプロセスに影響を与えることはできるけど
そもそもその環境変数なんてわずかしかないんだから
大騒ぎするまでのことはないよねって話してる

それに対して問題がー、問題がーってしつこく言ってるやつが居るから
お前実際にどんな問題が起きたことあるんだ?って聞いてるんだが
その答えは帰ってこないし、帰ってきてもそれだけだよね?程度の話だった

これがここまでの結論
883デフォルトの名無しさん
垢版 |
2020/11/14(土) 12:35:19.46ID:QzputhfI
日本語がぎこちないので ID:ZrW/GOpe は馬鹿確定
2020/11/14(土) 13:34:21.21ID:ZrW/GOpe
知識で勝てなくて悔しいのう
2020/11/14(土) 13:42:24.75ID:5XkrS48F
俺が実際どんな問題があった?って聞いてるんだから
俺の話を横取りするな
2020/11/14(土) 14:45:22.49ID:i/Cc0DGY
自分も具体例を聞きたい
2020/11/14(土) 14:48:05.38ID:DnZAmAgg
ワイもワイも
2020/11/14(土) 15:46:11.26ID:hNMhXONs
セキュリティの問題ではないけど
PWDをシェルスクリプトの中で変数として使うと
システムに勝手に書き変えられて
思ったように動かないかもしれないな
889デフォルトの名無しさん
垢版 |
2020/11/14(土) 21:48:21.52ID:9DKCECFD
責任の遂行
2020/11/14(土) 23:28:38.65ID:ZrW/GOpe
>>888
そうそう,こういう具体例でいいのよ。
ちなみにこの場合,変数$PWDじゃなくて
命令としてpwd(1)を使うとかすれば回避できる。
2020/11/14(土) 23:40:33.62ID:1QU8t+0x
シェルスクリプト以外でPWDを使うことってあるんだろうか?
そもそもPWDはシェル変数ではあるが環境変数なのか?
他の言語でPWDがあることを前提としていいのだろうか?

またシェルスクリプトとかでは起動時に現在のカレントディレクトリに
設定されると思うので影響があるのは自分自身だけだろうな
2020/11/15(日) 09:04:33.27ID:bhsguIlX
ん? 相対名でファイルをオープンするときとかどうなってると?
2020/11/15(日) 11:54:09.26ID:ofPGnU/6
>>892
PWDはただのカレントディレクトリを
変数に入れただけだよ

カレントディレクトリのことではない
cdしたときにシェル変数PWDとOLDPWDに
カレントディレクトリを入れるだけのこと

他の言語ではPWDやOLDPWDは参照しない
環境変数でしかないから
2020/11/15(日) 18:03:22.63ID:h835C+/M
ていうかシェルでもPWDを参照することは少ないでしょう。
「カレントディレクトリ」を指し示したかったらpwdを使うかな。

ちなみに,当然分かっているとは思うけど,
C言語やPythonでも$PWDは参照できる。
ただまぁ,それをやってるプログラムは,$PWDを参照している
シェルスクリプトと同じくらい数少ないと思うけどね。
2020/11/15(日) 18:36:18.33ID:bhsguIlX
なるほど。
カレントディレクトリを知りたいときにPWDを参照したら楽かもねってだけか。
それ以外には影響を及ぼさない。
勝手にPWDに依存するスクリプトやコマンドはあるかもしれんがw
2020/11/15(日) 18:41:31.75ID:ofPGnU/6
え?普通$PWDの方を使うでしょ
pwdにメリットなんてあるの?
デメリットならいくつか言える

外部コマンドなので遅い
ほどんどの場合、結局変数に入れて使う
変数に入れる時に標準出力経由でやるから更に遅い
変数展開が使えないから、/foo/bar/baz からbazだけを取るのが面倒で遅い
(まずありえないけど)改行で終わるディレクトリが正しく取れない(工夫すれば取れるけど)

唯一のメリットはPWDの内容と実際のカレントディレクトリが違う場合が
あることだけど、PWDはシェルスクリプト起動時に初期化されるので
意図的に変更しないとそうはならない。どうしてもPWDを
カレントディレクトリに初期化したいなら cd . でも実行すればいい

> C言語やPythonでも$PWDは参照できる。
それはPWDが環境変数としてエクスポートされてる場合でしょ?
unset PWDしてから起動しても参照できるって保証はあるの?
2020/11/15(日) 18:43:40.53ID:ofPGnU/6
pwdはカレントディレクトリを画面に表示するだけのときにしか使わないな
カレントディレクトリを利用する(変数に入れる)場合は$PWDを使う
898デフォルトの名無しさん
垢版 |
2020/11/15(日) 18:45:36.14ID:QB7zB470
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
> PWD
> Set by the shell and by the cd utility. (...) Assignments to this variable may be ignored.
2020/11/15(日) 18:47:38.69ID:h7nWKXR3
$ mkdir x
$ ln -s x y
$ cd y
$ pwd
/work/tmp/y
$ echo $PWD
/work/tmp/y
$ pwd -P
/work/tmp/x
2020/11/15(日) 18:50:20.68ID:ofPGnU/6
書いておいてなんだけど、改行で終わるディレクトリなんて作ったことないからやってみたw

cd /tmp
mkdir "abc

"

こんな感じで普通に作れるね。移動して(移動するときも cd "abc

" ってやらないとだめw)

echo "[$PWD]" したらちゃんと改行が入ってる

pwdもコマンド打つだけなら改行が入ってるけど
dir=$(pwd) とかすると末尾の改行が消えてdir変数に入る

回避方法は dir=$(pwd; echo _); dir=${dir%_} とすること
末尾の改行が消えないように _ とかを追加しておいて、変数展開を使って消す
2020/11/15(日) 18:53:44.48ID:ofPGnU/6
>>898
> Assignments to this variable **may** be ignored

つまり無視されるかもしれないし、無視されないかもしれないってことね。
事実 PWD にカレントディレクトリと異なる値を入れることはほとんどのシェルで可能
2020/11/15(日) 18:56:56.26ID:ofPGnU/6
>>899
何がいいたいのか知らんけど、
pwd -P の結果をPWDを使わずにほしいという話なら
cd -P を実行すればいいよ

dir=$(pwd -P) ・・・ 外部コマンド(遅い)+コマンド置換(遅い)
で二重に遅くなるけど

cd -P; dir=$PWD なら 内部コマンド(速い)+コマンド置換なし(速い)
カレントディレクトリが移動してしまうという副作用があるけど必要なら戻せばいい
2020/11/15(日) 18:57:41.90ID:ofPGnU/6
訂正

pwd -P の結果をpwdを使わずにほしいという話なら
cd -P を実行すればいいよ
2020/11/15(日) 19:02:15.10ID:h7nWKXR3
bash$ type pwd
pwd is a shell builtin
2020/11/15(日) 19:03:42.80ID:ofPGnU/6
お、pwdはビルトインコマンドだったかw
じゃあそこは訂正

コマンド置換になるから遅い だけだな
これで数千倍ぐらい遅くなる
2020/11/15(日) 19:16:41.84ID:h7nWKXR3
$ dash
$ readonly PWD
$ cd x
dash: 3: cd: PWD: is read only
$ echo $PWD
$ /home/hoge
$ pwd
$ /home/hoge/x
2020/11/15(日) 19:20:48.28ID:ofPGnU/6
>>906
嫌だからそれがどうかしたんか?w
自分の結論を言わんと
ただ必死な姿にしか見えんぞ
2020/11/15(日) 19:23:24.34ID:h7nWKXR3
お遊びに付きあってあげているだけさ。気にするなよw
2020/11/16(月) 02:15:26.25ID:4uoBNdLM
>>905
>お、pwdはビルトインコマンドだったかw

一応/bin/pwdもあるね。
これの場合、子プロセスのディレクトリは親から引き継がれてるからおk,ということかな。
2020/11/16(月) 09:46:48.16ID:VPqCGhU1
>>896
cd .してから$PWDを利用
←これやなシェルスクリプトの親プロセスで
readonly PWDされても問題ないし。
2020/11/16(月) 10:42:21.57ID:ZICsfNV8
> readonly PWDされても問題ないし。

readonly するのは誰?
いや、自分でやっておいて
誰かにreadonly されたー!って叫ぶのかなと(笑)
912デフォルトの名無しさん
垢版 |
2020/11/16(月) 12:53:31.23ID:sF1WJXNT
改行コードってディレクトリ名とかファイル名の禁止文字じゃないのかω
勉強になったわωω
2020/11/16(月) 13:39:21.12ID:IuVgP+7M
findとかxargsとか
改行コードが禁止文字じゃないから
1行1ファイル名にできなくて
仕方なくNULL文字区切りができたんだよな

1行1ファイル名ならそんな機能いらなかったのに
NULL文字区切りって改行対策だけの機能だから
2020/11/16(月) 14:00:41.03ID:Ks5/uhC8
>>912
「¥0」「/」以外の全バイトが有効なんだっけか。
Windowsは締めすぎだが、UNIXは緩すぎ。w
2020/11/16(月) 15:33:23.40ID:VPqCGhU1
>>911
>>906
2020/11/16(月) 15:35:18.75ID:VPqCGhU1
>>913
find使うなら、xargsじゃなくて
-exec使った方がいいと思う。
ファイル区切りとか考える必要がない。
2020/11/16(月) 16:02:01.39ID:UFAKJ9cA
>>914
ちなmacOSではUTF-8として正当かチェックがあった気が....
あとFinder上でならスラッシュも使える。がコロンが使えない。
いえ、macOSはUNIXですw
2020/11/16(月) 16:20:12.32ID:T0PHjpz3
>>916
-execはファイル一個ごとですよね、と一瞬思ったけど、
それが気になる場合は {} + ですか。

しかし {} + って昔からあった?
ネットで見つけた4.3BSDのマニュアルには {} + の記述はないっぽい。
http://www.retro11.de/ouxr/43bsd/usr/man/cat1/find.0.html
2020/11/16(月) 16:53:12.65ID:VPqCGhU1
>>918
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html
ここのRATIONATE節を読むといい。
2020/11/16(月) 17:48:34.34ID:EzTwR9A1
PWD を環境変数にするという発想は無かったな。
しちゃいかんとまでは思わないが意義があるとも思わない。
2020/11/16(月) 20:06:37.21ID:Ks5/uhC8
>>917
それは、ファイルシステムじゃなくて、シェルやろ。
UNIXというよりアポー互換のためだからしゃあない。w
2020/11/16(月) 20:09:53.39ID:Ks5/uhC8
>>920
変数展開とか置換で使いやすいからやろ。
意義ならそれで充分。
2020/11/16(月) 21:47:14.87ID:was5dDeL
>>922
変数展開とかするならシェル変数で十分じゃん
環境変数にする必要がない
2020/11/16(月) 21:47:38.57ID:VPqCGhU1
readコマンドと同じようなことを,変数を新たに生成することなく実現する方法ないかな。
当然,入力結果は変数に格納せずに,そのまま標準出力に返す。
(←べつにこの仕様じゃなきゃいけない訳じゃないけど,変数なしだとこれくらいしかないかな?)

例えば引数を付けないcatだと近い挙動を実現できるけど,
入力を終了する時に<Enter>じゃなくて<C-D>を入力しないといけないので,
利用者側の操作が違ってきちゃう。
↑このあたり,sttyとかで設定できないかな〜と思いつつも,
stty eof ^Jとかしても無理なんで詰まっている。
2020/11/16(月) 21:56:03.84ID:was5dDeL
変数を新たに生成しないなら、決め打ちのグローバル変数を使ったら?
それも嫌ならPS1とかPS2を使うとかw
どうせシェルスクリプトの中では使わないだろうし
2020/11/16(月) 22:19:15.08ID:was5dDeL
お、思いついたw

read workとやってwork変数を使う

だけどそうすると上書きされちゃうから
set -- "$work"として$1にバックアップしておく
そいでecho "$work"してから$1を$workに戻す

ただしwork変数はread前に定義されてない可能性があるから
そこは変数が定義されてるかどうかで処理を分ける(めんどくさいから任せたw)

これで一時的には変数を使うけど使うけど最終的に副作用はない
2020/11/16(月) 22:20:25.71ID:was5dDeL
この方法を使えばreadの結果を$1とかに入れることもできそうw
2020/11/16(月) 23:22:53.16ID:9mrX0/C/
>>924
単にサブシェルにするのでは駄目?
( read a; echo "$a" ) みたいに
2020/11/16(月) 23:44:35.69ID:VPqCGhU1
>>926
sttyとか使ってなるべく代入を減らそうとしてたんだけど,
この方法でも「変数を節約する(使わない)」という目的は
普通に達成できるな。
ありがとう。
2020/11/17(火) 09:06:13.86ID:iIrFjUs6
Macは昔は:がフォルダの区切り文字だったんだよな
ファイルのリソース情報が本体ファイルと別になってて2個1だった
2020/11/17(火) 10:59:29.50ID:BpUAWx5v
>>921
macOSのファイルシステムはユニコードで規定されているのでそういうチェックも
あるというか。
ま、ある意味文字列の中身を厳密に規定しないできた流れのFSと、
ユニコードの普及を推進していた(る)会社が作ったFSの違いかな?
2020/11/17(火) 16:59:32.69ID:RPD3bx3d
ちなみにWindows 10ではクソみたいな方法で,*一見すると*コロンや不等号を
ファイルに名付けられるような仕様になっている。

https://youtu.be/vE8jL9Fz9h0

誰得なのこの機能?
2020/11/17(火) 17:09:47.51ID:nHdTOcnh
>>932
誰得もなにも動画のとおりだろ

NTFSではPOSIX対応が必要だったため、本来はコロンとかを
ファイル名に入れられるんだがWindowsでは互換性のために禁止されてる

しかしWSLの登場でコロンや不等号のファイル名に対応する必要が出てきた
誰得ってのはこのWSLユーザーに決まってる
NTFSではこれらの文字を使おうと思えば使えるのだが、それだと相互運用で問題が出る

だからWSLでコロン等をファイル名に使ったら、Unicodeの特殊な文字に名前を変更して記録している
そしてこの仕様はもともとCygwinで考え出されたものだ

WindowsでLinux的に使おうとすれば、どうしてもそういう文字に対応する必要があるので
Cygwinで考え出された仕組みをWSLでそのまま取り入れてるだけ
2020/11/17(火) 17:55:26.97ID:WUYxAqUP
>>933
勉強になった。
よっ、生き字引!
2020/11/17(火) 18:03:09.09ID:nHdTOcnh
普通にcygwinで:というファイル名を作ったら
Windowsからはどう見えるんだ?って調べればわかることだな
もう何年も前の話だよ
俺にとってはWSLでも同じでワロタ状態
2020/11/17(火) 18:05:47.61ID:nHdTOcnh
あとwslpathコマンドも、昔からCygwinにcygpathというコマンドがあるのを知っていれば
同じような仕組みにしたのねって思うはず
MS独自の仕組みじゃなくて既存の仕組みを流用する当たり
今のMSがオープン的な考えになってることがよく分かる
937デフォルトの名無しさん
垢版 |
2020/11/17(火) 18:34:05.16ID:J3+TnR7G
全角文字使えは解決するのにな
2020/11/17(火) 18:44:18.62ID:8pwQehN5
全角と半角を同一視したらダメだろ
だから通常使われてない文字にわざわざしてるんだが
939デフォルトの名無しさん
垢版 |
2020/11/17(火) 19:02:58.91ID:J3+TnR7G
ファイル履歴「せやな…」
2020/11/17(火) 20:36:01.00ID:RPD3bx3d
wslpathがcygpathと同じ仕組みなのってなんで分かったん?
いや,つっかかる訳じゃなくて,
wslpathってソース公開されてないからさ。
941デフォルトの名無しさん
垢版 |
2020/11/17(火) 20:46:02.57ID:/MJ+K6rY
a.txt
a x Nov 17 2020 aaa
b x Nov 18 2020 bbb
c z Nov 19 2020 ccc

cat a.txt | awk -v hy="-" '{if("$2"=="x"){"date -d "$3hy$4hy$5" ¥"+%Y-%M-%D¥" | getline var ; print $1","var","$6}}'

これ実行するとvarの内容がたまに前の行の値のままになったりするんだけど
|が悪いの?


結局 while IFS=' ' read 〜に変えたらやりたいことはできたけと何故上手くいかなかったのか分からなくて
2020/11/17(火) 21:02:17.75ID:8pwQehN5
>>940
コロンとかのファイル名の話な(これはwslpathやcygpathとは関係ない)

cygwin「cygwin環境でHOME以下に作ったファイルはC:\cygwin64\home以下に作るで」
cygwin「 cygwin環境で : とか * という名前のファイル作れるで」

10年前の俺「え?なんで?エクスプローラーから見たら文字化けしとるやんけwww なんだこりゃ」
数分後 → 「ふーん」

WSL「/mnt/c/Users以下に作ったファイルはC:\Users以下に作るで」
WSL「WSL環境で : とか * という名前のファイル作れるで」

俺「エクスプローラーから見たら文字化けしとるやんけwww 既視感ぱねぇwww」
数分後 → 「同じじゃねーかwww」


wslpathは別にcygpath使ってればコマンド名とかオプションとか真似してるってわかるだろ?
WSL(Linux)にパスを変換するときのオプションが何故か-uな所とか
(cygwinでは-uの長いオプション名は--unix)
2020/11/17(火) 21:04:26.43ID:8pwQehN5
まあもしかしたらcygwinよりも前にSFU(の前身)とかがやってたのかもしれんけどさ
2020/11/17(火) 21:32:09.28ID:yKNV/xx9
>>940
「仕組み」は、具体的な実装のことではなく、全体的なやりかたのことやろ。
2020/11/17(火) 22:11:55.77ID:8pwQehN5
> 俺「エクスプローラーから見たら文字化けしとるやんけwww 既視感ぱねぇwww」
> 数分後 → 「同じじゃねーかwww」

この同じじゃねーかwwwっていうのは : などのWindowsでは使えない文字のマッピング先の文字コードの話ね
そういや文字コードが同じであることは確かめたけど、実際にcygwinで作ったファイルをWSLで見たことなかったわ
んで、今やってみたけど、当然なんだけど、cygwinで作った : というファイルはWSLでちゃんと : になってたw
cygwin(たぶんmsysも同じ)との相互運用も考えてこうしたんだろうな
2020/11/18(水) 14:43:02.92ID:oGkGNlvA
>>941
>"date
" がいらない

>\"+%Y-%M-%D\"
2つの\ がいらない

これを実行しても、何も表示されないけど。
なんで?
947946
垢版 |
2020/11/18(水) 14:47:49.14ID:oGkGNlvA
>>941
>\"+%Y-%M-%D\"

ひょっとして、この\ は、キーボードのバックスラッシュじゃないのかも?
ちゃんとキーボードで、入力してみれば?
948946
垢版 |
2020/11/18(水) 14:58:29.15ID:oGkGNlvA
>>941
Ruby で、CSV なら、

require 'csv'

CSV.foreach( "a.csv", col_sep: " " ) do |row| # 1行ずつ処理する
p row[ 1 ]
end

出力
"x"
"x"
"z"
949デフォルトの名無しさん
垢版 |
2020/11/18(水) 15:28:33.58ID:XsHXPiSN
>>946
>>947
すまんスマホで打ったので間違ってた

cat a.txt | awk -v hy="-" '{if($2=="x"){"date -d "$3hy$4hy$5" +%Y-%m-%d" | getline var ; print $1","var","$6}}'


+%Y-%m-%dは¥(バックスラッシュ)"で囲まなくてもOKだった
出力が3行以上あると>>941の現象になる気がする
950946
垢版 |
2020/11/18(水) 15:35:10.65ID:oGkGNlvA
>>949
なら、下のように出力された

a,2020-11-17,aaa
b,2020-11-18,bbb
951デフォルトの名無しさん
垢版 |
2020/11/18(水) 15:59:00.88ID:XsHXPiSN
>>950
出力される行数10行くらいに増やした場合は?(もちろん全て日付変えて)
952946
垢版 |
2020/11/18(水) 16:43:39.93ID:oGkGNlvA
正しく出力される。
実際には、c, d, f などは出力されていないけど

a,2020-11-17,aaa
b,2020-11-18,bbb
c
d
e,2020-11-21,eee
f
g,2020-11-23,ggg
h,2020-11-24,hhh
i
j,2020-11-26,jjj
k,2020-11-27,kkk
l,2020-11-28,lll
m
n
o,2020-12-01,ooo
p,2020-12-02,ppp
q,2020-12-03,qqq
r
s,2020-12-05,sss
t,2020-12-06,ttt
u
953デフォルトの名無しさん
垢版 |
2020/11/18(水) 17:46:13.72ID:XsHXPiSN
>>952
ありがとう

何故だろう
2020/11/18(水) 22:39:32.53ID:c4VI5UKm
フィールド数が想定がところがあるとエラーで getline が呼ばれなくて
var がそのままになったりするのかも?
2020/11/18(水) 22:40:20.82ID:c4VI5UKm
想定が -> 想定外な
956デフォルトの名無しさん
垢版 |
2020/11/18(水) 23:00:38.15ID:XsHXPiSN
>>954
これかも
1列目にブランク入りのデータが入ってた
2020/11/18(水) 23:22:35.65ID:2l0B+GoX
AWKのgetlineってめっちゃ便利よね。
これ使い始めたらもうシェルスクリプトじゃなくてAWKスクリプトになるけどw
958デフォルトの名無しさん
垢版 |
2020/11/18(水) 23:25:59.76ID:XsHXPiSN
>>956
いや違うわ
ブランク入ってたらそもそも$2がxにならない
2020/11/19(木) 02:55:11.75ID:kL0AGIHT
まず再現するデータをよこせ
2020/11/19(木) 07:48:43.53ID:jemYGepS
元ネタの人じゃないけど以下のデータでおかしくなった。

a.txt
a x Nov 17 2020 aaa
b x Nov 18 2020 bbb
c x Nov 18 2020 ccc
d x Nov 19 2020 ddd
d x
e x Nov 19 2020 eee
f x Nov 20 2020 fff

d の行以降の日付が今日の日付になった。Ubuntu 16.04.7。
なんかデータをちょっといじると再現しなくなるような感もある。
961946
垢版 |
2020/11/19(木) 10:41:14.25ID:uVXRNBYq
>>960
d x
という変な行も、データに入れるのか?

Windows 10, WSL2, Ubuntu 18.04 では、下のように出力された

a,2020-11-17,aaa
b,2020-11-18,bbb
c,2020-11-18,ccc
d,2020-11-19,ddd
d,2020-11-19,
e,2020-11-19,eee
f,2020-11-20,fff
2020/11/19(木) 21:37:07.41ID:ACSoydf1
>>961
そう。わざと壊れたデータで遊んでみているw

確実に再現できるバグは、ある意味治すのは易しい。
再現方法がよくわからんバグは...どうしたら再現するかを考えるのも一興かとw


あしまった、データが違ったかも。こうかな。

a x Nov 17 2020 aaa
b x Nov 18 2020 bbb
c x Nov 18 2020 ccc
d x Nov 20 2020 ddd
d x
e x Nov 20 2020 eee
f x Nov 20 2020 fff
2020/11/19(木) 21:49:05.89ID:pLwLwTYy
ちなみにdateコマンドは日付が空だと今日の日付を入れるようなので
Nov 20になる前に試すのがおすすめw
964946
垢版 |
2020/11/20(金) 02:15:19.68ID:pwTm9Uxw
このデータでやった。
b が今日の日付になる

a x Nov 03 2020 aaa
b x
c x Nov 05 2020 ccc
d x Nov 06 2020 ddd

出力
a,2020-11-03,aaa
b,2020-11-20,
c,2020-11-05,ccc
d,2020-11-06,ddd
2020/11/20(金) 14:19:37.94ID:EGUOn9wt
>>964
うん、それは単に >ちなみにdateコマンドは日付が空だと今日の日付を入れるようなので
だと思う。

自分の環境で >>962のデータを食わせたら
a,2020-11-17,aaa
b,2020-11-18,bbb
c,2020-11-18,ccc
d,2020-11-20,ddd
d,2020-11-19,
e,2020-11-19,eee
f,2020-11-19,fff

となった。e, f で空のdの所で得た日付を使われている感じ。ちょっとおもしろい。
966デフォルトの名無しさん
垢版 |
2020/11/23(月) 08:04:11.39ID:bkMAXdue
ループ処理をバックグラウンドで流すと500個ぐらいプロセスができて
まったく動かない。いい方法ないかな。
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況