X



シェルスクリプト総合 その29
レス数が1000を超えています。これ以上書き込みはできません。
0296デフォルトの名無しさん (アウアウウー Sa9f-L0SM)
垢版 |
2018/10/23(火) 15:35:42.08ID:QwHjyvjPa
>>295
するする。仕事でRHEL6のサーバ使っててそれの一部をテストする時に使ってただけなので。
0298デフォルトの名無しさん (アウアウウー Sa5d-hDoO)
垢版 |
2018/10/25(木) 14:43:08.46ID:hw/Q19JUa
>>297
それもはやシェルかどうか関係なくてWindows固有の問題だと思うが、エクスプローラでそのファイル右クリックしてプロパティ出したらそんな感じの設定できるようになってない?
最小化した状態で実行するとか、そんなやつ。
0299デフォルトの名無しさん (アウアウウー Sa5d-hDoO)
垢版 |
2018/10/25(木) 14:51:54.06ID:hw/Q19JUa
こうだ。

まずショートカット作り、そのショートカットのプロパティ出すと実行時の大きさを指定できる所があって、そこを最小化にすると実行時にタスクバーにアイコン出ているだけになる。
0301デフォルトの名無しさん (ワッチョイ 9764-Ed1r)
垢版 |
2018/10/26(金) 22:15:40.17ID:ScQN6FWl0
ファイルや標準出力の行数がある数値より大きいことをできるだけ高速に確かめるにはどうすればいいだろう
最も単純で最もUNIXっぽいのは
$ test $(<file.txt wc -l) -gt $num
としてその真偽を見ることだけど
$ test $( (yes | head -n 3000000000000000000) | wc -l) -lt 300
こういうのを実行して貰えれば分かると思うがかなり時間が掛かる
俺の使ってる計算機はそこそこ良い性能(Intel Xeon x2/32GiB RAMなのだが)
それでも実行に1分強掛かった。
しかしこれは無駄だ。なぜなら結局比較する対象は300なのだから、「300行以上ある」ことが分かればいい。
なにか案ありませんかね。

思ったのはsed -n -e '300p'とかでその失敗判定を見るとかだが,これはsedコマンドの失敗の要因が他にもあるので
ちょっと不安定かなと。
0302デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/26(金) 23:12:31.32ID:7cGNdWT70
cで指定行読むコマンドを作ればいい
面倒なこといちいち考える必要がそもそもない
0309デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 01:23:00.95ID:4RrrP6U60
シェルスクリプトでループで回しながら数えるのと
headで300行とってきて、wcで300行数えるのってどっちが速いんだろうかね
やればすぐわかるけど、やる気起きないなぁw
0310デフォルトの名無しさん (ワッチョイ 5b9f-3knh)
垢版 |
2018/10/27(土) 04:24:55.28ID:QwPOuwmq0
>>309
シェルスクリプトだとインタープリタの言語みたいな動きになるので遅そうなイメージはあるな。但しうまいこと内部で最適化されれば速くなるかもね。
0311デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 08:30:31.93ID:4RrrP6U60
>>310
いうてもループとカウントと条件分岐だけだからなぁ
内部的にはインタプリタ解釈後の状態になってるだろうし
そこでCPUは食わない気がする

でもheadでとってきてwcでカウントの部分は並列で実行できるわけで
マルチコアなら当然のことながら、シングルコアでもファイルから読み取りの方が
遅いからwcで待たされることはなさそう

どちらが速いかは微妙な所だなw
0313デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 09:08:24.86ID:S4VvuAVS0
ファイルの先頭からLFの数を数えるだけのことを
ああでもこうでもないと
いちいち考えないといけないオツムのデキを疑うわ。。。
0314デフォルトの名無しさん (オッペケ Sref-9p2Q)
垢版 |
2018/10/27(土) 09:14:33.78ID:EI3TCK5cr
ループってreadのループ?
catからパイプしてwhileのreadループってどうなんだっけ
昔作ったシェルでcatしてたファイルを処理中に書き換えたけど
実行されてる処理では書き換える前の内容で処理されてたみたいだから
どこかメモリに展開されてるんじゃ
catからのパイプでプロセスが終わってるからか?
でもリダイレクトやヒアドキュメントでも同じじゃないの?
0315デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 09:24:18.83ID:S4VvuAVS0
低学歴知恵遅れの思考形態、世界では
すでに用意されているコマンドを組み合わせてシェルスクリプトを書くことが
シェルスクリプトを書くことになるという決まりがあるのが
このスレみてると分かる
0317デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/27(土) 09:36:35.55ID:94jXB05x0
>>314
単にバッファに入っていただけとか。カーネルに設定できるバッファサイズなバッファなんぞもしくはcatプログラムのバッファ(の方が小さいだろう、たぶん)
もしくは上書きが上書きではなくて削除して新規ファイルに保存とかの場合とか(削除してもどこぞでオープンしていたらクローズされるまでは元のはそのまま残る)、か、OSが他でオープンされていたら上書きでも同じように別に保存してるとか
0318デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/27(土) 10:00:05.77ID:4RrrP6U60
>>313
考えてるのはファイルの先頭からLFの数を数える
「効率がいい方法(コマンド)は何か」だよ

LFの数を数えることなんてわかりきったことは考えてない
それを実現する方法を考えてる

まったくキミは思慮が足りないなw
0325デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/27(土) 11:01:01.29ID:S4VvuAVS0
低学歴知恵遅れのしゃべり場
0331デフォルトの名無しさん (ワッチョイ df03-WuzW)
垢版 |
2018/10/28(日) 06:57:04.86ID:xmv6f/Y+0
そもそもシェルでええのにわざわざシェルスクリプトって言いたがる新参者達w
0334デフォルトの名無しさん (ワッチョイ df03-WuzW)
垢版 |
2018/10/28(日) 09:10:44.72ID:xmv6f/Y+0
>>333
おまえがググれよおこちゃまw
0335デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 09:26:48.32ID:PnJQ4LJT0
こんな感じに script1.sh が script2.sh を呼び出してる状態でさ、

script1.sh
 └ script2.sh

CTRL+Cを押した時、script2.shは止めて、script1.shは
止めないってできるのかなぁ?

シグナルって、伝搬というか、上から下へ もしくは 下から上へ
流れていくものなん?
0342デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 11:47:47.85ID:gJfQRhUl0
script2.shでそのへんの制御とかしたくなく、script1.shだけでならscript1.shで trap SIGINTすればいいだけっぽいな。無効じゃなくなにもしないシグナルハンドラで
script2.shの時だけでならその前後でNOPのシグナルハンドラ設定通常のシグナルハンドラに戻すとかか

>>341 被ったけど、書いたので被り被りで
0343デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 17:27:21.50ID:XoYPKH7l0
勘違いしてた。違う所が原因だった

単純にscript2.shを起動してるのではなくて
script2.sh | filter みたいにパイプ使っていて、
CTRL+C押したときにscript2.shが出力するメッセージを
script1.shで受け取れないって問題だった
0344デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 17:58:26.84ID:gJfQRhUl0
どのタイミングでの出力が出ない、出したいのかわからんな。CTRL+C押した瞬間ギリのか??としか思えないが。filterがなんなのか知らんけど、script1.shでtrapでもscript2.shでの出力が全くでないことなないだろう、当然
script2.shでtrapしてexitすればギリ近くのまで出るんじゃないの。script2.shで実際に出力しているコマンド(プロセス)にもよるだろうけど
0345デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 18:40:23.99ID:gJfQRhUl0
ああ、trapの対象はパイプチェイン(?)の最後のヤツ&それがシェルでなければなのか?script2.shに飛ぶことはないのね。その最後のでexitすればだなすればかな
script2.sh | cat
script2.sh | sh -c "trap 'exit 0';cat"
のような変態なw それもシェル種類依存かな。あとはバッファをflushすればよりなんとかなりそうかなあ(できるのであれば)
そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
0347デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 19:05:49.36ID:XoYPKH7l0
>>344
最終的にやりたいことは

script1.sh ・・・ サブプロセスの標準出力・標準エラー出力を総てキャプチャしたい
script2.sh ・・・ 標準出力・標準エラー出力を行い、CTRL+Cを押されたら(trapして)
          CTRL+Cが押されたと標準エラー出力に出力したい

ってことなんだよね

> そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
そういうことだし、諦めて一つのスクリプトにしてやりたいことは
解決できたのでもう深追いする気はなくなってる

あと関係ないけど、SIGINTってPOSIXじゃないみたいだなw
INTを使えってshellcheckに怒られた。みんな SIG SIG 言ってるのに
0348デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 20:03:04.22ID:gJfQRhUl0
なにその勝手にやる気なくすなよw ほんとに身勝手だな、いつも通り
SIGINTはPOSIXだからな(なぞ)。そっち寄りのの人は普通に使ってしまうんじゃね。てか、んなの本題に関係ないだろうに、そんなこと言いたいのはわかるけどさ(なぞ)
0352デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 20:30:59.64ID:XoYPKH7l0
>>350
やる気ではなくて、POSIX縛りは必須要件なので
サブプロセスの標準エラー出力の件は、別の方法で解決できることなので

数値でも指定できるのは知ってる。trap SIGINTとかSIGINT抜けてたとか
かいてあるから、trap INT、INT抜けてただよって言ってるだけ
0353デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 20:36:08.52ID:gJfQRhUl0
また、後出しか。そんなレスしている目的は違うだろうw
いきなり「数値でも指定できるのは知ってる」とか??(3)に対して???

http://pubs.opengroup.org/onlinepubs/007904975/utilities/trap.html
(新しいドキュメントはどこだ?)
SIG付きもPOSIX仕様のようだけどなwオプションでも言及しているんだからPOSIXの仕様のひとつだろう
なんて、アホなやりとりしたいの?
0359デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 20:56:45.89ID:gJfQRhUl0
だから最初は「(なぞ)」にしてたやん
>>347の最後あたりの応えとしてしかない。お前が変なツッコミするから悪い
ちなみに、>>353のPOSIXドキュメントでも (3) のことに言及しているのはどう思う?UNIX/Linuxはそんな境目はそれほど無いと思うけど。誰かみたいに(1)しか興味ない知らない人もいるだろうけど

単に知らなかっただけでいいのに、いつも偉そうにしているからドツボにはまってるように見えなくもないw
0360デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 21:00:00.71ID:XoYPKH7l0
> ちなみに、>>353のPOSIXドキュメントでも (3) のことに言及しているのはどう思う?

それが、シェルスクリプトだけのドキュメントじゃなくて、POSIXのドキュメントだからでしょう???
なにがいいたいんだか
0365デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 21:37:09.45ID:gJfQRhUl0
>>363
で?その目的がわからんな。単に素直な疑問なだけなら、>>348で応えているけど。話を振ってねちっこく続けているのは誰なの?>>349とか以後とか
それも>>353でお前は納得したんだろ?


なんか上でC++のことを偉そうにのたまっているのを誤爆したのお前じゃなかったっけ?
それがお前じゃなくても、なんでコマンド関連のCなんて簡単なのにそんなに知らないのか不思議だな、なんか異常にシェルスクリプト「だけ」に拘るのもあって

UNIX/Linux界隈では自分でCでコマンド書く(簡単なフィルタも)のも普通にいるだろうから、お前のようにシェルスクリプトだけしか言ってはいけないなんてないと思うけどな(それも俺からは単にお前の間違いをごまかすためだけにしか見えんからw)

>>362は俺に振ってもいいが、なにを聞いているのか傍目にもわからないw すまんが、も少し具体的に>>362
0368デフォルトの名無しさん (ワッチョイ 5b98-o90R)
垢版 |
2018/10/28(日) 21:49:30.03ID:XoYPKH7l0
>>365
コマンド?
もしかして、trapがコマンドだと思ってる?
シェルビルトイン関数だよ

シェルのプロセスでシグナルを扱わなきゃいけないから
外部コマンドで実装することは不可能

だからシェルスクリプトスレでtrapの話をするならば
シェルスクリプト前提になるのは当然だろう?
0369デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 21:53:11.18ID:gJfQRhUl0
>>368
そういう細かいことは言いたいのね。大枠でコマンドでいいじゃん (1) の範疇なんだから

その二行目以降はイミフ。なにを言っているの?言いたいの?
お前から見てミスを論ってなんとかお前のなにかを保ちたいだけにしか見えない
0375デフォルトの名無しさん (ワッチョイ 5b76-MKt5)
垢版 |
2018/10/28(日) 22:07:32.28ID:gJfQRhUl0
>>373,374
はあ?無茶苦茶やな
その答えはすでに応えているけど。「みんな SIG SIG 言ってるのに」のに対する応えを含めての
それも最初に。それも話の流れで、お前も納得勉強wになっただろうにww

よほど「お前のなにかを保ちたい」が琴線だったようだねえw
0380デフォルトの名無しさん (ワッチョイ 9764-Ed1r)
垢版 |
2018/10/28(日) 23:38:46.03ID:5IpH1DwA0
シグナルを送信するコマンドの名前がsigとかじゃなくkillなのはなぜでしょうか。
例によって歴史的経緯? 元々はSIGKILLシグナルしか送信しなかったのでkillとか。
0384デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/29(月) 22:10:10.39ID:JGxixszg0
村に戻って親が死んでたら
そいつは手遅れコロスしかない
親はいつまでも待っていない
0391デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/30(火) 23:49:50.18ID:H/liFP070
いや手遅れ
親がしんでたらゾンビスプロセスになる
殺すしかない
0393デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 17:53:36.33ID:Kkuf6Nxk0
一回のループでファイルや変数を使わずに、偶数行と奇数行にまとめられないかなぁ?

例えば、入力ファイルが以下のような場合
1
2
3
4
5

出力は、以下のようにしたい
2 # ここから偶数行
4
1 # ここから奇数行
3
5

ファイルディスクリプタをうまく使えばできるんじゃないか?
と思ってたりするけどうまくいかない
0394デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/01(木) 18:26:55.97ID:OxvwXsOaa
変数も使っちゃダメなのか。うーん。
0396デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 18:50:36.53ID:Kkuf6Nxk0
>>395
sedでできるならsedでもいいけど。

やっぱり無理だよなぁ
結局、奇数行のデータを後からだすためには
どこかにためておく必要があるわけで
メモリかディスクはどうしても使用してしまう

二回のループにするなら、メモリもディスクも消費しないけど
今度は入力データをためておく必要がある
0399デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/01(木) 19:46:11.92ID:OxvwXsOaa
元データがファイルに入っていて2回読んで良くて尚且つ変数使って良いなら楽だよ、っていうかそれなら誰でも作れるかw
0400デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 19:51:11.07ID:Kkuf6Nxk0
遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか

実際には偶数行、奇数行じゃなくて、データを種類ごとに前後に分けたくて
後ろに分けるデータは基本的に少ないってことがせめてもの救いか
0401デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 19:58:02.45ID:zOBF+lvD0
なんでバカって実行速度ばかり気にするんや?
0403デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:00:23.29ID:zOBF+lvD0
バカなのにストレスたまるの?バカやめたら?
0404デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 20:03:44.33ID:Kkuf6Nxk0
その理屈だと、
・バカなのにストレス溜まるの?(不思議)
・バカじゃないならストレス溜まる(普通)
ってことになるから、

バカやめたら、それこそストレス溜まるのでは?
0405デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:18:26.34ID:zOBF+lvD0
バカの理屈わろたw
バカなんやから考えん方がええで
0407デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:37:24.98ID:zOBF+lvD0
バカに言いかえすとか無理やわ理屈がないからバカなんやでおまえ
0410デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 20:50:42.34ID:zOBF+lvD0
バカとバカを嘲笑う者や
0411デフォルトの名無しさん (ワッチョイ 4e81-8AGB)
垢版 |
2018/11/01(木) 20:51:14.40ID:5U41yww90
奇数行だけ抽出するスクリプトと
偶数行だけの二つ作って、
奇数行スクリプトの出力に偶数行のを追記させる

なんとなくそんなイメージ
0412デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 21:54:51.76ID:zo7FxUKXr
速度言うならCなりJavaで書いてデーモン化して動かさんとな
シェルスクリプト特有のコマンド羅列のプロセス起動しまくりってのは
すごいコストがかかってる
0414デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 21:58:38.71ID:zo7FxUKXr
>>404
いや普通なら落としどころ決めるだろ
シェルスクリプトだからあきらめるとか
ちゃんとした言語で作るとか
バカだから漠然と心配ばかりしてストレスが溜まる
今も月が落ちてくる心配でもしてるんじゃないの
0416デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 21:59:49.59ID:zOBF+lvD0
>>413
シェルが固まったんやがウイルスちゃうやろな?直しかた教えろバカ
0421デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:09:12.59ID:zOBF+lvD0
バカはいいかげん黙っとけ
0422デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:12:35.86ID:Kkuf6Nxk0
>>413
結局はそれ、二回読み込んでるんだよね

>>418
それも考えたんだけど、結局はソートの
ためにメモリに読み込むから本質的には変わらないかなーと

あと>>393の例が良くなかったけど、入力ファイルは昇順とは限らなくて
偶数グループと奇数グループにわけるだけで、順番は変えたくないんだ
0423デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:13:57.69ID:Kkuf6Nxk0
>>421
バカじゃないので黙らないw
ってか、俺を黙らせるのは不可能なのでNGにして
俺にくだらないレスしないようにしてください
俺にもくだらない反論(?)が来ないのでWIN♪WIN♪
0424デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:16:53.31ID:zOBF+lvD0
>>423
要するにバカやんけおまえ
0426デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:21:41.75ID:zOBF+lvD0
>>425
バカを嘲笑うのがおもろいのにNGにするわけないやろ
ホンマにバカやなおまえ
0427デフォルトの名無しさん (ワッチョイ 9ab3-gRbH)
垢版 |
2018/11/01(木) 22:22:49.71ID:45pCF+y00
ああもぅめんどくせぇなw 順番変えたくないなら stable sort でええやんけ
メモリがどーたらこーたらは知らんw

$ cat hogehoge | awk '{print ($1%2?"b":"a") "\t" $1}' | sort -s -k1,1 | cut -f2
0430デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/01(木) 22:25:19.85ID:zOBF+lvD0
>>428
バカはしゃべるな
0432デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:35:03.93ID:Kkuf6Nxk0
だから仕方ないかって書いてんのにw
ほんと人の話読まないやつだな

400 自分:デフォルトの名無しさん (ワッチョイ ab98-QXT6)[sage] 投稿日:2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0 [4/15]
遅くなるのでディスクに書き込みたくないし、メモリも
あまり使用したくなかったんだけど仕方ないか
0435デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/01(木) 22:43:09.27ID:Kkuf6Nxk0
>>434
片方ファイルだもんね。

メインプロセス起動(出力を2つに分岐)
├出力1 偶数行表示プロセス実行
└出力2 奇数行表示プロセス実行(偶数行表示プロセス終了後に処理開始)

みたいな事ができるかな?と思ったんだけど

まあ、これでも内部的には出力がバッファに
溜め込まれてるんだろうけどね
0436デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/01(木) 22:48:35.54ID:zo7FxUKXr
>>432
お前ホントバカだな
お前のようなバカのためにプログラム書いてやったぞ

eo-sort.exe

第一引数に入力ファイルを渡せば標準出力に
まず偶数業出してその後に奇数業出してくれる
必要ならそれをファイルにリダイレクトしなよ
0440デフォルトの名無しさん (ワッチョイ 5b64-ofXo)
垢版 |
2018/11/01(木) 23:01:11.09ID:upF+pHX50
>>435
というかよく読んだら「ファイルディスクリプタをうまく使う」ってそういうことだよね
teeっていうのはファイルと標準出力に書き込む「ファイルディスクリプタをうまく使う」コマンドの一つなんだからさ。
まあ俺には変数使わずに出力を分けるのは無理かな。

ところで変数使わない理由はPOSIXシェルスクリプトは変数のスコープができず
利用者が定義している定数を潰す可能性があるからって理解でいいのかな?
0444デフォルトの名無しさん (ワッチョイ 769f-MyS3)
垢版 |
2018/11/01(木) 23:58:02.32ID:s+SrulDE0
>>441
コペルニクス的転回だな。
0449デフォルトの名無しさん (ワッチョイ b69f-8AGB)
垢版 |
2018/11/02(金) 06:38:46.12ID:BwjETkqh0
あのう、プロセス動かすだけでメモリ消費してしまうんですが
変数や作業用ファイル作らなくても内部的な一時ファイルは作られるわけで
リソース消費しないで切り分けようとエディタ立ち上げて手作業でやっても、やっぱりリソース消費があるので
誰かが言ったように、ノートかなにかに手書き転記するしかないと思う

つうか、そんな人はコンピュータ使っちゃダメだと思う
まるで、経団連会長みたいなんだもの
最近会長室にコンピュータが導入されたらしい

あれこれ、たかが変数や作業用ファイル如きでリソース消費しないように考える時間など無駄中の無駄
なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから
時間の使い方を間違っている
そんな下らない話題で、ここのスレのリソースも無駄遣い
0451デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 07:42:30.53ID:bE/8yEKV0
>>448
> peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね

こんなんでどう? peeコマンドのシェルスクリプト実装版
シェルスクリプトで実装したから外部コマンドだけじゃなくてシェル関数も呼べるよ

#!/bin/sh

pee() {
( ( (
while IFS= read -r line; do
printf '%s\n' "$line"
printf '%s\n' "$line" >&3
done | "$1" >&4) 3>&1 ) | "$2" ) 4>&1
}

foo() { printf 'foo %s\n' "$(cat -)"; }
bar() { printf 'bar %s\n' "$(cat -)"; }

pee foo bar
0452デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 07:59:00.48ID:bE/8yEKV0
>>443

>>451のシェルスクリプト実装版もそうだけど、
俺の予想が正しければ、その2つのawkは並列に動作するんじゃないかな?
1つ目のコマンド実行が完了まで2つ目のコマンドの実行をブロックするとは
思えないので2つの出力は混じって出てくると思う。

プロセス起動のオーバーヘッドがあるから少量のデータだと
コマンド順に出力されるように見えるかもだけど
0453デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 08:25:40.36ID:bE/8yEKV0
あれ? これでできてね?

最初こんな感じだったからブロックされずに混じって出てくることになったけど
foo() { cat -; }
bar() { cat -; }

こうしたせいで出力がブロックされてる気がする
foo() { printf 'foo %s\n' "$(cat -)"; }
bar() { printf 'bar %s\n' "$(cat -)"; }
0454デフォルトの名無しさん (ワッチョイ 5b64-ofXo)
垢版 |
2018/11/02(金) 08:26:07.31ID:tmRne/9W0
>>451
https://www.mankier.com/1/pee
これを読む限り引数は2つだけじゃないから,ちょっと機能不足かもね。
もちろん今回のあなたの目的には合うけど(2通りのパイプがあればそれで十分でしょう?)
ただ,もっと一般的なpee(1)コマンドを作ろうと思うと,
引数の数に応じてまずは雛形を作りそれをevalする,みたいな方法を採る必要があるかも。
0455デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 08:41:23.56ID:bE/8yEKV0
>>454
複数対応だと面倒くさそう・・・
eval使えば可能だろうけど、文字列組み立てるのが

そう。今回書いた内容は>>453でできる。
だけど今回書いてないもう一つの制限があってそれで出来ない・・・
(制限っていうのはパイプで関数に渡すんじゃなくて変数で渡したい)

まあいいや、また長くなりそうだから質問閉じるわ
とりあえず変数使わずに出力をまとめることはできたし
あとは別の問題
0456デフォルトの名無しさん (ワッチョイ 9ab3-gRbH)
垢版 |
2018/11/02(金) 09:19:53.88ID:Rb6mIS4M0
foo() { printf 'foo %s\n' "$(tail -n 1 -)"; }
bar() { printf 'bar %s\n' "$(head -n 1 -)"; }

ってして seq 1000 | ./pee.sh としたら実行する度に foo の値
が違ってるな…どちからの子プロセスが実行完了したら while
も終了するから仕方ないんだろうけど。trap '' PIPE ってすると
I/O error になるし
0457デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/02(金) 09:45:49.16ID:0QIYfvOaa
>>449
> なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから

いや知らんけどそういう極小環境なのかも知れんよ。そうでなければこんな要求出てこないと思うが。
0459デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 09:59:54.78ID:bE/8yEKV0
限定的ながら変数で渡すっていうのが出来てしまったので晒す。多分使わない

#!/bin/sh
main() {
 index=0
 ( ( (
  while IFS= read -r line; do
   index=$((index+1))
   dumpvar_and_call "even"
   dumpvar_and_call "odd" >&3
  done | eval "$(cat -)" >&4) 3>&1 ) | eval "$(cat -)" ) 4>&1
}
dumpvar_and_call() { set; echo "$1"; }
even() {
 if [ $((line % 2)) = 0 ]; then
  echo "index:$index even $line"
  sleep 1
 fi
}
odd() {
 if [ $((line % 2)) = 1 ]; then
  echo "index:$index odd $line"
 fi
}
main<<HERE
3
6
7
4
2
8
HERE
0460デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/02(金) 10:03:43.36ID:bE/8yEKV0
なんで使わないかというと、変数をパイプで渡すために
setでシェル変数をダンプして、evalしてるんだが、
bashでは読み取り専用変数があってエラーになるから

setの出力をあれこれフィルタすればできると思うが、
変数の中に改行が入ってる場合とか対応が面倒

bashなら変数名に特定のプリフィックスがついたものだけ
ダンプできたとは思うが他のシェルではそうは行かない

また、行ごとに変数すべてをsetしてevalとか
パフォーマンス悪そうだし。
0463デフォルトの名無しさん (ワッチョイ 5b64-74J5)
垢版 |
2018/11/02(金) 11:47:49.42ID:tmRne/9W0
ただの愚痴だけど
POSIXユーティリティにネットワーク通信が含まれてないのってマジで致命的欠陥だと思う。
POSIX原理主義とか,たしかに素晴らしい考えだとは思うけど,ネットワーク通信なくして現在のコンピュータを管理・運用するのは不可能っていうか
もしできてもすごくつまらないでしょう。
0464デフォルトの名無しさん (オッペケ Srbb-t4vu)
垢版 |
2018/11/02(金) 12:35:03.14ID:e7WVTJJGr
なんでバカって大げさに言いたがるんやw
致命的てwww
0465デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/02(金) 13:04:44.69ID:0QIYfvOaa
>>464
大袈裟に言うなよ
0466デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/02(金) 19:08:56.10ID:a5BSTCMR0
なぜか悔しがって意味不明なバカ>>465
どないなっとんねんおまえらwww
0467デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/02(金) 23:14:17.14ID:KoqyjIsr0
アンリカバブルな低学歴知恵遅れだからしょうがない
0468デフォルトの名無しさん (ワッチョイ 769f-MyS3)
垢版 |
2018/11/03(土) 05:20:12.41ID:vg8hCxXN0
大げさだなあ
0470デフォルトの名無しさん (ワッチョイ b69f-8AGB)
垢版 |
2018/11/03(土) 17:50:12.58ID:GQ9FpTGT0
MicroPythonを実装した方が良さそう
組込にも対応してるから
0471デフォルトの名無しさん (ワッチョイ bebe-YdG1)
垢版 |
2018/11/04(日) 08:48:54.81ID:S8h/cDRc0
コマンドを作っていてすこし疑問に思ったことなんだけど
--helpオプションで出力される文章って太字や着色なんかで装飾してもいいのかな。
「いいのかな」っていうか、そういうことしてるコマンドをほとんどみかけないので
もしかしたら「--helpオプションで出力される文章は装飾しないように」っていう規約がどこかにあるのかな と思ってさ。
0472デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/04(日) 10:11:04.15ID:Nn4ZdlZB0
>>471
それはいいアイデアだな。
コマンドの出力とは違ってヘルプを入力するプログラムなんて
無いだろうし、カラー専用でもいいくらいなんじゃないか?

そう考えると、manとかinfoもカラーにするべきなんだろうな
今どきカラー使えないとかまず無いし

色ももう16色に拘る必要もないだろう
最低でも256色、24bitカラーも普通に使っていいだろう
0473デフォルトの名無しさん (ワッチョイ c703-gRbH)
垢版 |
2018/11/04(日) 10:12:08.50ID:iTJ8u5Nd0
>>471
どこかにあったとしその素性のわからん規約におまえが従う必要ないやんアホなん?
0476デフォルトの名無しさん (ワッチョイ ab98-QXT6)
垢版 |
2018/11/04(日) 11:18:53.69ID:Nn4ZdlZB0
↑ふざけとんのか

BASH(1) General Commands Manual BASH(1)

名名前前
bash - GNU Bourne-Again SHell

書書式式
bash [options] [file]

著著作作権権
Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.

説説明明
bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash に
は、Korn シェルや C シェル ksh や csh) の便利な機能も採り入れられています。

bash は IEEE POSIX specification (IEEE Standard 1003.1) の Shell and Utilities に準拠する実装を目指していま
す。 bash はデフォルトで POSIX 準拠に設定することもできます。

オオププシショョンン
0478デフォルトの名無しさん (ワッチョイ bebe-YdG1)
垢版 |
2018/11/04(日) 11:56:45.43ID:S8h/cDRc0
>>472
24bitカラーはまだマズいと思う。
多くのXデスクトップ環境で利用されてる端末エミュレータ
(GNOME TerminalとかLXTerminalとか)は
LibVTEベースなのよ。
そしてLibVTEの安定板は24bitカラーには対応してない。
0479デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/04(日) 12:58:38.32ID:MKH8Qowh0
そういうのを根本的に対応できるようにするなら
roffが対応する部分になるからな

このスレでやってることは
池沼の塗り絵
0489デフォルトの名無しさん (ワッチョイ 9a1d-MyS3)
垢版 |
2018/11/06(火) 16:27:38.20ID:Vcs848wz0
... | perl -0777 -ne 'print grep(m{ココ1}i, split("(?=ココ2)", $_));'
例えばこのような文脈で動作させていたものを
パイプ移行をシェルスクリプトに書いておき
変数ココ1 ココ2 に渡して処理したいのです

| split_grep.sh ココ1 ココ2 
このように動作させたいのですが
$1 $2 ... などを見ても 参照できてなくて困っています
0492デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/06(火) 23:18:09.57ID:9jHKU1L00
シェルスクリプトは20年動くとか言ってるやつがいるけど、
あれ嘘だなぁ。

各シェルの実装は互換性がない部分があるし、
同じシェルでもバージョンが変わると微妙に動きが変わる

POSIXという仕様があってもそれを完全に実装しているとは
限らないしバグもある。

20年前のJavaScriptと同じようなレベルだ。
そのJavaScriptも20年前のものが今でも動いているからねw

今のJavaScriptは本当にどれもで同じように動くようになったけど20年前は大変だった。
どのシェルでも同じように動くシェルスクリプトを書くのは今でも大変だよ
一度互換性テストでもやって準拠度100%を達成を競わせたほうが良いだろう
0493デフォルトの名無しさん (ワッチョイ 5b64-ofXo)
垢版 |
2018/11/07(水) 03:53:59.64ID:XzpCa+6s0
「POSIXという一つの規格」がなぜそんなに強力だと思うのか分からない。
Pythonの公式文書やECMAが規格するJavaScriptと同等の立場でしょう。
もちろん,俺がシェルスクリプトを書くときは,俺がPythonやJavaScriptを書くときと同じく
POSIXという共通規格に従うようにしているが,それは今後20年動かす為じゃない。
0494デフォルトの名無しさん (オッペケ Srbb-elto)
垢版 |
2018/11/07(水) 09:26:49.70ID:66xysPr5r
cronから実行しているシェル(スクリプト)があるんだけど
2重実行されると問題があるので
そのシェルをくるむ親シェルを作って
そこで事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる

でも最近もともと実行してるシェルを複数回ループで実行したい要件が出てきた
単純に親シェルでループさせることを考えたけど
pkillしてもループで再実行されてkill出来ずに2重実行される問題が出てくる
シェルを親子孫の3階層にして新しく間に挟む子シェルでループさせ
親シェルのpkillではこの子と孫とコマンドをkillするといいと思うんだけど
階層が深くなって嫌だなと思うんだけど何かいい案ない?

ちなみに孫シェルでループってのも考えたけど
cron以外ではループさせたくない場合が多いので
そこには手を加えずシンプルなままとしたいため考慮から外しました
0496デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/07(水) 09:48:09.44ID:bimd4khFa
もしflockコマンドがあればそれで可能な筈。
0497デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 09:48:23.84ID:v2POOMdv0
どこまでの子プロセスとか残る可能性がとか条件が全然わからんが、シェルスクリプトを2重実行しないようにだけなら、その冒頭で、
[ -f /var/run/hogehogeshellscript.pid ] && kill -0 $(cat /var/run/hogehogeshellscript.pid) && exit 0
printf "%d" $$ > /var/run/hogehogeshellscript.pid
後始末で
rm -f /var/run/hogehogeshellscript.pid
が常套手段だな、俺は。「事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる」なんて、バグって残る場合しか考えられない(そんな動いているの殺していいの??)
0501デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 11:16:33.73ID:UCphLCxy0
バグの言い訳をシェルスクリプトのせいにするなよ
シェルスクリプト以外でもやり方は一緒だろ

それともシェルスクリプトでは不可能で
他の言語なら可能な方法があるとでも言うのか?

> そんな超短時間で多重起動されうるもんなんて、シェルスクリプトなんて書かない
シェルスクリプト以外でいいんで、どうやるのか答えてみて
0502デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 11:40:25.66ID:v2POOMdv0
バグの言い訳??
そんなタイミングにシビアなのは普通にCなりで書くけど?なんか知らんがシェルスクリプトで処理スピードに必死なヤツもいるけど、そんなに時間にシビアなら普通にCでするだろう(一部でも)
てか、デーモンだろな。別にシェルスクリプトでデーモン書いてもいいけど、小回りが利くのはやっぱCなりの方だな
0509デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 11:56:38.86ID:v2POOMdv0
うるせっw
どうもシェルスクリプト大好き(後は私怨かなあとw)な絡みで、それ視点でしかなのでうやむやにしてんだけどね。言ったってたぶん聞かない人だから
0511デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 12:06:12.02ID:UCphLCxy0
> 余計なことがない方が粒度が細かい

粒度の使い方を待ちってるだけじゃないか

で、デーモンにしないと多重起動は防げないって話をしてんのか?
デーモンにすれば多重起動を防げる理由は?


ほらな、突っ込まれるとこの程度、答えられないんだよw
0512デフォルトの名無しさん (ガックシ 06b6-ofXo)
垢版 |
2018/11/07(水) 12:07:51.60ID:8DqZdVO16
すまん 口を挟むけど

1.
シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを
可搬な方法ではほとんど制御できない。
一方でCはそもそもOSがそれで書かれているように、上記の事柄を比較的簡単に実現できる。
2.
ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。
3.
よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。
だから無意味

↑こういう理解でいいか?
0513デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 12:09:17.82ID:v2POOMdv0
>>511
>粒度の使い方を待ちってる(間違ってる)だけじゃないか
はあ?

>デーモンにすれば多重起動を防げる理由は
はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな
0514デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 12:16:34.30ID:v2POOMdv0
>>512
別に無意味とは言わないよ。俺は書かないというだけで。なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。それならCでのほうがスッキリ小回りが利くしという
後は、超短時間で多重起動されうるもんなんてよりCで書くなという、そんな起動頻度のあるのは、スクリプトではしない
0515デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 12:21:30.58ID:UCphLCxy0
>>512
> シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを
> 可搬な方法ではほとんど制御できない。

それはプロセスの多重起動を防ぐ方法と関係ない


> ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。

コマンドの制御時間やファイルの扱いとかなんの話をしてるのか
>>497はアルゴリズムの間違いなのでロックファイルがどうとか関係ない
(どうせC言語で作っても同じ間違いをするだろう)



> よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。
今はプロセスの多重起動の話でしか無いので、多重起動が出来ないならば運用に耐えられる
それがシェルスクリプトできないわけがない。
0516デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 12:24:39.53ID:UCphLCxy0
>>513
> はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな

デーモンが一つ動けば十分だとかそういう話をしてるんじゃない。

プロセスの多重起動を防ぐにはどうするかの話で、、
それはデーモンにしないと出来ないことではないだろ

>>514
> なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。

だから、なんでシェルスクリプトにこだわってるのか?
こっちはお前が、プロセスの多重起動を防ぐ正しい方法を知らないんだろうなって思ってるんだよ。

だからC言語でいいから書いてみろと。

同じアルゴリズムはシェルスクリプトでも使えるから、シェルスクリプトかどうかの話じゃないって言ってんの

で、C言語でプロセスの多重起動を防ぐ正しい方法を書けないんだろう?
出てないってことそういうことだ。シェルスクリプトだからと嘘をつくな
0521デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 12:33:40.01ID:v2POOMdv0
>>519
うーむ、だから粒度の問題と言っているんだけど。なにがアルゴリズムに問題があるの?cronで起動する大きな粒度では問題ないと思うけど
あるとしたら、起動終了間近とか??それは別の話だろうしな???
0523デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 12:39:53.83ID:v2POOMdv0
>>522
ああ、いいのかww
何を絡んでるのかイミフすぎ。場合によってって考えられないのかな?

そもそも>>499で十分で(十分だろう)というのに対して、その条件以外のツッコミに対して、その漠然として条件なら突き詰めると&俺にとって普通にシェルスクリプトで書かないってことなんだけどなあ
何が気に食わない、何が間違いなのかさっぱりだな
0524デフォルトの名無しさん (ガックシ 06b6-ofXo)
垢版 |
2018/11/07(水) 12:40:36.54ID:8DqZdVO16
>>515
俺は「プロセスの多重起動を防ぐ」というのを
「プロセスを一つ立ち上がっていることを感知する」
という仕組みを作ることだと思っていて、その方法の一つに
「プロセスが起動するときに特定のファイルを生成し
そして終了するときそのファイルを削除する
(そして そのファイルの有無によって多重起動を判断する)」
というものがある という認識。
「特定のファイル」はロックファイルと呼ばれる。

で ロックファイルアルゴリズムの問題点は非常に素早く二つのプロセスを立ち上げた時に
最初に起動したプロセスがロックファイルを生成し終える前に
二番目のプロセスがロックファイルが存在しないのを理由に立ち上がってしまう
(結果として二重起動する)
ということだと思っている。
このときに関わってくるのはファイルIOとかその辺のカーネル領域に片足突っ込んだ話なので
Cではできるがシェルスクリプトでは難しいということだと考えたんだけど
違いますかね。
0525デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/07(水) 12:43:18.47ID:bimd4khFa
flockコマンド使えって。シェル単体ではそこまでやってくれるやつは多分ないだろうし。
0526デフォルトの名無しさん (ワッチョイ 039f-VYDo)
垢版 |
2018/11/07(水) 12:47:11.27ID:v2POOMdv0
>>524
ロックファイル以外でも所詮OSで何らかの起動時のサポートが無ければCでも防げないと思うんだけど、どうだろう?
なので、デーモンとして一つ起動して、それを活性化するのがなんだけどな
0527デフォルトの名無しさん (ワッチョイ 038a-Mg3v)
垢版 |
2018/11/07(水) 12:56:45.06ID:sVRrLKNr0
>>515
>>>497はアルゴリズムの間違いなのでロックファイルがどうとか関係ない

どこが間違ってるの?
最初にロック取って最後に解放する、これを間違ってると言うなら
正解を教えてよ。多分逃げるんだろうけど。
0530デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/07(水) 13:04:59.10ID:bimd4khFa
ロックファイルの有無だけでやる場合は open() で O_EXCL 指定してファイル作ろうとしないと駄目で、シェルスクリプトからこれがやれるかどうかはシェル次第になる。
そういう外部コマンド作って呼び出せば確実だが、それがありなら fcntl() や flock() 等を使ったもう少し信頼性の高そうなロックをした方が良いように思う。

ロックファイルだけでロックする場合はもう一つ強制終了させられた時にファイルが消せずに残る問題がある。
これはファイルのタイムスタンプを見て古ければ動いていないとみなす方法である程度回避可能だが、その場合は動いているプロセスが定期的にファイルを touch する等して更新する必要がある。
しかしそれでも SIGSTOP により停止していただけだったら役に立たない。
0532デフォルトの名無しさん (アウアウウー Sac7-AdN2)
垢版 |
2018/11/07(水) 13:06:37.34ID:bimd4khFa
>>529
ああ。それでもできるか。
0534デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 13:40:10.94ID:UCphLCxy0
>>524

> で ロックファイルアルゴリズムの問題点は非常に素早く二つのプロセスを立ち上げた時に
> 最初に起動したプロセスがロックファイルを生成し終える前に
> 二番目のプロセスがロックファイルが存在しないのを理由に立ち上がってしまう
> (結果として二重起動する)
正しくない

正しいロックファイルアルゴリズムであれば、素早く二つのプロセスを立ち上げても問題ない
あんたが書いたそれはは典型的な間違ったロックファイルアルゴリズム(そして>>497も同様)

アルゴリズム自体の問題なのでシェルスクリプトかどうかは関係ない



直接的な解答ではなくて関連した話題になるが、多重起動防止以外でも重要だから読んどけ
https://www.ibm.com/developerworks/jp/linux/library/l-sprace/index.html
> 単純な解決方法は、open()をフラグO_WRONLY | O_CREAT | O_EXCLで使うことです
https://www.ipa.go.jp/security/fy20/reports/tech1-tg/2_05.html
> これを避けるためには先に述べたとおり、テンポラリファイルを生成するときに O_EXCL を指定すればよい。
0535デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 13:43:12.68ID:UCphLCxy0
もう少し引用する範囲を広げる

> これを避けるためには先に述べたとおり、テンポラリファイルを生成するときに O_EXCL を指定すればよい。
> これを POSIX シェルで行うには、set -C を使う。set -C は noclobber オプションを有効にする。
> noclobber が有効な場合、> によるリダイレクトでの open には O_EXCL が指定される。
> これを使ってテンポラリファイルの生成に挑戦し、失敗したときは終了するには以下のようにする。
> また、ここでは TMPDIR が指定された場合には使うようにしている。
0539デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 13:57:13.33ID:UCphLCxy0
ロックの確認とロックかけるのをアトミックにやらないとか
まともにロック処理やったことがない証拠だよ

これは初心者は誰でもやる典型的な間違いだからな
基本を知らずに独自の思いつきで実装するからそうなる

言われれ初めて気づく。だが一回言われればこうやれば
解決できるのかと深く記憶する話だから、単純に知識が欠けてるということ
だから他の言語でもどうせ同じなんだろということ。
0545デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 19:24:02.67ID:UCphLCxy0
そういやkshで思い出したけど、

ksh88ってもしかして比較的最近(今も?)使われてたりする?
ksh88っていうぐらいだから1988年だろ?ksh93っていうぐらいだから1993年だろ?
流石にksh88はなんて30年前の化石使われてないだろ?と思ったけど

Solaris 11 でこんなこと書かれてたんだよね。意外と最近まで使われていたのかなぁ?と
https://docs.oracle.com/cd/E26924_01/html/E25934/userenv-1.html
> シェルの変更 - デフォルトのシェル /bin/sh が ksh93 にリンクされるようになりました。
> レガシー Bourne シェルは /usr/sunos/bin/sh として使用可能です。
> 旧バージョンの ksh88 は、shell/ksh88 パッケージの /usr/sunos/bin/ksh として使用可能になっています。

Solaris 11が最新版って言っても2011年11月9日リリースなので2日後に7年前のOSになるけど
(でもサポートはSolaris 10が2021年までなのか・・・)

そしてksh93の機能でこんな事書いてたんで、$(( )) が使えないシェルはksh88だったんだなって思ったところ
https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/com.ibm.aix.osdevice/korn_shell_enhanced.htm
0548デフォルトの名無しさん (ワッチョイ 5b64-74J5)
垢版 |
2018/11/07(水) 21:01:40.12ID:XzpCa+6s0
>>546
「echo "echo \"Hello, world"'!'"\""」とかどうだろう。

参考: https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction
History expansions are introduced by the appearance of the history expansion character, which is ‘!’ by default. Only ‘\’ and ‘'’ may be used to escape the history expansion character,
but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.
0549デフォルトの名無しさん (ワッチョイ 9a98-QXT6)
垢版 |
2018/11/07(水) 21:21:50.95ID:UCphLCxy0
>>547
ksh・・・お前が諸悪の根源だったか

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861743
> % posh -u -c 'echo "$@"'
> posh: @: parameter not set

poshはpdkshからフォークしている
> posh (0.0.1) unstable; urgency=low


> * Initial release. (copied from pdksh 5.2.14-6). closes: bug#150431.



そしてシンプルな(笑)解決方法をありがとう
(if書くのはもっと面倒だった)

もっとバッドノウハウあったら教えてくれ!
0550デフォルトの名無しさん (ワッチョイ 5b64-74J5)
垢版 |
2018/11/07(水) 22:18:01.95ID:XzpCa+6s0
>>549
あー。分かってると思うがこれは俺が考えた方法じゃない。
古いGNU grepでegrepコマンドを
https://git.savannah.gnu.org/cgit/grep.git/tree/src/Makefile.am?h=v2.5.1#n23
↑こうやって作ってたのを見掛けてさ。
これはすごい方法だと思って自分のシェルスクリプトに取り入れた。

でもPOSIX 2013でset -uが有効のときでも空の変数$@および変数$*がエラーにならない
っていうことが決定されたのでもう不必要。
http://pubs.opengroup.org/onlinepubs/9699919799.2013edition/utilities/V3_chap02.html#tag_18_25_18
0551デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/08(木) 00:40:04.66ID:rJTiWJ810
>>550
modernishでも言及されてた。時代遅れのワークアラウンドだってw
でも現存するシェルに蘇っておるのじゃよ
昔の人には有名な回避策なのかな?

https://github.com/modernish/modernish/blob/master/README.md

> BUG_PARONEARG: When IFS is empty on bash 3.x and 4.x (i.e. field splitting is off),
> ${1+"$@"} is counted as a single argument instead of each positional parameter as
> separate arguments. To avoid this bug, simply use "$@" instead. (${1+"$@"}
> is an obsolete workaround for a fatal shell bug, FTL_UPP.)
0552デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/08(木) 06:54:13.32ID:RnVV1kHy0
modernishおもしろいね。

modernishプロジェクトはcase文の条件の先頭に開き丸括弧を付けてるのか。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05
ここには確かに開き丸括弧を前置してもいいとあるけど一般的には省略されるでしょ。
なにかこれも旧時代のシェルの不具合への回避策なのかな。
それこそGNU Bash 3.xで動かない,とか。
0553デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/08(木) 21:39:50.16ID:rJTiWJ810
>>552
やっとmodernishに興味を持ってくれた人がw
まあ俺もバグ情報とか参考になるなって程度にしか見てないんだけど

> modernishプロジェクトはcase文の条件の先頭に開き丸括弧を付けてるのか。
それ見た時、何この文法?modernishでそこまで拡張できるの?って驚いたw
単なる普通の文法だったわけだけど

> それこそGNU Bash 3.xで動かない,とか。
少なくともbash 2.03では開き括弧なくて動くよ
0554デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/08(木) 21:43:11.48ID:rJTiWJ810
話変わるけど、 foo | bar みたいなコマンドで
fooからたくさん出力されるけど、barの処理が遅いってとき
fooからの出力ってブロックされるのかな?

なんか20〜30行ぐらいでブロックされるような
出力の停止、遅延が起きてる気がする

メモリにバッファリングするだろうから、それが溢れないような処置として
そういう仕様は理解できるけど、どこかに書いてあるのかな?

シェルの仕様っぽい気がするけど、OSも絡んでいそうな気もする
0558デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/08(木) 22:21:06.03ID:rJTiWJ810
お、再現した

i=0
while :; do
i=$((i+1))
echo test$i
echo log$i>&2
done | while read line; do
echo $line
sleep 3
done


パイプの前で無限ループで標準出力と標準エラー出力に高速に出力してるとき
パイプの後ろの遅い標準入力から入力の処理によって
パイプの前の標準エラー出力への出力がブロックされてる

7400行(64KB程度?)ぐらいまでは、パイプの後ろの処理を待つことなく高速に
標準エラー出力に出力するが、それ移行は1行ずつ出力するようになった。
0560デフォルトの名無しさん (ワッチョイ db9f-9t8X)
垢版 |
2018/11/09(金) 04:14:42.04ID:hZOut+vv0
>>558
それ普通のマルチタスクOSでの動作なのでは?

昔々のMS-DOSとかのシングルタスクOSでは一回ファイルに書き出してから次のコマンドに読ませるので無限に出力するやつはだめだけどな。
0562デフォルトの名無しさん (ワッチョイ 9164-TRt+)
垢版 |
2018/11/09(金) 05:22:03.56ID:3ZHBVzZ50
いわゆる普通のプログラミング言語(PythonやCやJavaScript)に対して,シェルスクリプトを作る上で気をつけてることってある?

例えば「局所変数や局所関数が宣言できないのでなるべく使わない」とかさ。
0563デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 08:16:02.70ID:UVRb8J0Z0
>>560
並列で動作するのは当然だが、今話しをしてるのは、
一つのプロセスが、もう一つのプロセスの動作を止めるっていうところだよ

>>561
逆ね。パイプは(パイプ先が)入力を受け取るまでブロックされる
こっちはどばどばーっと出し続けようとしてるのに、相手が受け取ってくれないから
出せなくなるんだよ。って話
0565デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 08:36:27.28ID:UVRb8J0Z0
>>562
個人的な特殊な状況下で気をつけてることならたくさんあるんだけどな
パイプを(なるべく)使わないとかwww

そうさなぁ、例えば意図せぬエラーで落ちるように、set -eを使う場合は
挙動をよく理解して使うこととかかな

set -eは戻り値がエラーになった時点で中断される

set -e
foo() { echo foo begin; bar; echo foo end; }
bar() { echo bar begin; baz; echo bar end; }
baz() { echo baz; false; }
foo

これを実行すると、foo -> bar -> baz の呼び出しの流れが、bazのfalseで中断されて
foo begin
bar begin
baz
と表示されるんだが

foo の代わりに if foo; then :; fi と実行すると
なんと、foo end も bar end も表示されるんだよ

つまり foo を if や && や || と組み合わせて使うと、エラー中断機能が無効化される
だから、比較関数みたいに if foo; then という使い方を想定している関数は
中でしっかりエラーチェックをしておくこと

他の言語の例外みたいに考えてはいけない
0566デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 08:39:06.36ID:UVRb8J0Z0
↑ これが理由で、set -eは使うな派もいるらしいねw

>>562
> 例えば「局所変数や局所関数が宣言できないのでなるべく使わない」とかさ。

俺は訳あってそうしてるけど、特定のシェルに限って良いのなら
localもしくはtypesetで局所変数使えるよ

ただし、他の言語と違ってレキシカルスコープじゃなくて
ダイナミックスコープなので注意が必要
これも気をつけていることかな
0568デフォルトの名無しさん (アウアウウー Sa05-ahuQ)
垢版 |
2018/11/09(金) 09:08:37.30ID:JsSTi+Gxa
>>563
パイプが詰まってんだから停止させるしか方法ないと思うが?
バッファ大きくしても出力側が速いなら何れ突っ掛かる事になるよね。
0571デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 09:24:33.15ID:UVRb8J0Z0
ん? あぁ、質問はコレね

> メモリにバッファリングするだろうから、それが溢れないような処置として
> そういう仕様は理解できるけど、どこかに書いてあるのかな?
>
> シェルの仕様っぽい気がするけど、OSも絡んでいそうな気もする
0572デフォルトの名無しさん (アウアウウー Sa05-ahuQ)
垢版 |
2018/11/09(金) 09:31:46.72ID:JsSTi+Gxa
どう考えてもOSの仕様だろう。
0573デフォルトの名無しさん (ワッチョイ 9164-TRt+)
垢版 |
2018/11/09(金) 09:40:49.31ID:3ZHBVzZ50
>>565
ありがとう。set -eは鬼門だね。前に棘かなにかでも纏められてた。

ところで パイプ使わないのはどうしてだ?
シェルスクリプトは入出力指向なんだから積極的にパイプを活用すべきでは。
0574デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 09:55:47.54ID:UVRb8J0Z0
>>573
パイプ使わないのはシェルスクリプト内部で完結する場合の話ね
外部コマンドとのインターフェースでは使う

(内部で)使わない理由は変数の共有がやりづらいから
ま、これは特殊な事例なのでw
0576デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 10:31:29.63ID:UVRb8J0Z0
> ああ。たしかにパイプ越しに変数を参照させようと思ったらexportして環境変数にしなくちゃらんもんな。

もうちょっと説明すると

foo() {
 output | bar | baz
}

fooで見えてる変数を、bar, bazに見せるのは簡単なんだよ。
exportしなくても見せられる。

outputが出力する1行をbarが解析して変数に入れたとして、その変数を
bazで見ることはできない(barでexportしても無理)
bazが複数行の入力を集計した結果の変数をfooで見ることが出来ない。とかね

1データを1行に詰め込めればパイプ経由でのデータ受け渡しは可能だが
それができないデータだと難しい

他の言語でやれって? それをシェルスクリプトでやらなきゃいけないというのが個人的な特殊な状況下というわけ
0577デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/09(金) 17:10:16.74ID:3ZHBVzZ50
シェルスクリプトでそのコマンドが実行された行数を取得する方法ってあるかな。
#!/usr/bin/env bashにすれば${LINENO}変数にその位置が格納されてるので簡単なんだけど
やっぱりもうすこし汎用的な方法で実現したい。
0578デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 19:41:43.60ID:UVRb8J0Z0
>>577
LINENOしかないよ。ただしご存知の通りLINENOは使えないシェルがある。
dashなんか機能的には搭載されてるがdebianなどでは無効にされてるというw

更にシェルによっては関数呼び出しを行った時にソースコードの行数ではなく
関数の頭からの行数になっていて、それも0から始まるものと1から始まるものがある

まともに使えるのはbashだけかな
0579デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/09(金) 20:27:42.80ID:3ZHBVzZ50
>>578
だよね〜。ファイルの中での自分の位置を調べるのはシェルスクリプトでは無理っぽいね。
Cのassert()関数みたいなのを自作したかったんだけど 機能が落ちるのは嫌だな(もういいけど)

ああ ちなみに
> 関数呼び出しを行った時にソースコードの行数ではなく
> 関数の頭からの行数になっていて
これGNU Bashのことを言ってるのなら関数じゃなくて別名にすればO.K.だよ
0580デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/09(金) 21:02:47.30ID:UVRb8J0Z0
>>579
シェルスクリプトの世界にJavaScriptのトランスパイラ技術が導入されて
ソースコードの一行一行にLINENOを設定するコードを埋め込めば
解決できると思うんだが、流石にそれをやろうとする人はいないかなw

> これGNU Bashのことを言ってるのなら関数じゃなくて別名にすればO.K.だよ
alias?うーん、なんか別の問題がでそう。
でもbashじゃなかったと思う。

前に調べたときのコードを見てみたが、
関数の頭からの行数になるのはzsh, dash, busybox ashで
zshは0から始まる。他は1から始まる。bashとkshはソースコードの行数で取れる。
バージョンは詳しく調べてないから多分古いやつは使えなかったりすると思う

なので他のシェルでエラーが起きたら、bashで実行してエラーの行番号を調べたりしているw
0581デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/10(土) 09:07:56.28ID:lBOHSSIo0
たとえばシェルアーカイブってPOSIXシェルでも可能だよね。
ああいう感じで自分が含まれるファイルを自分で走査できるんなら
行位置も取得できないかなぁと思ったんだよね……。

しつこいけどシェルスクリプト版のassert()関数が欲しい っていうか作りたいんだよねぇ
0582デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 09:34:29.76ID:8OkJCHKT0
>>581
assertだけなら簡単かもしれないな。

assert関数の中で全てを処理するのは難しいと思う。自分のスクリプト名でさえ取得できない場合があるから
仮に取得できたとしても、何かしらのマーカーがないとどのassertかが区別できない。
(全ててのassertに区別できるマーカーを入れるっていうのなら可能だけどw)

前提としてLINENOが取得できないのはどうしようもないのでコード変換を行なう

foo() {
  asesrt [ i -gt 0 ]
}

みたいなコードがあったら以下みたいに、行番号を埋め込むプログラムを作る
(ファイル名もあったほうが良いかもしれない)

foo() {
  asesrt 2 [ i -gt 0 ]
}

これはPOSIXシェルスクリプトの範囲でもできる。一行づつ読んでパターンにマッチしたら変換するだけ
(複数行文字列やヒアドキュメントがあったら面倒だけど、対応してませんでもいいと思う)

あとは以上の変換処理を行って実行するラッパースクリプトを作って実行する
変換したコードはevalもしくはシェルにパイプで流し込むことで実行できる。
0583デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 09:39:54.31ID:8OkJCHKT0
あー、そうか、assertか、ならデバッグ時のみしか有効じゃなくていいな。

なら、普通にスクリプトを実行したときは、
何もしないassert関数になって、

debug.sh script.sh みたいにしたら、
コード変換を行ってから実行すれば良いのか

意外と自然な感じで作れそうw
0585デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/10(土) 16:43:37.38ID:lBOHSSIo0
色々考えてくれてマジでありがたい
確かにassert()関数はデバッグの時だけ有効になればいいから外部からスクリプトファイルを操作するという方法も
なんら不自然ではないな。
C言語のようにNDEBUG変数の有無によって処理を分けようとしてたけど
そっちのほうが柔軟な処理ができるのでいいね。

ていうかC言語と違ってシェルスクリプトのなかで安全・確実に変数を取り扱うのは厄介だから
寧ろNDEBUG変数は害悪ですらあるなw
0586デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 19:36:31.81ID:8OkJCHKT0
>>585
何もしないassert関数と書いたが、コメントの形でassertを入れるのはどうだろう?
これなら関数呼び出しすらないので、(わずかな)パフォーマンス低下も発生しないし
仮にスクリプト内でassert関数を使っていても問題ない
assert有効時は、長い名前に変換すれば良い
0587デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 19:38:01.66ID:8OkJCHKT0
あと、デバッグモード、assert関数有効時だけど、終了ステータスを変えてしまうことに注意な

foo() {
  false
  # assert [ なんちゃら ]
  echo $?
}

という場合、本来はechoで1と表示されるけど、単純にこのように変換してしまうと、
assert有効時に$?がassertの結果になってしまう
だから変換後はこんな感じかな? ||:を使うことでset -e状態でも落ちなくできる

foo() {
  false
  assertooooo 3 [ なんちゃら ] ||:
  echo $?
}

assertooooo() {
  EXIT_STATUS_BACKUP=$?
  LINE_NUMBER=$1
  shift
  if "$@"; then
    return $EXIT_STATUS_BACKUP
  else
    echo "エラー $LINE_NUMBER" >&2
    exit 1
  fi
}
0588デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 19:42:53.17ID:8OkJCHKT0
> 仮にスクリプト内でassert関数を使っていても問題ない
ちょっとわかりづらかったな

スクリプトでassertという名前の関数を別の用途で使っていた場合ってことね
0591デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 20:03:55.71ID:8OkJCHKT0
あー、バカだ

assertooooo 3 [ なんちゃら ] ||:
じゃなくて
assertooooo 3 [ なんちゃら ] &&:
だった

上はset -eでも落ちなくし、かつ終了ステータスを問答無用で0にする方法(エラーの時 : を実行する)
下がset -eでも落ちなくし、かつ終了ステータスはそのまま保つ方法
0592デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/10(土) 20:17:00.01ID:lBOHSSIo0
>>590
例えば
ファイルの名前がwhizprog.shだったとして
test "$( ps -p $$ -o 'comm=')" = 'whizprog.sh'
↑これが失敗・失敗しないで判定できるんじゃね?
尤もこれはシバン#!/bin/shというPOSIX未定義の構文を使ったばあいで
シバンを書いてないと使えない手だけど。
0593デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 20:22:22.65ID:8OkJCHKT0
>>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
0594デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/10(土) 20:50:01.93ID:lBOHSSIo0
>>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 "$@"
0595デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 21:06:21.14ID:8OkJCHKT0
update.sh script.sh でassert行の行番号を更新して上書き保存するってのもありかもw
それなら.コマンドの先も対応できる。いちいち更新しないといけないのが面倒だけど
0596デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/10(土) 21:44:08.29ID:lBOHSSIo0
更新するコマンドを別に作るんじゃなくてデバッグ時に更新も行うようにすれば(結局 手間は同じだけど)
だってデバッグする時ってその直前に必ず行番号やらを更新したいでしょう。
0598デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/10(土) 22:33:00.25ID:8OkJCHKT0
>>596
まあ、そうなるよねw
まあ、方針次第だな

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

ちなみにどれだったか忘れたがシェルスクリプトの文法を
解析するやつ(ASTを作る)はすでにある
それを使えばそんなに難しくはないと思う(とは言えやったことはない)
0600デフォルトの名無しさん (ワッチョイ b903-wpdm)
垢版 |
2018/11/10(土) 23:18:28.98ID:7gTt1pZ+0
もうシェルでなにしたいんやおまえ
0605デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/11(日) 00:30:20.21ID:PRctJ18Z0
>>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).
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_04
0606デフォルトの名無しさん (ワッチョイ b903-wpdm)
垢版 |
2018/11/11(日) 00:55:22.01ID:TQKm/8h90
>>604
なんでワイに聞くねんwバカなんかおまえ?
0608デフォルトの名無しさん (ワッチョイ b903-wpdm)
垢版 |
2018/11/11(日) 01:00:58.12ID:TQKm/8h90
日本語が大丈夫ってどおゆう意味や?
0610デフォルトの名無しさん (ワッチョイ b903-wpdm)
垢版 |
2018/11/11(日) 01:09:59.72ID:TQKm/8h90
慌れるて日本語あるんか?ちょっと落ち着けやw
0612デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/11(日) 12:28:16.92ID:PRctJ18Z0
C言語ではなくシェルスクリプトでシグナルって活用してる?
kill(1)ユーティリティの-s KILLオプションくらいしか使ったことがないので
いまいち便利さが分からない。
利用者定義シグナルSIGUSER1とか 使いこなせたらシェルスクリプトでできることの幅が広がりそう
0613デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/11(日) 12:33:00.83ID:Tyd11AGx0
CTRL-Cされたときとかプログラム終了時に
作業ファイルを削除することぐらいかなぁ

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

サービスなんかだとシグナル送ったら設定ファイル再読込したり
ddだったら進捗状況表示したりするね
0614デフォルトの名無しさん (ワッチョイ db9f-ki2E)
垢版 |
2018/11/11(日) 22:34:54.73ID:0F8Q4Ddx0
>>612
終了処理をちゃんとやらないといけないような処理の場合に trap 使ってシグナルに対して
特定の変数を 1 にするだけとか、そういうやり方で終了処理後にその変数見て 1 になって
いたら exit みたいな感じでシグナル利用するな。

後は普通に kill で他のプロセス終了させたい場合。pkill 使う事もある。
0615デフォルトの名無しさん (ワッチョイ 9164-TRt+)
垢版 |
2018/11/12(月) 12:58:25.45ID:JkRQG90v0
実行してるシェルスクリプトに行番号を付けるのさ,
PS4変数にn=$((n+1))みたいなのを入れてset -xとやればうまくいくかな と思ったんだが無理っぽいな。
どっかで無限ループして何も出力されないw
0620デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/14(水) 16:18:09.15ID:P8pvRdrO0
>>619
まあ俺も使い捨てのスクリプトでは使うけど
ただPOSIX 2017では
x=3; x=$((x+1))
↑これすら正常に動くとは定義されてないんだよね
ただ単に
x=3のとき$((x))は$(($x))と「同じ値になる」とだけ。
だから例示されるスクリプトでも
x=$(($x + 1))
みたいに書かれてる。
0624デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/14(水) 17:18:05.78ID:Da4Ohzbn0
あ、なるほど。わかった。

${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))が正しいようだね
0625デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/14(水) 18:02:30.17ID:Da4Ohzbn0
間違いっていうのは仕様違反って意味じゃなくて
算術演算をするなら$をつけないのが正しいって意味ね。

算術演算の前に$とかコマンドが展開されるっていうのも
仕様なのでそれも書いたとおりに動作する
0626デフォルトの名無しさん (オッペケ Srcd-3Pmj)
垢版 |
2018/11/14(水) 19:06:25.03ID:vF6ts/2/r
大きなファイルがいくつも入ったディレクトリのmvして分かったけど
ファイルがいくつあっても全部のcpが終わったあとにrmされるんだね
てっきり1ファイル毎かと思ってた
0627デフォルトの名無しさん (アウアウウー Sa05-pmE1)
垢版 |
2018/11/14(水) 19:23:07.48ID:bryEJhFFa
>>626
途中で中止した時に移動先を削除するだけで済むからじゃないかな。
0628デフォルトの名無しさん (ワッチョイ 9164-30bX)
垢版 |
2018/11/14(水) 19:34:11.25ID:P8pvRdrO0
>>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 ))がエラーになるのが怖いので。
0630デフォルトの名無しさん (ブーイモ MMb3-D3se)
垢版 |
2018/11/14(水) 21:50:05.93ID:D6nmDs23M
$(())が展開できるものは限定されていて、$((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
これは$(())の中だけはx=$xであると解釈できなくもないけど、算術演算をするなら$をつけないのが正しいとは読めないな。
0631デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/14(水) 22:59:44.88ID:Da4Ohzbn0
> $((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。
一つあれば十分じゃん。逆に展開されない根拠はないんだし

そもそも ${expression} と $((expression)) という記述があるんだから
expressionの中は同じ意味のはずだろう
0632デフォルトの名無しさん (ワッチョイ 9398-Nrm4)
垢版 |
2018/11/14(水) 23:06:12.49ID:Da4Ohzbn0
> どっかで$(( x + 1 ))がエラーになるのが怖いので。

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

それ関連で注意が必要なのは $(($#-1))
zshだと81になる。
0636デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 11:23:09.13ID:gWaB1LhD0
http://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じゃない。
他の言語では変数名が$で始まるものがあるが、シェルスクリプトにおいて、
$は、パラメータ展開、コマンド置換、算術展開等を行うための記号だって書いてあるだろ?

特殊変数の説明だって、$@じゃなくて@、$*じゃなくて*、$#じゃなくて#、$$じゃなくて$ と書いており
変数名とは最初の$は含まれない部分だってことが読み取れるだろ
0639デフォルトの名無しさん (ワッチョイ 9564-uG0O)
垢版 |
2018/11/15(木) 12:27:06.72ID:sJsqi8La0
>>638
発端は>>620
> > x=$(($x + 1))
>
> shellcheckではそれ不要だから外せって言われるよ?
> shellcheckが完璧だとは思わないけど、
> あえてそうしてるんだからPOSIXだと思うんだけどなぁ
これなんだが。
つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。
x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。
ただ,POSIXには前者の記載はあって後者はないから,
shellcheckの「後者にしろ」っていう判定は絶対におかしい。
0640デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 12:34:01.42ID:gWaB1LhD0
shellcheckは間違いだから不要と言ってるんじゃなくて、
意味がないから不要って言ってるんだよ。

お前コードチェックツールで変数が使われていませんって
指摘されたら、文法上は間違ってねーよって文句言うのかよ?
0642デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 12:36:35.34ID:gWaB1LhD0
> shellcheckの「後者にしろ」っていう判定は絶対におかしい。

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

もうちょっと落ち着けよ。お前否定されたらすぐカッとなるだろw
0643デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 12:41:58.45ID:gWaB1LhD0
> つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。
> x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。

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

そして後者は実際に動く
0645デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 13:35:59.93ID:gWaB1LhD0
だから前者が動かないなんていてないだろ
前者に$(($x -1))の$xの$が意味がないから
(POSIX準拠で問題がない)後者の方が良いって話であって

たまにいるんだよな。誰かにより良いコードの提案をされたら
俺の書いたコードが間違っているっていうんか、仕様どおりだ!って怒るやつ
仕様違反だとか間違ってるかどうかの話なんかしてない
(正しいコードの範囲で)より良いコードにしましょうってことなのに
0646デフォルトの名無しさん (ワッチョイ 9564-uG0O)
垢版 |
2018/11/15(木) 14:51:03.70ID:sJsqi8La0
すまん。怒らせるつもりは毛頭なかったんだわ。
ただ,「標準でははこうなってますよ」と示しただけ。
まあちょっと俺の言い方もキツかったな。
言い訳させてもらうと,今までPOSIXの仕様書も読まずに
$(())算術展開は``に書き改めるべきとか,その割に[[文を使ってたりだとか
そういう人間と多く議論してきて,こっちもかなり厳密さを求めるようになってしまっていた。
正直なところ仕様違反でもほとんどの環境で動くなら,別にそっちを使ってもいいかもね。
0648デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/15(木) 15:08:37.91ID:gWaB1LhD0
$(($x - 1)) と $((x - 1)) のどちらも仕様違反じゃないのに
$(($x - 1)) が動くってことは、 $((x - 1)) は仕様違反に違いニダ!って
どういう思考回路なんだろ?

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

お前がPOSIXの仕様を読んでいない相手と議論してきたとか知らんが、
お前なんかよりも shellcheck の作者の方がよっぽどPOSIXの仕様に詳しいだろうよ
なにせシェルスクリプトの構文解析機を作ってるし、
世界中から間違いがあったら指摘される立場にあるんだから
0650デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/16(金) 18:15:57.23ID:4Z/2Zn+la
Windows用の busybox.exe なんてものがあることをたった今知った。
こんなのあったんだな。

まあしかしよくよく考えてみればWindows用のgccとかのコンパイラでコンパイルすれば良いだけだからさほど凄いことではないか。
0651デフォルトの名無しさん (ワッチョイ 9564-ddua)
垢版 |
2018/11/16(金) 20:52:55.20ID:0Fk/0vf10
case "$(<なにかの処理>)" in
'A'|'aaa') echo 'B' ;;
*) echo "$(<なにかの処理>)" ;;
esac
みたいな文でさ,<なにかの処理>を(できれば変数とか使わずに)一つにまとめたいんだけど
できるかな。

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

RESULT="$(<なにかの処理>)"
case "$RESULT" in
'A'|'aaa') echo 'B' ;;
*) echo "$RESULT" ;;
esac
でもいいんだけどな〜んか無駄がある気がするんだよね……近い場所で二回同じ変数使ってるっていうのが。
0652デフォルトの名無しさん (アウアウウー Sa91-AAco)
垢版 |
2018/11/16(金) 21:08:59.95ID:4Z/2Zn+la
気のせい
0654デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/16(金) 23:43:45.38ID:HodhQ/sE0
いい感じのバカっぽさw
0656デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 00:41:14.93ID:eQWBxdMf0
なんか悔しかったんかなw
0657デフォルトの名無しさん (ワッチョイ ca98-9Fzi)
垢版 |
2018/11/17(土) 01:07:52.12ID:LhPQgZnG0
>>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を使った変数のローカル化はダイナミックスコープなのでそれとも違う
0660デフォルトの名無しさん (ワッチョイ 56be-JwVn)
垢版 |
2018/11/17(土) 18:51:09.82ID:ikDL4PRg0
ちょっと力を貸してほしい
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はパラメータを取って、--以降はオプションとして解釈されないっていうやつ。
ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。
動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。
0662デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 19:19:32.18ID:eQWBxdMf0
エクセルマクラーと同じ病気やね
0664デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/17(土) 20:09:39.20ID:DG9kgnl30
getoptやgetoptsは短いオプションがパラメータを取るとき、
短いオプション以降がパラメータとみなされるようだ

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

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

>>660の仕様だと、aとcがパラメータを取るとき
-abcde VAR をどう解釈して良いのかわからない
-abcde VAR1 VAR2 とすりゃいいのかもしれんが、
これは人間にとってわかりやすいんだろうか?
0665デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 20:18:41.59ID:eQWBxdMf0
バカは考えるだけムダやぞw
0667デフォルトの名無しさん (ワッチョイ 56be-JwVn)
垢版 |
2018/11/17(土) 20:45:00.33ID:ikDL4PRg0
つまり
-aVAR
-xyza VAR
みたいなのは許容して
-axyz VAR
は許容しないようにすればいいのかな。

まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw
0669デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 21:33:05.69ID:eQWBxdMf0
>>668
提示てwバカにされとんのやぞおまえw
0671デフォルトの名無しさん (ワッチョイ 3903-k2K5)
垢版 |
2018/11/17(土) 22:57:50.85ID:eQWBxdMf0
>>670
そういったシェルはそもそも必要とされとらんのやぞ

出来るからといってやりすぎになるのはバカの悪癖やw
改めた方がええでおまえw
0674デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 00:47:33.69ID:tOYW/MHy0
>>667
遅い原因はcutを使うからなんだけどねw

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

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

>>670
よし、作るんだ!

>>673
作者「なかったから自作したんやで」
0676デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 01:17:46.87ID:tOYW/MHy0
余計な変数を消したり、被演算子の部分を外出ししたりした
https://paste.ubuntu.com/p/p7VwzJZ8Hv/

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

全体を把握しやすくするためにあえて一行にしたりして短くしている。
最終的にこのような書き方をするというわけではなくて一時的な処置
0677デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 01:19:40.72ID:tOYW/MHy0
あと、これもしたな。こんな部分、あとでどうとでもなるんだからここでやることじゃない

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

長いオプション1: --long-opt
長いオプション2: --opt-req-par; 'foo bar'
0682デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 02:04:33.63ID:tOYW/MHy0
とりあえずは大まかな仕様は変えてない
https://paste.ubuntu.com/p/SQFnqmCJs2/

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

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

1文字オプションの分解の所がやはり面倒だな。
知らないオプションはエラーにするようにすれば、
1文字を抜き出す必要はなくなるかもしれないが
0685デフォルトの名無しさん (ワッチョイ 56be-JwVn)
垢版 |
2018/11/18(日) 17:17:51.79ID:Fz4U8sel0
>>674
オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。
rm -i -f
としたときに「確認する」のではなく「強制的に消し」たいので。
alias rm='\rm -i'
の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?
0687デフォルトの名無しさん (ワッチョイ 56be-JwVn)
垢版 |
2018/11/18(日) 17:23:02.81ID:Fz4U8sel0
連投すまん。
ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで,
そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。
だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。
0688デフォルトの名無しさん (ワッチョイ 56be-JwVn)
垢版 |
2018/11/18(日) 17:35:21.66ID:Fz4U8sel0
${numbar:-0}←これすごいアイデアですね。
シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、
「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。
0689デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 17:59:50.57ID:tOYW/MHy0
>>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を使うよりも遅くなることはないだろう
0690デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/18(日) 18:05:11.85ID:tOYW/MHy0
>>668
今回は長いコードが邪魔だったので使ったけど、
例えばnumberが環境変数としてexportされていたりしたら
おかしいことになるので最初に初期化するほうが良いけどね
毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし

それよりも、所見では使い道がわからない
${var:+value}の方が凄いアイデア
シェルを作った人はよくもまあこんな応用例が
高いものを作ったもんだと思うよ
0692デフォルトの名無しさん (ワッチョイ 9564-ddua)
垢版 |
2018/11/21(水) 17:53:42.80ID:OLor19Fe0
しつこくてすまん。
シェルスクリプトの引数解析の話なんだが
(-cが引数を取るオプションとして)
「$ somecmd -c -- --not-a-opt」
っていうコマンドラインにおいて,
・「--」を-cオプションの引数として見るか
・「--」はいかなる場所(オプションの引数の位置だとしても)においても
 以降が被演算子であることを示すものであると見るか
どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で
エラーになる。
0697デフォルトの名無しさん (ワッチョイ 8698-9Fzi)
垢版 |
2018/11/21(水) 21:01:13.07ID:UM5ff+tU0
>>696
はい。どうも。 exprとか引数が何かしらの式であるものは
演算子以外の部分が被演算子(オペランド)になることはありえるけど
なんでもかんでもオペランドなわけではないよね
0699デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 12:14:20.49ID:I8hvszb00
Qiitaで知ったけどこの構文便利だね。
${VAL+:} false
↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。
今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。
コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。

ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。
0702デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 14:31:59.62ID:I8hvszb00
>>700
「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?

いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して
testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。
君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。
0703デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 14:49:43.89ID:I8hvszb00
dashでも[はシェル組込だね。実際testユーティリティを外部コマンドに頼ってるシェルって今現在存在しているのだろうか。
Heirloom shellあたりだとありえそう(試してないけど)
0704デフォルトの名無しさん (ワッチョイ cf98-/G1A)
垢版 |
2018/11/24(土) 15:54:11.31ID:emfrr2Lm0
> 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな?
ぐぐればコレばっかり見つかるはずだが?

> testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
全てのシェルで [ はビルトインだ
シェルに組み込まれていないというものがあれば教えてくれ
0706デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 17:26:54.56ID:I8hvszb00
>>704
> ググればこればっかり
ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。
> 全てのシェルで[はビルトイン
test(1)ユーティリティは,あくまでPOSIXにおいて組込ユーティリティじゃないという話。
根拠はこれ: http://pubs.opengroup.org/onlinepubs/9699919799/idx/sbi.html
> シェルに組み込まれていないというものがあれば教えてくれ
ご査収ください→https://www.unix.com/man-page/v7/1/sh/#neo-man-page-output
0708デフォルトの名無しさん (ワッチョイ e398-/G1A)
垢版 |
2018/11/24(土) 17:38:22.47ID:b7tmfxF40
> ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。

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

"${VAR+x}"だと約 3,410,000 件
0709デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 17:41:59.00ID:I8hvszb00
ちなみに「すべてのシェル」と言うくらいなのだから,
主要であり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: http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands
dash: http://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
0710デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 17:44:33.96ID:I8hvszb00
>>707
以下>>704の書き込みを引用
> > testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。
> 全てのシェルで [ はビルトインだ
> シェルに組み込まれていないというものがあれば教えてくれ

ということでfalse(1)ユーティリティの話ではなく
test(1)ユーティリティがシェル組込みかどうかという話でした。
0713デフォルトの名無しさん (ワッチョイ e398-/G1A)
垢版 |
2018/11/24(土) 17:50:38.66ID:b7tmfxF40
いや、俺が言ったことを復唱されてもこまるんだがw

ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ
builtinやtypeがないシェルもあるからね
0715デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 18:05:17.83ID:I8hvszb00
>>712
大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして
そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので
速度は${VAR+:}のほうが上。
0716デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 18:06:48.53ID:I8hvszb00
>>713
typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。
つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。
0717デフォルトの名無しさん (ワッチョイ e398-/G1A)
垢版 |
2018/11/24(土) 19:13:13.38ID:b7tmfxF40
へー、poshはPOSIX互換じゃなかったのか

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

って書いてある割に大したことないな
0718デフォルトの名無しさん (ワッチョイ 8fbe-pqc8)
垢版 |
2018/11/24(土) 20:44:49.31ID:I8hvszb00
まあ ここまでPOSIX POSIX連呼しときながらアレだけども,
別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw
poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。
実際,俺は使っていないものの,同級生にはfishを勧めてる。
0720デフォルトの名無しさん (ワッチョイ e398-/G1A)
垢版 |
2018/11/24(土) 20:57:06.31ID:b7tmfxF40
それじゃ俺も言っておかなきゃいかんのか?

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

だから、dash、(busybox)ash、bash、ksh あたりは対応必須で
zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは
デフォルトシェルとして採用されている事例があるのかわからんが
0721デフォルトの名無しさん (ワッチョイ e398-/G1A)
垢版 |
2018/11/24(土) 20:58:50.94ID:b7tmfxF40
俺は現実主義なんでね。標準とか仕様がどうこうよりも
現実としてそれは選択肢にならないのであれば、選択肢にならないし
非標準でも選択肢としてなり得るのならそれを使う
0724デフォルトの名無しさん (ワッチョイ ffb3-8s0F)
垢版 |
2018/11/25(日) 12:05:00.87ID:Yow09MRJ0
>>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)。何千回も実行する様なケース
なら違いが分かるかも。
0728デフォルトの名無しさん (ワッチョイ ffd2-8s0F)
垢版 |
2018/11/25(日) 13:54:00.21ID:eaHucPl10
なんやこのバカwwww
0730デフォルトの名無しさん (ワッチョイ c364-m15j)
垢版 |
2018/11/25(日) 18:36:53.00ID:74eaLfxV0
多分,なんでもPOSIX POSIXと言うので,からかってやろうとしたんだろう。
「お前の主張は全部POSIXに起源があるのか?」ってな。
まあ結果としてはネタにマジレスの嵐だった訳だがw
0731デフォルトの名無しさん (オッペケ Sr47-ZXAZ)
垢版 |
2018/11/26(月) 12:25:16.95ID:RdZe26lCr
必死すぎる言い訳のせいで逆にひかれてしまったパターンw
0732デフォルトの名無しさん (アメ MMe7-9KmN)
垢版 |
2018/11/26(月) 12:32:05.28ID:mqDjQZG/M
とっても惹かれます
0734デフォルトの名無しさん (ワッチョイ c336-CvEX)
垢版 |
2018/11/26(月) 17:46:57.26ID:M+tccdiG0
echoでログを残そうとしています。
echo "メッセージ" > ログファイル

で、ログファイルはNASに保存しようと考えているのですが
NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに
cshだと、echoのとこで止まってしまいます。
止まらないようにする方法とかないですか?
0736デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ)
垢版 |
2018/11/27(火) 00:51:26.43ID:IxTjeZ9T0
>>734
NFSならマウントオプションである程度はなんとかなるのでは?
Windowsの共有(cifs)の場合は知らない。しかし何かオプションあると思うけどね。
0741デフォルトの名無しさん (ワッチョイ d398-/G1A)
垢版 |
2018/11/28(水) 12:41:41.17ID:V/2Czdkr0
所詮、ネットワークを介したファイル共有だからね
ディスクはアクセスできない = 故障 と考えていいけど
ネットワークは一時的な切断やエラー、大きな遅延が想定される
だからリトライやタイムアウトといった処理を行う

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

だから(NFSの設定により)ネットワーク通信が正常に完了
できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態)
もしくは一時的な接続不良でエラー終了したりする
0742デフォルトの名無しさん (ワッチョイ c364-m15j)
垢版 |
2018/11/28(水) 20:10:37.32ID:N04UITTm0
シェルスクリプトの関数の名前の直後の括弧って あれはshに
「これは関数の名前ですよ」って教えるためのものっていう認識でOK?
foo() {
echo foo
}
↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと
初心者ながら思ったんだけど そういう訳でもなさそうだし。
0744デフォルトの名無しさん (アウアウウー Sa27-ml8p)
垢版 |
2018/11/28(水) 20:22:26.38ID:wHjpMIAFa
引数は $1, $2 とかで受け取る。
呼び出す側は普通のコマンド実行のように書く。
0746デフォルトの名無しさん (ワッチョイ db64-VZvV)
垢版 |
2018/11/29(木) 13:01:23.15ID:Msn7clch0
>>745
なるほど。
「(」はサブシェルの開始だと思ってたけど
そうでもないんだね……。
シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw)
対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。
0751デフォルトの名無しさん (アメ MMff-egAi)
垢版 |
2018/11/29(木) 16:11:55.77ID:qd4rCcG0M
wwwww
0752デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/29(木) 19:19:50.88ID:8tueZiBHa
そしてあらゆる言語が気に入らず、新たな言語がまた一つ作られるのであった。
0753デフォルトの名無しさん (アメ MMff-egAi)
垢版 |
2018/11/29(木) 19:39:24.56ID:qd4rCcG0M
− 世界には1,400もの競合するプログラミング言語があった −

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

やがて…

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

https://imgs.xkcd.com/comics/standards.png
0756デフォルトの名無しさん (ワッチョイ 9ad2-uhYH)
垢版 |
2018/11/29(木) 20:45:38.03ID:C+POVdju0
(中二なんかな・・・)
0758デフォルトの名無しさん (ワッチョイ 9ad2-uhYH)
垢版 |
2018/11/29(木) 22:17:13.73ID:C+POVdju0
>>757
そおやってすぐ他人に頼ろうとするからいつまでたってもクズなんやおまえ
0760デフォルトの名無しさん (ワッチョイ b69f-BnCY)
垢版 |
2018/11/30(金) 08:21:31.28ID:ShAjvwZw0
目的を見失ってるよね
道具であるはずの言語そのものを作り出すってのは
だからって、なんでもアセンブラってわけにもいかないが
0761デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 09:15:03.33ID:vx8Iixcxa
タイヤは永遠に発明され続ける。
0763デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 09:38:04.79ID:vx8Iixcxa
あ、そうか。まあどっちでもいいが。
0765デフォルトの名無しさん (ワッチョイ 2398-r3MB)
垢版 |
2018/11/30(金) 09:53:55.88ID:pEng5xY00
発明、改良と生産は違う

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

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

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

多くのものは改良されて続けているが、改良するためには
まず生産能力が必要。同じものを作れなければ改良はできないだろう
0766デフォルトの名無しさん (ワッチョイ 2398-r3MB)
垢版 |
2018/11/30(金) 10:02:51.33ID:pEng5xY00
今の言語は最高とまでは言えない。
いつしか高級言語への進化が止まって、
単なる改良しか行われなくなってしまった

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


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

例えば、Railsなどのフレームワークのmodelsやcontrollersといったディレクトリ構造は
プロジェクトで決まっているにもかからわず、ドキュメントで書くしかない。
だからmodelsに置くべきものをcontrollersにおいたり、modelsではやっては
いけないような処理をやることが出来てしまう。コンパイルエラーにも実行時エラーにもならない
0768デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 12:29:51.33ID:vx8Iixcxa

高級言語が
必要
0769デフォルトの名無しさん (オッペケ Sr3b-xhs3)
垢版 |
2018/11/30(金) 12:30:21.78ID:+/lt4tPpr
タイヤと
車輪は
同じもの
0770デフォルトの名無しさん (アウアウウー Sa47-2q9Y)
垢版 |
2018/11/30(金) 12:47:31.33ID:vx8Iixcxa


止めよう
0776デフォルトの名無しさん (オッペケ Sr3b-xhs3)
垢版 |
2018/12/01(土) 07:47:52.11ID:U3mK8vlPr
下ネタはもっと堂々と言わな逆にいやらしく感じるで
0779デフォルトの名無しさん (オッペケ Sr3b-xhs3)
垢版 |
2018/12/01(土) 12:34:48.97ID:U3mK8vlPr
さほど盛り上がっとらんやろw
人と関われよw
0783デフォルトの名無しさん (ワッチョイ db64-VZvV)
垢版 |
2018/12/04(火) 18:22:49.34ID:VVlGsdy50
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より遅い筈。
0786デフォルトの名無しさん (ワッチョイ 938a-+wPc)
垢版 |
2018/12/06(木) 00:12:43.36ID:pQ33EIUW0
>>783
http://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html#lbAE
-Olevel
1
これはデフォルトの最適化レベルであり、伝統的な動作に当たる。 式を並べ替えるとき、ファイル名にのみ基づいた検査 (たとえば、 -name や -regex) が先に実行されるようにする。
0788デフォルトの名無しさん (ワッチョイ 9164-5svG)
垢版 |
2018/12/06(木) 15:10:37.27ID:cC0kDT7D0
引数に一律にコマンドで操作を施したあと、それらをもう一度引数として扱うにはどうすればいいかな
$ 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を使う普通のやりかたではループを抜けた後に$@が空になってしまう。
どうにかして引数の構造を維持したいんだけども……。
0789デフォルトの名無しさん (ワッチョイ e1e1-eDAb)
垢版 |
2018/12/06(木) 16:06:47.11ID:59uVculK0
>>788
eval set -- $(printf ' "$(printf "%%s" "$%d" | tr "[:lower:]" "[:upper:]")"' $(seq $#))
0791デフォルトの名無しさん (ワッチョイ e19b-IYXC)
垢版 |
2018/12/12(水) 21:07:46.42ID:7+bnD1C/0
ここかどうかわからんのだけど、メールの添付ファイルのテキストCSV部分を切り出してDB格納しようと思ったら、
シェルスクリプトでヘッダから切り出すしかない?
0793デフォルトの名無しさん (ワッチョイ f398-2dqZ)
垢版 |
2018/12/13(木) 19:34:10.52ID:Nc8J2Ufn0
>>550
別件でググっていたら、言及しているドキュメント見つけた
${1+"$@"} で動かないシェルもあるようだ

http://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+"$@"}'で単語の分離を実行します.
0794デフォルトの名無しさん (ワッチョイ 2364-kyah)
垢版 |
2018/12/16(日) 07:48:44.86ID:AoQUSXZn0
Bashってシングルクォートの内部でない限りバックスラッシュでシングルクオートを直接エスケープできるんだな。
マニュアルにも書いてないけど他人のスクリプト見て発見した。
$ squo=\'
$ echo $squo
'
↑こうできる。Bashは楽でいいなぁ
0797デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/17(月) 19:35:33.43ID:41bJ0tdVa
\ はエスケープだし使う事はあるので特に目新しい感じはしない。

sambaでファイルサーバ作ってWindowsからもファイルが書かれるような状況だとファイル名にスペースだの括弧だの普通に入れられてLinuxでログインしている端末からだとエスケープせざるを得なかったりする。
俺の場合はそれで一文字だけエスケープはよく使う。
0799デフォルトの名無しさん (ワッチョイ 8376-2T4x)
垢版 |
2018/12/17(月) 23:45:58.91ID:LS1nUj7m0
CUI使いとGUI使いの違いだな
CUIでわざわざくそめんどくさいスペースなんぞを好き好んでは使わない。GUIではふつーにわかりやすくもなるから使う、普通に入れるのはあたりまえ
0800デフォルトの名無しさん (ワッチョイ af03-Gl1U)
垢版 |
2018/12/17(月) 23:52:42.27ID:oCmK2PVR0
めんどくさくないけど?エアプなんキミ?
0802デフォルトの名無しさん (ワッチョイ 8376-2T4x)
垢版 |
2018/12/18(火) 00:10:28.35ID:DLVg/wUV0
>>800
めんどくさいめんどくさくないはまあ人次第だけどな
CUIでなんやかんやキーボード打ってる時に、エスケープしたり"や'囲ったり、そもそもスペースはもろもろコマンドでデリミッターだったりで、めんどくさいと思うけどな
人次第ではあるが、そゆのが想像できなずにエアプと言えるのがエアプっぽいと思わなくもない
0804デフォルトの名無しさん (ワッチョイ 069f-ez/E)
垢版 |
2018/12/18(火) 03:02:35.05ID:HuP+yDtL0
>>798
もちろんファイル名には / 以外は何でもありだが Linux だけ使ってると普通はあまりそういうファイル作らないじゃない。一々エスケープしなきゃならないしシェルスクリプトで扱いづらいし。
まあ趣味の問題ではあるけどな。
0808デフォルトの名無しさん (ワッチョイ af03-PsFA)
垢版 |
2018/12/18(火) 06:17:30.36ID:mQMHvFDr0
>>802
アルファベットや数字打つのとなんら変わらんけど?
そもそもシェルには補完ゆうもんがあるんやでエアプさんw
0809デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 09:37:03.21ID:92SsvGE7a
>>805
ああ。WindowsみたいにGUIメインで使ってるの?それだけだったら面倒じゃないかもね。
0810デフォルトの名無しさん (ワッチョイ 4676-2T4x)
垢版 |
2018/12/18(火) 10:24:35.01ID:H+ovSSRq0
>>808
なにをいいたいのかイミフすぎだな、プロフェッショナルwすぎて
補完時にもバックスラッシュ打たなきゃならんだろ?打たなくていい環境なの?そういう環境もあるんだよ
なんかただ馬鹿にしたいだけのお人か?しょうもない
0812デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 12:15:53.17ID:92SsvGE7a
Tabキー押すと自動で保管したり変換したりしてくれる場合は楽かも。
楽ってだけで見た目エスケープだらけの見辛い状態にはなるが。
0813デフォルトの名無しさん (オッペケ Sra3-Gl1U)
垢版 |
2018/12/18(火) 12:25:17.53ID:Lulkb9OFr
>>810
はいはいエアプさんはそろそろお昼寝の時間でちゅよ〜w
0815デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 15:42:44.01ID:DOEC5j1K0
こいつらプログラム言語はシェルスクリプトしか使ったこと無いんか?
シェルスクリプトは珍しく引数の文字列をクォート(もしくはダブルクォート)で
くくるのが必須じゃない言語だが他の言語は殆どクォートでくくるんだぞ

"foobar" も "foo bar" も入力のしやすさに大差ないだろ
エスケープが必要なのは \ 等であってスペースはエスケープ不要なごく普通の文字なんだが
いつものことだが(シェルスクリプト以外の)経験の差を感じるよな
0816デフォルトの名無しさん (ワッチョイ 4676-2T4x)
垢版 |
2018/12/18(火) 16:01:13.36ID:kLOm0zeN0
何をお怒りか存じませんが、括らなくてもいいから括らないのが普通になるんでございますよ。当然括るのが必須なら括るのが普通。シェルスクリプトでもスクリプトファイル書くときは変数展開では普通に括るし
コマンド叩くときにはいつも括ってるの??
0823デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/18(火) 17:14:23.03ID:92SsvGE7a
WindowsだとC言語とかでパスの区切りが \ になってて毎回 \\ と入れなきゃいけないのも面倒だな。
実は / でも大丈夫だったりはするが。
0826デフォルトの名無しさん (ワッチョイ 1e81-wsuD)
垢版 |
2018/12/18(火) 17:31:06.24ID:1JLRyxNd0
パスをコマンドの引数にする必要がある場合、
例えば、hogecommand --foo_option="filepath=[パス],otheroption=bar" なんていうのがある時、
パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
シングルクォートが使えるシェルならいいが、Windowsのように使えないものもあるから、
バックスラッシュなどでエスケープしたり、コマンドが以下の様な別の区切り文字を用意していたりする。
--foo_option=[filepath="/path/with space/",otheroption=bar]

対処方法がなかなか見つからないこともあり、面倒くさいので、
自分からすすんでスペースを入れようとは思わない。
0827デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 17:46:09.05ID:DOEC5j1K0
× パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。
○ コマンドの引数の形式を適当に決めると、パースするときに一工夫がいるようになってしまう。
0828デフォルトの名無しさん (ワッチョイ 9f98-2dqZ)
垢版 |
2018/12/18(火) 17:50:36.86ID:DOEC5j1K0
ちなみに気づいていないようだから言うと
>>826はパスにスペースが入っていると困る問題ではない

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

,でsplitして、○○=を消せばいいだけだから何も困らない
この例で困るのは、パスにカンマが含まれている場合であって
スペースではない
0829デフォルトの名無しさん (ワッチョイ 1e81-wsuD)
垢版 |
2018/12/18(火) 18:16:22.51ID:1JLRyxNd0
>>828
ああ、わるい、オプションの階層が一段階足らなかった。

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

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

こんなパターンがあって、そのままではやはりパースに一工夫が必要で面倒くさい。
ちなみに、上はmpv、下はyoutube-dlで使われている。
0831デフォルトの名無しさん (ワッチョイ 2364-kyah)
垢版 |
2018/12/18(火) 18:24:29.26ID:n1+CJQ+h0
ちなみにファイル名により柔軟なのはWindowsよりも寧ろLinux(というかUnix系)だぞ。
Windowsは「con」とか「aux」とかも駄目だしバックスラッシュやコロンが含まれても駄目。
Unix系のOSは「\0(空文字)」と「/(スラッシュ)」だけが不適合で,あとは全ての文字をファイル名として
使用できる。
0836デフォルトの名無しさん (ワッチョイ af03-Gl1U)
垢版 |
2018/12/18(火) 22:59:29.33ID:mQMHvFDr0
消せるわこのエアプw
0839デフォルトの名無しさん (ワッチョイ 469f-3Kg9)
垢版 |
2018/12/19(水) 04:45:08.43ID:gf1Tua9E0
エアプってなんなん?
0841デフォルトの名無しさん (オッペケ Sra3-Gl1U)
垢版 |
2018/12/19(水) 12:42:42.59ID:guVdMf63r
>>839
おまえらの事やんw
0844デフォルトの名無しさん (ワッチョイ 2323-OVaG)
垢版 |
2018/12/22(土) 13:28:39.38ID:t1Sp89dZ0
エロ動画サーフィンで広告サイトが開いてしまったら、
デスクトップのシェルスクリプトにドラッグアンドドロップすることで
そのサイトのIPアドレスをHOSTSファイルに追加する
0846デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
2018/12/23(日) 08:08:03.20ID:W0WvAA710
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の正規表現だけでやりたい
0849デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
2018/12/23(日) 12:13:13.41ID:W0WvAA710
結局、bashの正規表現は2文字以上全置換を記述できないんですかね?
bashの正規表現でわからないことがいろいろあるんですよ。
文頭置換したいとき'^'に相当するのはどう書くかとか?
0852デフォルトの名無しさん (ワッチョイ 9b9f-q1e7)
垢版 |
2018/12/23(日) 14:18:28.55ID:nNQ759QC0
でもってこれ。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 にセット
0860デフォルトの名無しさん (ワッチョイ 23b3-yIz5)
垢版 |
2018/12/23(日) 17:15:39.87ID:YhyQsVDP0
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
0865デフォルトの名無しさん (ワッチョイ 4b9e-5YD5)
垢版 |
2018/12/23(日) 20:36:12.95ID:W0WvAA710
>>852
ほんと感謝します
ようやくすっきりしました。
そのサイトにも行き着いていたのですが、ちゃんと読めていませんでした
ありがとうございました。

>>853
trコマンドは知ってますし、今回も使いました。
今回の処理は結局、全処理c++で書き直したりもしてるんで、
他のツール使えばできるとかの情報は全く必要なく
あくまでもbash単体で処理するにはどうするかということでここで質問しました
bashでの正規表現に関する情報があまりなくて、
20年ほど前に買ったオライリーのbash本にも正規表現の記載が一切なく
bashの正規表現に制限があるならそれを教えてもらうことも目的でここで聞きました。
0869デフォルトの名無しさん (ワッチョイ c6be-DhLY)
垢版 |
2018/12/30(日) 08:42:00.02ID:btIksil/0
区切り文字を指定して文字列を分割するときに
区切り文字が一種類の場合は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
0872デフォルトの名無しさん (ワッチョイ c6be-DhLY)
垢版 |
2018/12/30(日) 10:40:37.85ID:btIksil/0
>>871
そうなんだよね……
もし+に特殊な処理をしないならば
tr '-+:T' ' '
で一発なんだけど、できないんだよ。
0887デフォルトの名無しさん (アウアウエー Sae3-hlMv)
垢版 |
2019/01/07(月) 14:59:50.50ID:01rSRjtda
test.txtの内容が
hoge
fuga
puge

で、
sed -i -e s/hoge\n// test.txt
とやったのに『hoge(改行コード)』が消えてくれないたすけて
test.txtの一行目を削除 → 2行目が一行目に、
みたいにトコロテンしたい
0891デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/07(月) 19:03:53.04ID:fnTlHl64a
grep -v もよろしく
0895デフォルトの名無しさん (アウアウウー Sa9d-KJeM)
垢版 |
2019/01/08(火) 09:33:22.38ID:LJT6VvGba
そんなあなたに rm
0896デフォルトの名無しさん (ワッチョイ 4d00-XG35)
垢版 |
2019/01/10(木) 04:57:31.17ID:yVo/NDAD0
ネットワーク通信(特にhttpクライアント)に関するコマンドって
大きくwgetとcurlとfetchなんかがあるけどもみんなはなに使ってます?
大抵のLinuxにはwgetが、MacとWindowsにはcurlが初期搭載されてるので
そのどっちかだとは思う。
0897デフォルトの名無しさん (ワッチョイ d663-aYY/)
垢版 |
2019/01/10(木) 09:31:04.31ID:d7ZwxpvN0
スクリプトの場合はオプションが面倒くさくいのは関係ないから
個人的には自由度の高いcurl一択かな

直接コマンド打ってダウンロードするときはaria2cを使ったりする
0898デフォルトの名無しさん (アウアウウー Sa89-JzEj)
垢版 |
2019/01/10(木) 10:00:22.11ID:jQehovm3a
昔から使ったていたというだけの理由で wget
0901デフォルトの名無しさん (ワッチョイ 4d00-XG35)
垢版 |
2019/01/10(木) 18:31:34.76ID:yVo/NDAD0
>>900
え、それつまり
$ curl ...
としたときのオプションは実はcurlのじゃなくて
Invoke-WebRequestに向けたオプションってこと?
そんなに互換性があるオプション体系だとは思わないのだけど
なぜエイリアスにしてあるんだろう……。
0904デフォルトの名無しさん (ワッチョイ 4d00-XG35)
垢版 |
2019/01/11(金) 03:35:07.12ID:tAdCcMWb0
bashで「=」という文字をコマンドにすることってできますかね。
「=」を「bc -l <<<」に割り当てて
$ = '4 / 5.1'
みたいな簡易電卓として使いたいなと思ったんだけど
alias =='bc -l <<<'やfunction = { bc -l <<< "$1" }はダメ……。
一応GNU Bashの「コマンドに使っていい文字」ではあるんだけど、使えない
0914デフォルトの名無しさん (ガックシ 06ee-XG35)
垢版 |
2019/01/15(火) 18:52:38.58ID:TWtv3hHM6
今からシェルスクリプトに手を出すんならPOSIX 2017の規格文書とかが
なんと無償で公開されてるので非常にやりやすいと思うよ。
GNUの日本語訳されたマニュアルでもいいし、少なくともドキュメントとしては
今は過去一番に恵まれた時代だと感じている。
0915デフォルトの名無しさん (ワッチョイ ce02-H432)
垢版 |
2019/01/16(水) 17:58:43.79ID:ECRqnYoc0
一応この板にもお題スレあるけどね。
この頃過疎ってるかな。
0916デフォルトの名無しさん (ガックシ 068b-b/bA)
垢版 |
2019/01/18(金) 08:45:17.67ID:XZjr/At96
シェルっていうかAWKのことなんですけど
今の時代に「AWKを256倍使うための本」って読んでためになりますか。
それこそFORTRAN66向けの解説書は最低でもFortran 90/95あたりを使う現在では
ほとんど役に立ちませんよね。
ですがAWKは昔からほとんど仕様が変わっていないので、
古い書籍でも役立ちそうではあります。
0922デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 20:03:41.30ID:AuMD8hxP0
真にうけるの意味を知らんバカ、笑う
0925デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 23:50:22.30ID:AuMD8hxP0
言いがかりの意味を知らんバカ、ガチ
0926デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/19(土) 23:51:10.14ID:AuMD8hxP0
てかバカてなんでシェルだとどおにかなると思っとるん?
0930デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/20(日) 18:32:53.82ID:wKV5+GB/0
バカ戸惑っとるやんw
0931デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/20(日) 19:44:46.86ID:wKV5+GB/0
シェルは簡単やけどシェルがおまえバカのを補える訳とちゃうでw
0933デフォルトの名無しさん (ワッチョイ 09c5-VA2m)
垢版 |
2019/01/20(日) 22:05:16.75ID:wKV5+GB/0
いまだにシェルのことシェルスクリプトと言い張るバカおるんやなw
0934デフォルトの名無しさん (ワッチョイ 9b02-7XZ4)
垢版 |
2019/01/21(月) 09:59:58.31ID:+0V9hUvv0
シェルスクリプトと言うからおかしくなるんであって
バッチプログラムと言った方が良くない?
スクリプトと言うほど大袈裟でもないんだけどね
0935デフォルトの名無しさん (ブーイモ MMeb-YJMU)
垢版 |
2019/01/21(月) 10:16:19.43ID:J1WbOjYrM
scriptが台本のことだと知っていれば、シェルスクリプトこそ正当なスクリプトだろ。
そのあとperlスクリプトとか呼ばれてあの手の言語がスクリプト言語に分類され、
ただのインタプリタ系プログラムまでスクリプトに含められてしまった。
0936デフォルトの名無しさん (ワッチョイ 2100-b/bA)
垢版 |
2019/01/21(月) 10:51:13.07ID:uncS2Ppy0
>>935
そんなこと言ったら「プログラム」もおかしいよね
プログラムは式次第って意味だから「関数型プログラミング言語」なんて意味が通らない
式次第って意味と乖離が少なかったのはそれこそFORTRANとかだよね。

……って良い出したらキリがないから、別に「Pyhtonスクリプト」と呼んでもいいんじゃね?
0941デフォルトの名無しさん (ワッチョイ 2100-b/bA)
垢版 |
2019/01/21(月) 12:41:28.01ID:uncS2Ppy0
移植可能なMakefileについての覚書
The Open Groupによると
The best way to provide portable makefiles is to include all of the rules needed in the makefile itself.
The rules provided use only features provided by other parts of this volume of POSIX.1-2017.
The default rules include rules for optional commands in this volume of POSIX.1-2017.
Only rules pertaining to commands that are provided are needed in an implementation's default set.
0944デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/21(月) 13:40:03.75ID:chW+Guj1a
>>938
(*´Д`)ハァハァ
0946デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/22(火) 09:17:01.15ID:J1mDHp9Ya
にゃ
0948デフォルトの名無しさん (オッペケ Sr1d-+JtR)
垢版 |
2019/01/22(火) 12:18:47.44ID:aO6rlwOPr
よーし!今から保健体育の時間な!
0949デフォルトの名無しさん (アウアウウー Sa15-4KIe)
垢版 |
2019/01/22(火) 12:32:24.54ID:J1mDHp9Ya
猫のスレができたと聞いて
0955デフォルトの名無しさん (ワッチョイ 3dc5-hALj)
垢版 |
2019/01/26(土) 21:48:04.51ID:uSJt/X2/0
俺の方が先にfish言おうとしたんやけどね
0957デフォルトの名無しさん (ワッチョイ 3dc5-hALj)
垢版 |
2019/01/26(土) 22:09:06.41ID:uSJt/X2/0
fish知名度高すぎやろwwww
0959デフォルトの名無しさん (ワッチョイ 3dc5-hALj)
垢版 |
2019/01/26(土) 22:38:03.41ID:uSJt/X2/0
なんやその受け身の人生アピールw
0965デフォルトの名無しさん (ワッチョイ 415d-FWM4)
垢版 |
2019/01/28(月) 23:54:39.66ID:WFNfoV5R0
あげ
0966デフォルトの名無しさん (ワッチョイ 415d-FWM4)
垢版 |
2019/01/28(月) 23:55:04.01ID:WFNfoV5R0
シェルでコマンドの出力結果を(lsなど)データベースに入れたいのですが
どのようにすればいいかわかりますか?
できればその時のIpアドレスも一緒にいれればいいのですが
普通にテキストに入れるには
できないのでしょうか
ディレクトリも入れれば最高です
dbはsqlite3でフィールドはディレクトリ内容とディレクトリの2フィールドにいれたいのです
0969デフォルトの名無しさん (ワッチョイ 2e2c-/4Fh)
垢版 |
2019/01/29(火) 00:58:08.58ID:AnpnZGSz0
sqlite3 をコマンドとして使えるのか?
使えるのなら、そういうコマンドのオプションはあるのか?
sqlite3の説明を読めば?

基本的には、単純な空白区切り、CSV, JSON などでも、DB に入れられるはず

a,b
c,d

こういうCSV, TSV でも、DBに入る
0972デフォルトの名無しさん (ワッチョイ 4602-wD8z)
垢版 |
2019/01/29(火) 02:49:31.61ID:PUnzDqON0
>>966
CSVにすればこうやって読み込める。
https://qiita.com/j-shimo/items/83febe1992321ba558e4
まあでも Perl とかで DB 接続のモジュール使ってやっちゃった方が簡単な感じがしないでもないが、
簡単と感じるかどうかは主観的な問題。
0975デフォルトの名無しさん (ワッチョイ 4900-MosH)
垢版 |
2019/01/29(火) 23:36:53.59ID:sGXg/LAN0
シェル(スクリプト)っていうかシステムの話なんですが
FLOSSまたは無償で使えるOSで kshがデフォルトのログインシェルになってるものってありますか
AIXとかはそうっぽいのですが 買えません。
0979デフォルトの名無しさん (ワッチョイ ff28-/DTb)
垢版 |
2019/02/04(月) 09:19:35.31ID:eH/He5cH0
読むと常にEOFを返すようなファイル(つまり/dev/nullとか)を
あえて「実行」した場合の挙動ってPOSIXやXPGで規定されてるっけ。
知ってる人いたら教えてほしい。

多分大抵の処理系でEACCESが返されて終了,という挙動をすると思うんだけど
怪しい……。
0982デフォルトの名無しさん (ワッチョイ ff28-/DTb)
垢版 |
2019/02/04(月) 11:51:25.97ID:eH/He5cH0
>>981
ありがとう。
「実行可能形式」でないものを実行した場合はシェルスクリプトとして起動されるんだね。
そして俺はマヌケな勘違いをしていたwもっと後の方の処理…つーか違う段階だった。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html#tag_16_111_05
たとえば「ディレクトリ」や「(/dev/nullのような)正常でないファイル」が
exec函数によって「実行」されるとEACCESが返って失敗するという訳か。

お騒がせしてすまん。
0983デフォルトの名無しさん (ワッチョイ df01-jOWJ)
垢版 |
2019/02/05(火) 21:50:08.24ID:Ogivq0W50
初心者ながら普段のルーチンをshellscriptで解消したく
ソースコードを書いています。
一つつまづいてるので質問させてください。

catコマンドで特定のtxtファイル(シンボリックで作成したエイリアス)を
読み込むのですがNo such file or directoryと出力されます。

terminal上で同じコマンドを実行するとシンボリックリンク先の
txtファイルを読み込み、きちんと動作します。

何か考えられるミスはありますでしょうか?
0987デフォルトの名無しさん (ワッチョイ df00-/DTb)
垢版 |
2019/02/06(水) 04:34:28.97ID:FgEjt1k50
>>983
うーん。初心者という言葉をそのまま受け取るなら
フルパス・もしくはそのスクリプトからきちんと認識できる位置の相対パス
で指定してる?
ターミナルの上で
$ cd /tmp
として/tmpディレクトリに移動してからそのコマンドを打ってみるとどうなる?

もう一つは「No such file or directory」がcatの出力でない可能性
ファイル自身をコマンドとして認識される位置に持ってきてない?
0988デフォルトの名無しさん (アウアウウー Saa3-d53M)
垢版 |
2019/02/06(水) 15:26:28.18ID:Zn5BTEOaa
>>983
cat の打ち間違えやスペースが全角。

ファイル名の文字コード間違い。全角半角だけでなく見た目が同じだがキリル文字の方を使ってるみたいな間違い。

Unicode特有の問題で日本語の平仮名の濁点や半濁点の文字が2文字になっているというのもあるかも知れない。これはよくMacOSとWindows間のファイルをやり取りすると起こる。
画面上は全く同じに見えるファイルが同じディレクトリに2つ並んだりする。しかし文字コードを調べると違っている。
0989デフォルトの名無しさん (ワッチョイ df01-PoJv)
垢版 |
2019/02/06(水) 21:18:32.76ID:gnsmOIbq0
レスを頂きありがとうございます。
983です。

readlinkは事前に使用して検証してたのですが、
問題なくシンボリック先を辿れていました。

カレントディレクトリが/tmpの状態でコマンドで
打つとこれも問題なく動作します。

文字もシンプルな英語しか使用してないので
どこが間違っているのかわかりません。

教えて頂いたデバッグ方法を参考にもう少し探ってみます。
0994デフォルトの名無しさん (ワッチョイ d914-feI+)
垢版 |
2019/02/08(金) 04:16:16.40ID:OGIJJ+v/0
> シェルスクリプトがややこしいから、
>
> vagrant, chef, Homebrew などは皆、Ruby で作られている

>>992はなぜこんな言い方をしてしまったのか?

それは、vagrant, chef, Homebrew などは皆、
本来はシェルスクリプトで作るべきものなんだ
と思っているからなのだろう。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 138日 22時間 51分 54秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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