X



シェルスクリプト総合 その28
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん垢版2018/07/24(火) 11:01:16.36ID:r0TJj2hB
シェルスクリプトに関する総合スレッドです。

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

前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/
0002デフォルトの名無しさん垢版2018/07/24(火) 11:01:46.51ID:r0TJj2hB
お約束
・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
 つまりシバンは#! /bin/shです。
 他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。
  OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。
   ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。
  FreeBSDユーザーは/bin/shの実体がashなので注意。
  Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。
 csh/tcshでのシェルスクリプトは*まったく推奨しません*。
  (参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIXに準拠しましょう
 有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
  (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
  Heirloom sh: http://heirloom.sourceforge.net/sh.html
  Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
 Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0003デフォルトの名無しさん垢版2018/07/24(火) 11:02:04.48ID:r0TJj2hB
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
 シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。

回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
 安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
0004デフォルトの名無しさん垢版2018/07/24(火) 11:05:09.89ID:r0TJj2hB
補足(今スレ限り)
いままではUNIX板でスレ立てをしていましたが、IDやワッチョイが無いことを理由とした自演・荒しが目立ってきておりスレがまともに機能しなくなりかけているので、今回よりプログラム板に移動することになりました。
0014デフォルトの名無しさん垢版2018/07/25(水) 02:54:55.73ID:7zvfAEGp
テンプレの↓
> 自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
ちょっと痛いかな
0015デフォルトの名無しさん垢版2018/07/25(水) 03:03:02.74ID:JJXqrWB8
bashのあれやこれは、shでどうかけばいいかってのがあるといいな
特に配列。配列は引数として処理するんだよっていうのが体系的にまとまるといいな
0016デフォルトの名無しさん垢版2018/07/25(水) 08:44:11.14ID:go981At1
本来の引数配列以外で配列が必要になったら、基本的にはawkその他の言語使うなあ。
まあ自分用だと気の迷いで引数配列転用したり、evalで頑張ったりすることもあるけど、
仕事で他の人に引き継ぐこと考えると保守性で問題になるので
仕事ではやらないようにしてる。
0017デフォルトの名無しさん垢版2018/07/25(水) 15:17:48.54ID:JJXqrWB8
>>16
配列が必要になるっていうのは、シェルスクリプトの
プログラミングの仕方が間違えてるってことだよ

例えて言うならば、関数型言語をオブジェクト指向言語的に
使って、オブジェクト使いたい。インスタンス作りたい
メソッド作りたい、継承、カプセル化欲しい!って言うようなもん

シェルスクリプトは引数または標準入力で渡されたものを
順次処理していくという書き方をするもんなんだろう。
一時的に変数にためておくなんてことはしないので
配列は使わないですむ
0018デフォルトの名無しさん垢版2018/07/25(水) 15:24:58.23ID:eezz2RvW
evalだけは怖いから使わない
それでしか解決できない問題をまだ扱った事がないからだが
0019デフォルトの名無しさん垢版2018/07/25(水) 15:32:42.01ID:JJXqrWB8
evalは信頼できない文字をevalするのが問題なのであって
コードの中で作り出した文字をevalするなら問題もないんだよ
信頼できない文字であっても、使える文字種を限定すればいいし
002016垢版2018/07/25(水) 17:16:52.45ID:BMgdIVPp
>>17
だいたい同感。
配列や連想配列がぴったりした応用もあるんだけど、
シェルで書くようなプログラムじゃないね。
0023デフォルトの名無しさん垢版2018/07/25(水) 21:12:21.99ID:l3Vcc9bz
>>17
バッチファイル程度のシェルスクリプトしか
知らないからそう思うんでしょ
知れば奥が深いよ
配列も結構多くのシェルがサポートしてる(例えばcsh)
0024デフォルトの名無しさん垢版2018/07/25(水) 21:32:58.42ID:tKZkTFhc
極端な例を挙げるなら、行列演算をシェルスクリプトで書く馬鹿はいないみたいな話よ。
配列に限った話ではなく、ほとんど全ての高級言語にあるのにシェルにはない言語機能がいろいろある。
例えば構造体に類する機能とか、参照とか。
言語には向き不向きがあって、シェルでは向いてない用途に無理矢理使うのは井の中の蛙。
002621垢版2018/07/26(木) 05:58:11.67ID:BvZq73xc
>>25
ありがとうございます。
上手くいきました。
0028デフォルトの名無しさん垢版2018/07/27(金) 15:01:43.20ID:GvW3yrkV
できるだけ可搬なUNIX時間<->ISO 8601形式時間の変換器ってどんなのがありますかね
PerlやRubyでいけるのは知っていますが,もうちょっとPOSIXに従ってるやり方が知りたいです
0030デフォルトの名無しさん垢版2018/07/27(金) 15:42:57.75ID:2MP7doyF
>>28
小出しでスマン。こういうオプションもあるみたいなんだけど、man に記載されてないね……

$ date --date "@1501201492" --iso-8601=seconds
2017-07-28T09:24:52+0900
0031デフォルトの名無しさん垢版2018/07/27(金) 16:35:57.77ID:GvW3yrkV
>>29
ありがとうございます。
そうっすね……。dateコマンドでできるのは知っていますが,
これ,ものっすごく可搬性悪いんですよ。下手するとPerlでやったほうがマシなくらい。
なぜかというと,各種OSによってdateコマンドのUNIX時間<->ISO 8601形式時間変換のオプションが違うんです。
*BSDはdate -jだしGNU/Linuxでは書いてもらったdate --dateとかdate -dとか。
ある種のOSではdate -rもあるっぽいです……。
0033デフォルトの名無しさん垢版2018/07/31(火) 09:25:51.28ID:nOeIYYJj
>>28
アルゴリズムとしては
秒数→日時変換と日時の足し算だけなんだから
自力で作れない?
0034デフォルトの名無しさん垢版2018/07/31(火) 09:56:38.03ID:2+1mdxB2
自力で作るならコマンド見分けたほうが楽だなw
どちらも同じオプションだけど意味が違うものを使って見分ける
0037デフォルトの名無しさん垢版2018/07/31(火) 20:11:42.59ID:qTamNnJo
bashです。
aa.shからbb.shを呼び出した時、リダイレクトでログを残したいんだけどうまく行かない。
なにか間違っているでしょうか?
(aa.sh)
#!/bin/bash
b_shell="./bb.sh"
cmd="${b_shell} > ./bb.log"
${cmd}

(bb.sh)
#!/bin/bash
echo "hoge"
0046デフォルトの名無しさん垢版2018/07/31(火) 22:58:00.65ID:RprViRTw
>>45
うるう秒はUNIX Epochからの秒数には入ってないので無視して良い。
サマータイムやタイムゾーンの考慮は必要だしとても大変。
日本のタイムゾーン固定ならサマータイムも今のところ無視できるし簡単だけど、perlでも使ってライブラリに任せた方がいいと思う。
0049デフォルトの名無しさん垢版2018/08/01(水) 11:52:30.09ID:cj6lI2dq
昨日発見した事なんだけど、シェルというよりは test コマンドの問題だけど、test -f で対象のファイルを指定しない時って0になるのな。
これはbash用に書かれたこんな記述の時の動作によって気づいた。

if [ ! -f $file ]; then
echo ファイルなし
exit 1
fi

これで file に何も代入されてないとか空文字列の時にファイルなしにならない。

なんだこの動作は?
testコマンドの仕様?たまたま俺の使ってたLinuxのtestコマンドのバグ?

まあbashなら[[ ]] 使っとけばエラーになるからそっち使っておけば良いんだけどね。
0051デフォルトの名無しさん垢版2018/08/01(水) 12:31:44.03ID:GtWBM62w
find [xxx] -type f | xargs grep [yyy]
をよく使うので
search xxx yyy みたいな alias にしたいんですけど
引数を途中に挟むのってどうすればいいんでしょうか
0052デフォルトの名無しさん垢版2018/08/01(水) 12:34:38.30ID:cj6lI2dq
>>50
そ、そうか。

しかしなんでまたそんな仕様になったんだ?
0053デフォルトの名無しさん垢版2018/08/01(水) 12:43:22.75ID:cj6lI2dq
>>51
bash の場合は function で定義するしかないようだよ。ググって探してみな。
0055デフォルトの名無しさん垢版2018/08/01(水) 14:58:33.41ID:RF/jFH0Y
>>52
ググって探してみなw
まあ、何らかの歴史的な背景だろうけど、明確に仕様に書いてあるのだから
0057デフォルトの名無しさん垢版2018/08/01(水) 15:16:54.25ID:Al4aQLEL
>>49
そもそも if [ ! -f $file ]; then だと $fileにスペース等が入っている時に
対応できないので "$file" と書くのは必須
更に言うなら set -u すればいい。$file が空のときはエラーになる
0058デフォルトの名無しさん垢版2018/08/01(水) 15:25:42.75ID:RF/jFH0Y
0 arguments:
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
って、だけなんだけどな。2 arguments から本格的に判定に入るってとこかな。演算子が有効なものなのかも含めて
0059デフォルトの名無しさん垢版2018/08/01(水) 15:35:17.39ID:RF/jFH0Y
ああ、1 argumentの場合は空文字列でないかどうかっていうテストになるのか。そう思えば不思議でも何でもないな。使わないけどw
歴史的にそんなのがあっても不思議ではないな、実際どうなのか知らんけど
0060デフォルトの名無しさん垢版2018/08/01(水) 23:58:14.58ID:GZaAdjmn
# set variable identifying the chroot you work in (used in the prompt below)

if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

これは、~/.bashrc だけど、

変数中に空白があっても良いように、たいてい変数は" " で囲む。
一方、固定値は囲まない

こういうように、シェルスクリプトには様々な引掛けあるから、危険!
Ruby などのプログラミング言語を勧める

マンガの「Linux シス管系女子3」に書いてあるけど、

「rm -f $file」と変数を" " で囲わなかったので、
「; rm -rf shared」というファイルがあったため、

rm -f ; rm -rf shared
と文がつながって、共有フォルダのファイルがすべて消えてしまったとかw
0061デフォルトの名無しさん垢版2018/08/02(木) 00:06:27.75ID:LJtboBWc
>>60
変数の値として ; が入ってても、文の区切り扱いにはならないので嘘くさい。
evalしてれば話は別だが。
006260垢版2018/08/02(木) 00:07:43.15ID:yvP4ulwr
だから、ディレクトリパス・ユーザー名とか、
システムで使うものに、半角空白を入れたら、ダメ

シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから

パスに半角空白を入れないようにって、
Mac ユーザーにも、よく言われる

Windows には、半角空白が入ったフォルダ名があるから、危険
006360垢版2018/08/02(木) 00:12:09.87ID:yvP4ulwr
>60 は、
日経Linux で連載している、Piro の有名なマンガ、
「Linux シス管系女子3」に書いてある

このマンガを知らなかったら、もぐりw
0064デフォルトの名無しさん垢版2018/08/02(木) 00:35:21.87ID:4n+0BAwB
>>62
> Mac ユーザーにも、よく言われる
ほんとかよ。macOSの標準ディレクトリに普通にスペース入っているのあるけど
うそくさい、えせくさいw
0065デフォルトの名無しさん垢版2018/08/02(木) 00:47:05.64ID:aFy8Ou9l
実際に試してみればええんじゃないの

$ mkdir shared
$ touch '; rm -rf'
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f $file; done
$ ls
'; rm -rf shared'

$ mkdir shared
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f "$file"; done
rm: cannot remove 'shared': Is a directory
$ ls
shared/
0066デフォルトの名無しさん垢版2018/08/02(木) 00:51:46.28ID:dc2nLErP
>>60
>一方、固定値は囲まない
囲まなくていいのは囲まないだな。当然囲む必要があるのなら囲む " でなく ' ででも
囲まないで ¥ 使う物好きもいるかもしれないが
変数でも囲まないのは同じように囲まなくてもっていうところが原点だろうが、世の中そんな条件付けが許されるほどそう甘くはないっていう

その下の rm はイミフだな。>>61のほぼ言う通り。もちょっと「なんか」あるんじゃないの
そんなマンガ知らなかったらモグリよばわりされるならモグリで十分すぎるw
006760垢版2018/08/02(木) 01:12:36.09ID:yvP4ulwr
日経Linux は、Ruby の作者・Matz と、マンガの「シス管系女子」の連載が有名

「シス管系女子」も、もう3冊目。
たいてい本屋の目立つ所に置いてある

システム管理者の必須本
0070デフォルトの名無しさん垢版2018/08/02(木) 03:58:43.02ID:tOum0Ceh
>>60
> 変数中に空白があっても良いように、たいてい変数は" " で囲む。
> 一方、固定値は囲まない

固定値だから囲まないんじゃなくて、
固定値かつ、空白が含まれてないから囲ってないだけ
固定値でも、空白が含まれていれば囲む
0071デフォルトの名無しさん垢版2018/08/02(木) 04:04:23.88ID:tOum0Ceh
>>62
> Windows には、半角空白が入ったフォルダ名があるから、危険

危険なんじゃなくて、半角空白が入ったフォルダがあるから
きちんと対応せざるを得なくなってバグが減る

下手に半角空白がないシステムばかり使っていたら
半角空白に対応するのを忘れてしまう。そっちのほうが危険。

そんなことよりもshellcheckでチェックするほうが常識
これを知らないやつはモーグリ
0072デフォルトの名無しさん垢版2018/08/02(木) 04:16:33.42ID:tOum0Ceh
>>60
> こういうように、シェルスクリプトには様々な引掛けあるから、危険!
> Ruby などのプログラミング言語を勧める

Rubyは外部コマンドを呼び出すのがすごく面倒くさい言語だが

参考 https://qiita.com/zakuroishikuro/items/3ab4476ff53f50a163be
> _人人人人人人_
> > めんどい <
>  ̄Y^Y^Y^Y^Y ̄


``を使えば、最小2文字の追加で呼び出すことができる
(正確にはputsしないと標準出力は表示されないからスペース入れて7文字)

Rubyでも結局同じ問題が起きる

# ruby −e Vdir=Wa bW; `ls −al #{dir}`V
ls: cannot access VaV: No such file or directory
ls: cannot access VbV: No such file or directory
(全角なのは書き込みエラーが出たから。もう面倒だから一律変換する)

回避策はいちいち言わなくていい、そんなのあるの知ってる。
Rubyでも様々な引掛けがあるという話。
0073デフォルトの名無しさん垢版2018/08/02(木) 05:32:18.98ID:5bB71pa/
Ruby使うくらいならPython使うわ。
でもここはシェルスクリプトのスレなんですよ。
しかも「ダブルクォートで囲む」という至極単純な対策でバグを回避できるんだから
他の言語を使う必要もないな。
ところでファイル名にダブルクォートが入っている場合があるので
ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
0074デフォルトの名無しさん垢版2018/08/02(木) 06:11:19.56ID:tOum0Ceh
>>73
> ところでファイル名にダブルクォートが入っている場合があるので

なんのことでしょう?
ファイル名にダブルクォートが入っていても
なんの問題もないですよね?

[test.sh]
#!/bin/sh
n="a'\"b"
file "$n"

$ echo test > a\'\"b
$ ./test.sh
a'"b: ASCII text
0075デフォルトの名無しさん垢版2018/08/02(木) 11:35:22.97ID:N9CdGDK2
bashでは0(真)か0以外(偽)となりますが、
Cスタイルのforループの条件判定のところにi==0( i>=0とするところを間違えてやってしまいました)
とやったら一回もループに入らなかったのですが、
Cスタイルのforループの中では0は偽なのでしょうか?

forループは下のループです。(chinachu-mirakurun-sleep scriptでスキップした番組の時に録画動作に入らない
ように改造したものです)

for ((i = ((${#IsSkipArray[@]} -1)) ; i>=0 ; i--)); do
if [ "${IsSkipArray[i]}" = "false" ]; then
(( RecTime = ${RecTimeMsec[i]} / 1000 ))
elif [ "${IsSkipArray[i]}" = "true" ]; then
:
fi
done
0076デフォルトの名無しさん垢版2018/08/02(木) 11:45:13.93ID:N9CdGDK2
ちょっと訂正します。
間違えたコードはi==0ではなく、条件式にi=0としていました。
だから毎回判定するごとにiに0が代入されてループに入れなかったんですが、
お聞きしたかったのは0が偽だからループに入れなかったのか?ということでした。
条件式に代入式を持ってくる時点で素人丸出しなんですが、どうかご容赦ください。
0077デフォルトの名無しさん垢版2018/08/02(木) 12:23:00.77ID:N9CdGDK2
ttps://mywiki.wooledge.org/ArithmeticExpression
ここのサイトを見たらfor (( ; ; ))もArithemetic Expression(算術式)で、
However, when evaluating an arithmetic expression, C language rules (0 is false, anything else is true) apply.

と書いてありました。Cの原則が適用されるようですね。自己解決したっぽいです。
どうもお騒がせしました。
0080デフォルトの名無しさん垢版2018/08/03(金) 14:58:08.23ID:htH9kPBS
>ファイル名に、ダブルクォートが入っている

ファイル名に、! が入っていたら、どうなる?

テレビ番組の録画で「何々!」「何々!!」みたいな番組名が、ファイル名になる場合
0084デフォルトの名無しさん垢版2018/08/03(金) 18:47:15.20ID:TC+4ZTQW
いやだから,感嘆符が特殊文字になるのはインタラクティブなときのみじゃないの?
0086デフォルトの名無しさん垢版2018/08/03(金) 20:02:10.32ID:X+nM2ZWl
! を特別扱いするシェルを使っているかどうかの問題ではないかな。
OSやファイルシステムが特別扱いしているってこともあり得なくもないが。
UNIX系OSだと / しか特別扱いしてないよね。
008780垢版2018/08/03(金) 20:31:20.88ID:htH9kPBS
Linux 板で、テレビ番組名に、!!! みたいなものが入っていて、
それがファイル名になる場合に、バグるって言ってたから

! は、エスケープも出来ないとか
0088デフォルトの名無しさん垢版2018/08/03(金) 20:50:55.07ID:TDL18VXl
他の環境ではNGの可能性があるということを考えると
怪しい文字は極力ファイル名に使わないようにしてる。
ある意味思考停止だけどw

CD-R焼く時、使える文字がフォーマットによりまちまちで、
ものすごい複雑だったことを思い出したわ。
ロミオとジョリエットwとか、ロックリッジとかあったなぁ。
0091デフォルトの名無しさん垢版2018/08/03(金) 21:36:10.72ID:8YejLfKY
>>80
ばーかばーかさんへ

file "$1" が文字が原因で失敗する事例なんてありません
エスケープが必要な場合など存在しません。

わかったら黙って帰れ
0092デフォルトの名無しさん垢版2018/08/03(金) 21:38:01.51ID:5qGFGeHO
>>86
特殊文字って場合によりでしかないよな。特殊文字だから必ずバグる(?)なんてないし
シェルというか引数として受けたコマンドがって感じかなあ。bash自体がスクリプト中の引数を含めたコマンド文字列に特殊文字があっても何もしない/しないようにできるし

ID:htH9kPBSが言っているのは、ID:TC+4ZTQW が言っているコマンドラインでのヒストリ(参照)処理に引っかかる場合で、シェル「スクリプト」の問題ではないだろう
0093デフォルトの名無しさん垢版2018/08/03(金) 22:13:10.45ID:5qGFGeHO
スクリプトとして關係ないが、超シンプルにしての
$ ls '!'
ls: !: No such file or directory
まあ、そうだな
$ ls !
ls: !: No such file or directory
ほう
$ ls "!"
-bash: !: event not found
なんでやねんっ!ってとこではあるな

コマンドラインでも ! を打たなきゃファイル名がんなの入っていてもだし、! を含めたファイル名なんぞを打たなきゃでも ' でくくればいいんじゃね
0094デフォルトの名無しさん垢版2018/08/03(金) 22:47:23.99ID:TC+4ZTQW
だからすごく単純な話で
$ cat ./hstex.sh
#! /usr/bin/env bash

case $- in
(*H*)
echo enabled
;;
(*)
echo disabled
;;
esac
$ ./hstex.sh
disabled
こういうことでしょ?
つまりシェルスクリプトになってるときbashはヒストリ展開を既定で行わないから
エスケープを考える必要はないの。
0095デフォルトの名無しさん垢版2018/08/03(金) 22:52:05.62ID:8YejLfKY
はぁ、シェル「スクリプト」かどうかの問題じゃないんだってば

>>93はevent not foundってでなかったんで
考えるのメンドーなんでぐぐって
https://qiita.com/Qutjl/items/6e0056853c94011d245b のネタパクるけどさ

$ ruby -e "puts 'Hello, World!'"
-bash: !': event not found
はい、たしかにそうなりますね。

テキストエディタで「puts 'Hello, World!'」という内容のcode.txtファイルを作成する
$ cat code.txt
puts 'Hello, World!'

$ a=$(cat code.txt)
$ echo "$a"
puts 'Hello, World!'
変数 a に先程の文字列を入れました

$ ruby -e "$a"
Hello, World!
はい、エラーになりません。

これはシェルスクリプトが特殊なんじゃねーよ。
C言語で、ソースコードに"\n"と書いてある文字列をprintfした時と
\nという文字列が入っている変数をprintfした時の挙動と一緒だろうが

プログラミングの基礎やで。ソースコードをパースするときの処理かどうかの違い
0096デフォルトの名無しさん垢版2018/08/03(金) 23:09:12.00ID:5qGFGeHO
>>95
なにを言っているのかわからんww なんか面倒なことになってるなww

「スクリプト」の問題じゃないよ、ソースコードをパースとかよくわからん例えに見えるけど、単に「コマンドライン」でのパース(?)の問題。それもヒストリ展開だけの。>>94でID:TC+4ZTQWが再び言及しているような

ああ、bashのバージョンで
$ ls "!"
-bash: !: event not found
にならんことあるな。新しいのは。
$ ls "!!"
でもいいよ。今度は
$ ls !!
の挙動が変わるけど。まあ '' でくくればいいだけ&単に「コマンドライン」での問題
0100デフォルトの名無しさん垢版2018/08/03(金) 23:28:02.17ID:h174pTLw
若者はヒストリー置換を知らないんだなあと感じいる俺はオッサン。

ヒストリー置換は対話的な入力にしか影響しないから、
スクリプトにするときは気にしなくていいよ。
0101デフォルトの名無しさん垢版2018/08/04(土) 02:05:18.25ID:j+kw9Zam
>>97
そりゃ間違ってるでしょ。

シェルスクリプトになってるときは〜とか言っちゃってる
インタラクティブシェル上でも変数を""で囲えば同じなのに
0103デフォルトの名無しさん垢版2018/08/04(土) 03:15:50.13ID:ddNokTrS
初見イミフ、よく読んでもやっぱりイミフw
なんか問題点を勘違いしているでしょ
>>94のcaseからesacをコピペってみて実行してみ。たぶんそういう文脈での「シェルスクリプトになってるときは〜」だと思うぞ=間違ってはないと思うぞ

何を問題にしてんの?「インタラクティブシェル上でも変数を""で囲えば同じなのに」って
0104デフォルトの名無しさん垢版2018/08/04(土) 03:24:02.15ID:XmDLxyoB
なんでこんなに丁寧に教えてやらんと理解できんのか

>>62の話だろ
> だから、ディレクトリパス・ユーザー名とか、
> システムで使うものに、半角空白を入れたら、ダメ
>
> シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから

ヒストリー展開はスクリプトだと既定で無効だが、
それ以前にファイル名にスペース入ってたりするから、
変数はダブルクォートでくくるのは当たり前なんだよ。
shellcheckすればデフォルトで指摘される項目

変数はダブルクォートでくくればいいって言ってんのに
今度は「ファイル名にダブルクォートが入っていたら?」
「ビックリマークが入っていたら?」とか言い出してんだろ

そ・れ・も「変数をダブルクォートでくくればいい」で終わりつってんだろ

ダブルクォートでくくればヒストリー展開が有効であっても
ファイル名に!が含まれてようが関係ない
0105デフォルトの名無しさん垢版2018/08/04(土) 03:25:51.10ID:XmDLxyoB
>>103
話の流れをよめ。

変数に入っている文字に
空白やダブルクォートやビックリマークが
入っている場合の話だ

変数をダブルクォートで囲めば全部解決
エスケープなんぞいらん
0108デフォルトの名無しさん垢版2018/08/04(土) 03:57:51.51ID:ZE1/UEds
それは>>73からの続きだろ

> ところでファイル名にダブルクォートが入っている場合があるので
> ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。

これも囲む必要はない

ファイル名を文字列で直接書くならそもそも\でエスケープすればいいだけ
だからこれは変数の話であることは明白

その話の続きで>>80

> >ファイル名に、ダブルクォートが入っている
>
> ファイル名に、! が入っていたら、どうなる?

という流れだ
0109デフォルトの名無しさん垢版2018/08/04(土) 04:07:16.79ID:ddNokTrS
いや、だから、その話の流れはあるかもしれないが、途中からの話の流れは ! が特殊文字になるのはっていうだけの話だぞ?
その>>73>>74で終わってるし、なんかまたわけからんのが出てきたが ! がっていうのはそういえばっていうだけの

なんかあなたが強調しているのはそんなのわかっている上でのだぞ?なんでそんなとこに拘っているの??
0114デフォルトの名無しさん垢版2018/08/06(月) 08:36:00.23ID:/d0+B2Ty
ファイルやディレクトリを引数に取り、その許可属性を返すコマンドってありますか。
少なくともPOSIX Utilityにはないと分かっています。
期待する動作はそのコマンドの名前をownとして
$ own /some/file
-rwxrwxr-x
というような具合です。
0118デフォルトの名無しさん垢版2018/08/06(月) 09:26:53.13ID:4JbBAPy3
>>114
lsまたは stat の出力の一部を自分で切り出せば良いのでは?
なんだったらそれだけをするシェルスクリプトまたはシェル関数作れば良い。
0119デフォルトの名無しさん垢版2018/08/06(月) 09:29:30.92ID:4JbBAPy3
うはっw NGワードで引っ掛かってあれこれ変えてる内に回答が二つ書かれてたw
0122デフォルトの名無しさん垢版2018/08/06(月) 11:45:03.11ID:jTWGCXc0
>>115,116,118
わたしも最初はlsの結果をcutするシェルスクにしようと考えたけど
>>117
GNUならそれで、BSDのstatなら stat -f "%Sp" /some/file な感じか

POSIXの縛りならlsとcutかもしれんけど
0125デフォルトの名無しさん垢版2018/08/10(金) 03:53:11.11ID:5eVCbRBd
OpenWrtでこんなの見つけた。何処がオリジナルだろう?
物自体はバイナリだけどシェルスクリプトと親和性が高い(?)
JSONのパースと生成の方法のアイデアとして

https://wiki.openwrt.org/doc/devel/packages/jshn
Library for parsing and generating JSON from shell scripts

こんなふうに出力される

$ jshn -r '{"a":1, "b":2, "c": [1,2,3], "d": {"A":1}}'
json_init;
json_add_int 'a' 1;
json_add_int 'b' 2;
json_add_array 'c';
json_add_int '0' 1;
json_add_int '1' 2;
json_add_int '2' 3;
json_close_array;
json_add_object 'd';
json_add_int 'A' 1;
json_close_object;
0127デフォルトの名無しさん垢版2018/08/10(金) 11:19:27.53ID:zsXdw2zN
>>126
あ、はい。ググればわかる。
なんか変な人がjqはクソだって言ってる
で頑張ってオレオレで変なの実装してるが、
すでにあるよって話
0128デフォルトの名無しさん垢版2018/08/10(金) 11:44:23.91ID:r84RRSaO
>>127
そのおかしな人の言うことを解釈すると
そのコマンドはオプション引数でデータを受け渡すのであまりよくないのでは?
Unix哲学としてはデータは標準入力から渡すべき。
0130デフォルトの名無しさん垢版2018/08/10(金) 12:52:37.04ID:EBuB6o8O
パイプで繋いで使えるようにってことかな
0134デフォルトの名無しさん垢版2018/08/10(金) 15:54:52.38ID:ndPpyRQZ
でもあの人の言うことなんて聞いてらんないよね。こっちは宗教で食ってるわけじゃないんだからさ。
作って見せたツールだって痒いところに手が届かない部分は
「そんなのはそもそもこうこうであるべきで必要ない」みたいな感じでほっぽってるし
作ってマウント取って射精後スッキリになったら全くメンテなんてしないし。「各人個別で改修・メンテしろ」ってことなんだろうけど、
こんなの個人の便利ツール止まりで世界中の不特定多数の共有便利ツール・知識にはなり得ないよ。
0135デフォルトの名無しさん垢版2018/08/10(金) 15:59:32.13ID:xNR7R3k1
何やってる人か知らんが、それはそれでいんじゃないの?
頼まれずに作ったツールの公開なんてオナニーそのものやろ
0136デフォルトの名無しさん垢版2018/08/10(金) 17:01:03.73ID:r84RRSaO
誰かが例の記事のはてブで言ってたけど,ああいう人も必要だとは思う。
というか正直俺はプログラマじゃない(つまりコーディングで飯食ってるわけじゃない)ので,
ああいう考え方にはすごく興味があるし,実際研究室の管理シェルスクリプトをPOSIX準拠で書き直したりもしてる。
しかし繰り返すがプログラマにとっては邪魔な存在なんだろうなとは感じる。
というか言い方がキツすぎる。
0137デフォルトの名無しさん垢版2018/08/10(金) 17:59:17.69ID:q2LOavXt
だが、それがいい。
0138デフォルトの名無しさん垢版2018/08/12(日) 14:51:04.97ID:EQS0DV6K
#!/bin/bash
for i in {0..5}; do
 n=`date +%Y-%m-%d_%H '-d ${i} hour ago'`
 echo $n
done
ループで時間を1時間ずつ過去にして表示したいんだけど実行すると
 date: ` ${i} hour ago' は無効な日付です
て表示されます。
助け船おねがいします
0141デフォルトの名無しさん垢版2018/08/13(月) 00:38:00.83ID:z6+TJcGX
"-d ${i} hour ago" の部分が -d "${i} hour ago" ではないのに何故大丈夫なのかと思ったが、
短いオプションだからパラメータと繋がってても大丈夫ってことだったんだな。
0142デフォルトの名無しさん垢版2018/08/14(火) 19:59:14.84ID:0dSYKDxo
上のやり取りをみてふと思いたって実験してみると
GNU dateではフォーマットにCSIとかに代表されるANSI制御綴りを指定できるけど
BSD dateでは無理だな。
POSIXではこの二つのどちらが正しい実装なのかはよく分からんが
個人的な意見としてはBSD dateのほうが堅牢で,GNU dateのほうが柔軟だとは思う。まあ当然すぎる事実だけどw
0143デフォルトの名無しさん垢版2018/08/15(水) 02:35:15.09ID:sxh1cciH
BSD date の仕様が分からないけど、標準出力が端末とは限らないし
指定そのまま出すほうが正しいんじゃないかな
0146デフォルトの名無しさん垢版2018/08/17(金) 03:06:26.97ID:DWhhxT1h
単純な文字列置換ってどうしたら良いですかね?
sedつかうとメタ文字の置換で困るんです
0147デフォルトの名無しさん垢版2018/08/17(金) 03:42:44.91ID:l9m154d6
その辺りが楽なperlでいいんじゃない?
シェルスクリプトから使っちゃいけないというわけじゃないし
0155デフォルトの名無しさん垢版2018/08/17(金) 08:24:08.77ID:RTbKyx/W
>>154
残り容量600KBを切ってるので入りません
Rubyは依存関係も含めると圧縮された
パッケージサイズで1MB以上あります。
0159デフォルトの名無しさん垢版2018/08/17(金) 08:44:27.28ID:TmUZ5Zjz
パターン文字列をsedで置換しちゃうとか(GNU sed の場合)

$ pattern='foo[1]'
$ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
foo[2]
0162デフォルトの名無しさん垢版2018/08/17(金) 08:56:35.86ID:RTbKyx/W
>>158
スクリプトの実行はできましたが、 %s/〜/〜/g
だと〜に/が入っていた時に困ります。
〜には何が入るかわかりません。

あとviは標準入力から読み込めませんでした
できれば標準入力から読み込みんで標準出力に出力したいです。

ちなみにviのバージョンです

# vi -H
These features are available:
Pattern searches with / and ?
Last command repeat with .
Line marking with 'x
Named buffers with "x
Some colon mode commands with :
Settable options with ":set"
Signal catching- ^C
Job suspend and resume with ^Z
Adapt to window re-sizes
BusyBox v1.28.3 () multi-call binary.

Usage: vi [OPTIONS] [FILE]...

Edit FILE

-c CMD Initial command to run ($EXINIT also available)
-R Read-only
-H List available features
0163デフォルトの名無しさん垢版2018/08/17(金) 09:00:22.48ID:RTbKyx/W
>>159
GNU sedじゃないからだめなんでしょうね

# pattern='foo[1]'
# sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
-ash: syntax error: unexpected redirection

ちなみにsedの--versionと--helpです。

# sed --version
This is not GNU sed version 4.0


# sed --help
BusyBox v1.28.3 () multi-call binary.

Usage: sed [-i[SFX]] [-nrE] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-i[SFX]] [-nrE] CMD [FILE]...

-e CMD Add CMD to sed commands to be executed
-f FILE Add FILE contents to sed commands to be executed
-i[SFX] Edit files in-place (otherwise sends to stdout)
Optionally back files up, appending SFX
-n Suppress automatic printing of pattern space
-r,-E Use extended regex syntax

If no -e or -f, the first non-option argument is the sed command string.
Remaining arguments are input files (stdin if none).
0165デフォルトの名無しさん垢版2018/08/17(金) 09:16:49.96ID:TmUZ5Zjz
>>163
ああ、bash じゃなくて ash だから here string("<<<") が使えないのね…

# echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"

こんな感じかな。
0167デフォルトの名無しさん垢版2018/08/17(金) 09:48:06.80ID:RTbKyx/W
>>166
なんかプラスが入った時おかしいっすね

GNU sed
$ pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]

$ pattern='a+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]+

busybox sed
# pattern='+'
# echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
sed: bad regex '\+': Repetition not preceded by valid expression
0168デフォルトの名無しさん垢版2018/08/17(金) 09:57:27.72ID:TmUZ5Zjz
>>167
う〜ん、ash でやってみたけど、1番目、2番目は問題ないなぁ
Busybox の sed は -r オプションがないんじゃなかったかな
0171デフォルトの名無しさん垢版2018/08/17(金) 10:13:01.82ID:TmUZ5Zjz
あれ?でもさ、

pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]

入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな?

でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は
`+` を考慮する必要はなかったのね…

$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g"

こっちの方が良いみたい。
0174デフォルトの名無しさん垢版2018/08/17(金) 10:20:29.64ID:RTbKyx/W
だから要するに + はエスケープしたらダメってことなのか?

単純な文字列置換って正規表現置換よりも簡単な処理なのに
どれも面倒くさいなぁw
0175デフォルトの名無しさん垢版2018/08/17(金) 10:33:33.58ID:hKcJGgnp
ashの日本語manページはないのかなと思って検索した時に出てきた画面。
https://i.imgur.com/xzEhcAc.png
0177デフォルトの名無しさん垢版2018/08/17(金) 10:41:51.16ID:hKcJGgnp
>>176
カラフルな検索結果だがこれと言って役に立たないという共通点があるな・・・
0179デフォルトの名無しさん垢版2018/08/17(金) 11:32:47.25ID:TmUZ5Zjz
grep にある -F オプションと同等のオプションが sed にも
欲しいところではあるなぁ。生まれは同じなのに sed には無い
のは何故…(実はあったりして)
0181デフォルトの名無しさん垢版2018/08/18(土) 17:22:09.36ID:rQWtSS3z
Googleのシェルスクリプトに関するコーディング規約で
「そう〔訳注: 連続したパイプ節が二つ以下〕でない場合は一行につき一つのパイプ節を含むようにする。その際,二番目以降のパイプ節は,2文字分の欧文空白による字下げを行なう。」
とあるんだが[1],ここの例示が
command1 \
 | command2 \
 | command3 \
 | command4
となっている。
普通(といってもパイプをこのように多用しかつ改行しまくっている例はほとんど見たことがないのだが)https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/BIN/twtl.sh#L297
↑こことかでは
command1 |
command2 |
command3 |
command4
という書き方になっている。
俺はこっちの書式のほうが見慣れているので,自分のシェルスクリプトもこういう書き方でやっているのだが,みなさんはどういう書き方がいいとかあるだろうか。あるいはGoogleとは別のところが発表してるシェルスクリプトのコーディング規約とかないだろうか。
0182デフォルトの名無しさん垢版2018/08/18(土) 17:22:24.47ID:rQWtSS3z
一応俺の意見: 後者の利点としては,バックスラッシュが不要なこととコマンドが行頭に来て流れを掴みやすいということがある。
加えて簡易的なデバッグするときに,前者は
command1 \
 | command2 \
 | cat
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
cat
# command3 |
# command4
このように「新しい行を挿入してcatを入力」という単純な動作ができるので,例えばVimやEmacsなどマクロが作れるエディタなどでのデバッグ用の編集に有用というのもある。
実際俺はシェルスクリプトに関してはIDEを使わずVimで開発していて,この類のマクロを作成して便利に使っている。
長文すまん
[1]: http://google.github.io/styleguide/shell.xml#Pipelines
0183デフォルトの名無しさん垢版2018/08/18(土) 18:05:23.17ID:5BnyFmRJ
簡易的なデバッグするときに前者は
command1 \
 | command2 \
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
# command3 |
# command4
のように行頭に#をいれるだけではSyntax errorになるから前者の方がデバッグなど編集に有用とも言える

個人的には大差ないと思う
0184デフォルトの名無しさん垢版2018/08/18(土) 18:29:20.16ID:LW/iu6SG
末尾にバックスラッシュを入れることで次行を見なくても明確にコマンドが続くことがわかるから前者を支持する
0186デフォルトの名無しさん垢版2018/08/18(土) 19:19:56.79ID:rQWtSS3z
>>184
でも>>183のように,コメントアウトすると
「末尾にバックスラッシュがあっても後ろにコマンドがない(実行されない)」
という状況がありえる以上,
末尾のバックスラッシュの有無を過信するのはよくないと思う。
もちろん気をつければいい話だが。

なんというか,ハンガリアン記法の間違って流布された方法に近しい危険性がある
(変数i_VARを見て,本当はfloat型なのにint型だと思い込む)
0187デフォルトの名無しさん垢版2018/08/18(土) 19:21:44.26ID:rQWtSS3z
ていうか少なくとも二人くらいは
後者の方式に賛同してるのか。

Googleもそっちを推奨してるし,俺も手癖を直すべきなのかな。
0188デフォルトの名無しさん垢版2018/08/18(土) 20:18:01.73ID:pAmB63kN
>>184
それ、末尾にパイプ記号あるから〜
と同じことじゃね?
個人的には見栄え的には前者の方を採用したいが余計な継続記号が不要な後者で書いてる
0191デフォルトの名無しさん垢版2018/08/19(日) 01:23:37.19ID:A4xH6fb7
バックスラッシュで行継続(改行)って多くの言語で採用されているから
多くの人はパイプ先頭、バックスラッシュ行末じゃないかな?
0192デフォルトの名無しさん垢版2018/08/19(日) 02:52:07.69ID:YqoTvka6
俺は1行か2行くらいなら後者だな。
何行もずらずら並べるなら中括弧で囲んでパイプ記号を先頭に持ってくるかも。
行末にバックスラッシュを置いて行継続はあまり美しくないと思うのでなるべく書きたくない。

>>191
構文的に行末で文(言語によっては式)が完結できていれば行末を文の終わりとみなし
そうでなければ次の行に継続、というのもshそのものをはじめpython, JavaScriptなど多くの言語で採用されているよ。
(pythonはshと同じく行末バックスラッシュで継続もできるが)
更にRubyは行の終わりで完結できるように見えても次の行の先頭を見てどうするか決めていたりする。
0193デフォルトの名無しさん垢版2018/08/19(日) 04:00:58.03ID:O9LemqF2
>>190
無知ながら初耳だった。
scshの説明をざっと読んだけど、今回の問題の解決になる?
むしろ「括弧の前で改行するかいなか」みたいな新たな規約が生まれそうじゃない?
0195デフォルトの名無しさん垢版2018/08/19(日) 19:55:46.26ID:O9LemqF2
シェルスクリプトの話題からちょっと外れるんだけど
$ somecmd --help
としたときの手引きって標準エラー出力に出力すべき?
GNU Coreutilsでは基本的に標準出力なんだけど……。
0196デフォルトの名無しさん垢版2018/08/19(日) 20:37:51.45ID:6q4oK8R8
stderr だとページャにつなげたい時に

$ somecmd --help 2>&1 | $PAGER

とかするのが面倒。でも zsh とかだとエイリアスで
どうにかできるんだっけ?
0204デフォルトの名無しさん垢版2018/08/20(月) 03:32:09.94ID:OmELABLW
まあ>>201はそんな大層な意味で言ってるわけではないだろ。単にbashしか使ってない使い込んでるってだけの意味だろう。無知でしたという
0205デフォルトの名無しさん垢版2018/08/20(月) 03:46:49.27ID:GIvuOFoC
--helpで思い出したけど、あれって書き方ってあるの?

usageの書き方とかオプションの書き方とか
引数は大文字にするの?とか [ファイル]... とかの[] とか ... の使い方とか
あるようで、バラバラな気もしている
0208デフォルトの名無しさん垢版2018/08/23(木) 05:30:33.48ID:L+hDtmKU
シェルスクリプトの言語にJavaScriptってアリだと思う?
#! /usr/local/bin/js24
みたいなシェバンでさ。
0209デフォルトの名無しさん垢版2018/08/23(木) 05:39:54.64ID:ncZgpeak
シェルスクリプトっていうのは
シェルとして実用に堪えるものじゃないとダメ
名前の通り

コマンドを呼び出すのに、いちいちsystem関数を
使うとかいうのは、シェルとして使えない

ls だけでlsコマンドを実行できるようにしたら
シェルスクリプトと認めてもいいが
0210デフォルトの名無しさん垢版2018/08/23(木) 07:32:38.64ID:d2Ifs7B7
>>208
ナシだと思う
0211デフォルトの名無しさん垢版2018/08/23(木) 07:38:44.84ID:1n1CeI2l
シェルスクリプトというより、他のインタプリタ言語と同じようにコマンド(内容)記述用としてあっていいって話だろう
0212デフォルトの名無しさん垢版2018/08/23(木) 08:56:23.64ID:AY9SoYfw
普通にやるだろ。
#!/usr/bin/awk -f
とかだってたまにはやるぞ。
「#」がコメント扱いになる言語なら
気にせずどんどんやればいい。

そもそもshebangはUNIX上で「スクリプト言語」を呼び出す時の記法であって
現代UNIXではシェルは一切関与しないカーネルの機能だから
「シェルスクリプト」なんかじゃない。
(つまり実はスレ違い)
なお昔のSystem-V系UNIXにはカーネルにこの機能がなくexec(2)が失敗するので、
その場合にはシェルが代行してスクリプトのインタープリターをよびだしていた。
そういうUNIXはほぼ滅びたけどシェル側にはまだこの代行機能が残っていたりする。

シェルは関与しないのにshell-bangなんて変な名前だけど、
この言い方自体比較的新しくて、実装されてからだいぶ長い間名前がなかったんだよ。
普通はカーネルが処理しててシェルは関係ないってことを
知らない奴がつけた名前じゃないかと前から疑問に思ってる。
0213デフォルトの名無しさん垢版2018/08/23(木) 09:39:55.05ID:ncZgpeak
>>212

> 普通にやるだろ。
> #!/usr/bin/awk -f
> とかだってたまにはやるぞ。

落ち着け

それはスクリプト言語だ
"シェル"スクリプト言語ではない
0214デフォルトの名無しさん垢版2018/08/23(木) 09:45:44.18ID:ncZgpeak
> シェルは関与しないのにshell-bangなんて変な名前だけど、
shebang を shell-bangの略だと主張する人は少数派だよ
0217デフォルトの名無しさん垢版2018/08/23(木) 13:18:49.52ID:cYcyOMDR
スクリプト
スクリプトスクリプト
スクリプトスクリプトスクリプト
スクリプトスクリプトスクリプトスクリプト 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0219デフォルトの名無しさん垢版2018/08/23(木) 14:59:38.25ID:AY9SoYfw
>>214
shebang の e って何から来てるの?
俺は shell から来てるんだと思ってた。

なお shabang という書き方も少数派だが使われてはいるみたい。
実際 sharp-bang なわけで、こっちなら分かる。
shabang ならシバンじゃなくて、シャバンだよな。
シャバ〜ン。
0223デフォルトの名無しさん垢版2018/08/23(木) 15:13:13.81ID:eJiCstIz
なんというか、ヒーローの名前のようだ。
0226デフォルトの名無しさん垢版2018/08/23(木) 16:45:35.96ID:ssILkLQJ
宇宙刑事シャバン
0230デフォルトの名無しさん垢版2018/08/23(木) 18:43:16.20ID:1n1CeI2l
>>219
#! -> sharp-bang -> shabang -> 単語ならshellだしすでにあるとても似たshebangでいいんじゃね、shebangの意味自体が似合ってるし
とか。shebangというれっきとした単語の由来は別にある
0234219垢版2018/08/24(金) 08:55:32.25ID:57yPHNQD
>>232
>>227 が元ネタ。
ギャバン/シャリバンのバンと、シャリバン/シャイダーのシャと、
ギャバンのオープニング末尾のギャーバーン♪
からの連想でシャーバンと書いた。
残りは歌詞検索とかすると分かる。

こんな連想するの俺だけかと思ったら他にも複数いてワラタ
0235デフォルトの名無しさん垢版2018/08/24(金) 09:13:07.93ID:LbFHGrVQ
>>234
男なんだろ?
の一言でギャバンOPテーマとわかるのはギャバン世代というよりもFLASH黄金世代な予感
実際俺はギャバンじゃなく当時の面白FLASHギャバソで知った
0236219垢版2018/08/24(金) 09:35:23.98ID:57yPHNQD
>>235
そんなFLASHがあったのか。
4月のAnisonDaysに串田アキラが出てギャバンのOPを歌ってたから、
それで記憶が蘇ってる人もいるかも。
てゆうかそれ俺。
0237デフォルトの名無しさん垢版2018/08/24(金) 10:43:03.55ID:wXpFbMeR
そして>>228の癒着というのはケロロ軍曹の登場人物
556(コゴロー)が変身するときのセリフ
元ネタはギャバンが変身するときに言うセリフの蒸着
40代ならここまで連想する
0238デフォルトの名無しさん垢版2018/08/24(金) 10:59:15.82ID:4te4jIm4
蒸着の元ネタってギャバンだったのか…
DeadSpaceのアーマー更新シーンを蒸着言うやついたけど元ネタあったんだな
0241デフォルトの名無しさん垢版2018/08/24(金) 19:44:16.61ID:Gfkbj1yB
バッチファイルやパワーシェルもシェルスクリプトですか?
何言語っていうんでしょうか?
0243デフォルトの名無しさん垢版2018/08/24(金) 19:54:12.80ID:Gfkbj1yB
静かに
0245デフォルトの名無しさん垢版2018/08/24(金) 22:34:41.93ID:UXXFLepR
>>241
バッチファイルはシェルスクリプトには入れないなあ。
PowerShellの方は、PowerShellスクリプトって言うな俺は。
0248デフォルトの名無しさん垢版2018/08/25(土) 12:16:23.36ID:zrQnMjpj
ちゃんとした定義は知らんが、
シェルスクリプト=.sh
バッチファイル=.bat
と大抵は認識してそうな印象
0250デフォルトの名無しさん垢版2018/08/25(土) 14:43:10.95ID:0Hfq0tYW
シェル スクリプトと言えばだから違うくね。バッチファイルをシェルスクリプト(ファイル)と実際に呼んでるヤツを見たことはないな
command.com自体が原始的でシェルのように打ち込んでってってのも見ない。あれはやっぱりバッチファイルを作るためのでしかないってうすうすわかっているからじゃねとか
0251デフォルトの名無しさん垢版2018/08/25(土) 14:47:50.16ID:TgLfCzAb
>>250
最初から結果ありきで書くなよ。単にお前がバッチファイルをシェルスクリプトに入れないためのこじつけを
お前が考えてるだけじゃねーか

wikipediaにも書いてあるし

> スクリプト言語の一種は、ジョブ制御の自動化から生み出されたもので、システムプログラムの起動と制御を行う。
> そういう意味ではシェルの祖先としてIBMの Job Control Language(JCL、ジョブ制御言語)があるとも言える。
> この種の言語の処理系(インタプリタ)の多くは、UNIXのシェルやMS-DOSのCOMMAND.COMといった
> コマンドラインインタプリタと呼ばれるものである。
0253デフォルトの名無しさん垢版2018/08/25(土) 14:51:47.98ID:0Hfq0tYW
>>251
「実際」にだよ。お前の周りでバッチファイルをシェルスクリプトと呼んでいるヤツいるの?
呼んでもいないのになぜそんなとこに拘る。バッチファイルはバッチファイル、Unix系のはシェルスクリプトはシェルスクリプトでええやん

逆にシェルスクリプトで書かれたはファイルをバッチファイルとなぜ呼ばないまでこだわれよ、だったらw
0258デフォルトの名無しさん垢版2018/08/25(土) 17:13:00.55ID:aJ7Wjpaw
バッチファイル=バッチスクリプトであってる?
バッチファイル=シェルスクリプトはまちがえ?
0259デフォルトの名無しさん垢版2018/08/25(土) 17:34:24.45ID:TgLfCzAb
>>258
シェルスクリプトというカテゴリがあって、
その中で、特別に言語を指定する場合は、
bashスクリプトやバッチファイルなどという具体的な呼び方をしている

バッチファイル = シェルスクリプト ではなく
バッチファイルはシェルスクリプトに含まれる
0260デフォルトの名無しさん垢版2018/08/25(土) 17:57:18.64ID:0Hfq0tYW
>>258
バッチファイルを作るための制御文なんぞを特に命名はしてないんじゃないの。バッチファイルというのがあってそれを作る/それで使える制御文は的な存在。誰も名前を言えないように

バッチファイルのバッチとは バッチ処理 という古典的コンピュータ用語。MS-DOS/Microsoft上でバッチ処理を書いたファイル/バッチ処理のファイルということで、バッチファイルと名前付けしたにすぎない

シェルスクリプトファイル、シェルスクリプトで書かれたコマンドも、広義ではバッチ処理のファイルなのでバッチファイルと呼べるが、そんな呼び方をする人はいない
そもそもシェルやシェルスクリプトだって、Unixでそう呼んだからにすぎないんだけど、どうして一緒くたにしたがるのかわけわからん

てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレでバッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?てか、そんなトンチンカンが現れたことがないんだから、わかるようなもんだと思うけど
0261デフォルトの名無しさん垢版2018/08/25(土) 18:06:28.42ID:0Hfq0tYW
>>260
>バッチファイルと呼べるが、そんな呼び方をする人はいない
サーバーなんぞの1日深夜1回とか1週間に1回のごちゃごちゃ処理するのを呼んだりしているかもしれない。そういう狭義のある意味全くもってなバッチ処理を記述したファイルという意味で
0262デフォルトの名無しさん垢版2018/08/25(土) 18:11:40.65ID:TgLfCzAb
> てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレで
> バッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?

なにか問題でも?

>>2
> ・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
> csh/tcshでのシェルスクリプトは*まったく推奨しません*。

などと書いてあるから、バッチファイルと明記して書けば問題ないでしょ?
0263デフォルトの名無しさん垢版2018/08/25(土) 18:18:00.15ID:0Hfq0tYW
なにそれw
無茶苦茶やな。書かなくても誰もがわかっていたからそんなのが出てない書く必要もないという事実を無視して自説のためにでしかないやん
0264デフォルトの名無しさん垢版2018/08/25(土) 18:22:59.07ID:TgLfCzAb
なにいってんだか。

バッチファイルという名前が有名だから、普段はそっちの名前で読んでるだけで
cmd.exeはシェルだし、シェル上で動く言語という定義なんだから、
シェルスクリプトに当てはまるという至極まっとうなことを言ってるだけ
0265デフォルトの名無しさん垢版2018/08/25(土) 18:29:18.68ID:0Hfq0tYW
>シェルスクリプトに当てはまるという
だから?で?それが何かの役に立つというか意味があるのか?ってことだよ。別に当てはまろうが当てはまらないだろうが意味ないだろう??

バッチファイルといえばアレで、シェルスクリプトといえばコレでいいことやん。それでなにも問題もなくうまくもいってるってのが、このスレででもっていう

バッチファイルをここで話題にしたがってるの??ww
0268デフォルトの名無しさん垢版2018/08/25(土) 18:33:12.36ID:zrQnMjpj
cmd=シェルってのがピンとこないんだよな
大体シェル=シェルスクリプトみたいな使い方してるからなんだけどさ
0270デフォルトの名無しさん垢版2018/08/25(土) 18:37:31.47ID:0Hfq0tYW
薄いな。なんでそんなに拘る。意味がないのはあんた個人に対してだよ
バッチファイルがシェルスクリプでもなければならない意味を言いなさい
0271デフォルトの名無しさん垢版2018/08/25(土) 18:42:40.13ID:0r5h6/lL
コマンドラインインタープリタを自動化したもんを
シェルスクリプトとというの

頭悪いバカのみんな分かった?

当然、バッチファイルもシェルスクリプト

わかった?
0272デフォルトの名無しさん垢版2018/08/25(土) 18:43:26.08ID:0Hfq0tYW
>>268
Unixでsh(系=シェル)を使うと、貧弱なにもできないって感じからcmd=シェルとはピンとこないこともあるな
シェルを起動してとは言わんし。てか大体の記事とかでも、いや、Microsoftでさえシェルとは呼んではく、Command Promptだからね
0273デフォルトの名無しさん垢版2018/08/25(土) 18:49:15.78ID:TgLfCzAb
>>270
普通にcmd.exeがシェルだし、そのシェルの言語で動くんだから
シェルスクリプトですってだけだが?

なんでシェルスクリプトじゃだめなの?

> cmd=シェルとはピンとこないこともある
お前が本質をわかってないからだろうねw
0274デフォルトの名無しさん垢版2018/08/25(土) 18:50:24.91ID:TgLfCzAb
> 貧弱なにもできないって感じから
何もできないからなんだっていうんだろうか?

リダイレクトできるよ? パイプ使えるよ?
まさにシェルスクリプトの特徴だよね
0275デフォルトの名無しさん垢版2018/08/25(土) 18:53:58.18ID:0Hfq0tYW
>>273
さっぱりだな。だからそれの意味を教えなさい。そんなにづっと続けるのだから意味があるんでしょ?あなた個人に
それがさっぱりわからんのだよ。「はいはい、バッチファイルもシェルスクリプトだね、誰もそう呼ばないけど」で満足なの?

本質wwあなた個人の意味も言えないのに本質wwwって思ってしまうよ
0276デフォルトの名無しさん垢版2018/08/25(土) 18:56:00.29ID:0r5h6/lL
プリンタに内容がPDLのファイルをリダイレクトすれば
いまでも普通にコマンドプロンプトで印刷もできるからな

コマンドプロンプトでコマンドからなんでもできる
0277デフォルトの名無しさん垢版2018/08/25(土) 18:58:24.61ID:0Hfq0tYW
>>274
>Unixでsh(系=シェル)を使うと
って、言ってるのだけど。ああ...なんだ..MS好きか?単に

shとcmdの違い/使い勝手が天地なのは使えば明らかだと思うけど。shと同等にcmdを使ってるの?もしかしてsh使ってないとかはないよな?w
0278デフォルトの名無しさん垢版2018/08/25(土) 19:01:50.62ID:TgLfCzAb
>>277
だからなんで高機能なものがシェルスクリプトの定義だ
なんて思ってるのさ?
低機能なシェルスクリプトってだけだろ
つーか、なにができないとシェルスクリプトとは認められないって言ってるんだよ
お前の定義言ってみな。矛盾しないような。
0279デフォルトの名無しさん垢版2018/08/25(土) 19:10:24.45ID:0Hfq0tYW
>>278
一般的に、シェルスクリプトと言えばUnixが元のあれやこれや
一般的に、バッチファイルと言えばMS-DOS/Windows/Microsoftのあれやこれや
一般的に、バッチファイルと言えばわかるものをシュエルスクリプトとわざわざ言い換えはしない

シェルはもともとUnixでの言い出したことだし、sh(シェル)/cmd(コマンドプロンプト)でそれぞれ、シェルスクリプト/バッチファイルと呼んでいた

コマンドをインタラクティブで処理するやつをどうであれシェルと呼ぶ見方もあるだろうが、それは一般的ではないな。cmdはやっぱりCommand Promptなとことからも

ってとこ。別にバッチファイルはバッチファイルで何も問題がなく、わざわざシェルスクリプトと言い換える意味がわからん、混同という弊害もあるし
0280デフォルトの名無しさん垢版2018/08/25(土) 19:12:53.54ID:0r5h6/lL
まさにシェルがなにかついて記述されている

https://en.wikipedia.org/wiki/Shell_script

Typical operations performed by shell scripts include file manipulation, program execution, and printing text.
A script which sets up the environment, runs the program, and does any necessary cleanup, logging, etc. is called a wrapper.

The term is also used more generally to mean the automated mode of running an operating system shell;
in specific operating systems they are called other things such as 

 batch files (MSDos−Win95 stream, OS/2), 
 command procedures (VMS), 
 and shell scripts (Windows NT stream and third−party derivatives like 4NT?article is at cmd.exe),
 and mainframe operating systems

are associated with a number of terms.


バカの世界では違うらしい
0283デフォルトの名無しさん垢版2018/08/25(土) 19:32:11.87ID:TgLfCzAb
>>281
お前のために翻訳してやったぜ


> シェルスクリプトは、あるコンピュータプログラムによって実行されるように設計されたUnixシェル、
> コマンドラインインタプリタ。[1]シェルスクリプトのさまざまな方言は、スクリプト言語と見なされます。
> シェルスクリプトによって実行される一般的な操作には、ファイルの操作、プログラムの実行、
> およびテキストの印刷が含まれます。環境を設定し、プログラムを実行し、必要なクリーンアップやロギングなどをラッパーと呼びます。
>
> この用語は、より一般的には、オペレーティングシステムシェルを実行する自動モードを意味するためにも使用されます。
> 特定のオペレーティングシステムでは、バッチファイル(MSDos-Win95ストリーム、OS / 2)、
> コマンドプロシージャ(VMS)、シェルスクリプト(WindowsNTストリーム、4NTのようなサードパーティ製の派生品)などがあります
0284デフォルトの名無しさん垢版2018/08/25(土) 19:36:03.43ID:0Hfq0tYW
>>282
だーーかーらーー、今までのこのスレでバッチファイルの話をするやつなんていないことから、一般的だってお前にもわかるだろう

>>283
だーーかーらーー、その「一般的」って一般的ではない一般的だよw 他の全文読んでみ。どれだけバッチファイルに言及してる?そこだけだろ?
てかさ、お前の周りでバッチファイルをシェルスクリプトと言っているのそんなにいるの?
0285デフォルトの名無しさん垢版2018/08/25(土) 19:40:24.03ID:TgLfCzAb
>>284
? もともとこのスレはUnix板にあったし?
>>2にsh系前提って書いてあるし?

このスレの一般的じゃなくて、世間一般の
シェルスクリプトの定義の話をしようぜ?

なんならここでバッチファイルの内容を入れても良い
次から>>2の内容を書き換えてあげようか?
0286デフォルトの名無しさん垢版2018/08/25(土) 19:44:09.41ID:0Hfq0tYW
なんだろ。こんだけ世間擦れして、なんかどこぞの辞書的なとかが絶対ってこだわり続けるのは...あれかな??w

>>285
そういう無茶苦茶言えるのは、やっぱりアレだろなと思わざるを得ない
誰もそんなの望んではいないだろうと思われるけど。Unix板にあろうが「シェルスクリプト」でググって飛び込んできても不思議ではないな、あんたの言い分では
てかそのあんたの言っているその時点で暗にあんたもシェルスクリプトとバッチファイルは違うと認めてるようなもんなんだが、わからんだろうな
0288デフォルトの名無しさん垢版2018/08/25(土) 19:55:20.14ID:0Hfq0tYW
拗らせるぐらいなら参加しなきゃいいのにw
すげえな今までを全く無視して個人的にそうするという自己中ぶりは
0291デフォルトの名無しさん垢版2018/08/25(土) 20:04:48.84ID:0Hfq0tYW
広義ではバッチファイルをシェルスクリプトと呼べるかもしれないが、一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う方が多い
「一般的に」というのは「広義では」という場合にも使われるのを知っておこう

ただ、それだけのことなんだけどねえw
0292デフォルトの名無しさん垢版2018/08/25(土) 20:09:01.30ID:kfh++Yrt
バッチは別スレあるし、棲み分けすればええんとちゃう?
まあアスペのためにもスレタイにUNIXでも付けとく?
詳しくは>>2に入れておいて

あとUNIX板から移動したって事で>>1にはUNIX板の最終スレは残しておくか
0293デフォルトの名無しさん垢版2018/08/25(土) 20:10:14.67ID:A3V5N+C6
これは言い方を逆転させただけ


一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う方が多いが、
広義ではバッチファイルをシェルスクリプトと呼べる
0294デフォルトの名無しさん垢版2018/08/25(土) 20:10:31.78ID:9woB+JG6
UNIX、Windows、それぞれの文化の中での言い方なのに
何ムキになってるんだい?

UNIXの文化の中で、シェルスクリプトといえばsh系のスクリプトのことを通常は意味するだろう?
わざわざ、Windowsバッチファイルを「シェルスクリプト」と呼ぶことは、
英語圏の外国人が日本に来て、何故英語が通じないと言ってるようなもので、
UNIX文化圏の人から見たら、「何言ってんだこいつ」ということになる。

このスレがプログラム板に来たからといって、シェルスクリプト自体がUNIX文化であることには疑いなく、
正しいか正しくないかということとはまた別の問題なんだよ。
0300デフォルトの名無しさん垢版2018/08/25(土) 20:22:56.85ID:0r5h6/lL
まったくもって酷いことするヤツラがいるもんだ。。。
オレにはこんなことできない。。。
0301デフォルトの名無しさん垢版2018/08/25(土) 20:27:59.09ID:0r5h6/lL
シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/

シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/tech/1532397676/ ← このスレ

シェルスクリプト総合 その29
https://mevius.5ch.net/test/read.cgi/tech/1535194140/

【POSIX】 sh系互換 シェルスクリプトスレ
https://mevius.5ch.net/test/read.cgi/tech/1535195112/

乱立しすぎてなにがなんだか
分からない
0302デフォルトの名無しさん垢版2018/08/25(土) 20:34:30.34ID:9woB+JG6
件の輩、ドザの工作員と考えないと説明がつかないw
ご本人に住み分けを含めて説明してもらわないと
0305デフォルトの名無しさん垢版2018/08/25(土) 23:23:09.52ID:zrQnMjpj
まぁこういうことがあるからワッチョイ導入しようってなったんだし
ここにきた選択は間違ってはいなかったな
0306デフォルトの名無しさん垢版2018/08/25(土) 23:44:11.66ID:9woB+JG6
ID:TgLfCzAb  抽出レス数:14
ID:9FNycoly  抽出レス数:1 → シェルスクリプト総合 その29
ID:A3V5N+C6 抽出レス数:3 → 【POSIX】 sh系互換 シェルスクリプトスレ

IDの流れ(ダブりなし)からすると、同一人物のようだね。
アラシは一人だったってことだ。

これは推測にすぎないが、UNIX板の件のスレも同一人物の可能性が高いと思う。

後は件のスレをスルーして沈めておくのが懸命かな。
0308デフォルトの名無しさん垢版2018/08/26(日) 11:24:38.43ID:ylpyaNXE
>>251
JCLなつかしー

DD文でFORTRANのWRITE/READ文の装置番号と実際のファイルを対応させる記述すんだよね
だからOPEN/CLOSEなんて使わなかった

パソコンなら簡単なのにメインフレームは一々領域確保やらにゃならんから面倒だなと常々感じてた
0309デフォルトの名無しさん垢版2018/08/26(日) 15:08:48.37ID:r/93pdu8
つまりバッチ=シェルだけどシェルっていう人はすくないってことね
0312デフォルトの名無しさん垢版2018/08/26(日) 20:22:58.07ID:r/93pdu8
じゃあパワーシェルはシェルスクリプト?
それともWindowsはシェルとはいわないってこと?
0316デフォルトの名無しさん垢版2018/08/26(日) 23:10:38.66ID:ylpyaNXE
昔は仕事でバッチを沢山作ってきたけど
退職して、数十年、コマンドや、シェル一切忘れてしまった
再びシェルスクリプトやsed.awk,viリファレンス買い込んで復習中
昔はスクリプトといえば、Bshとawkしか知らなかったから、何やるにもawkスクリプトを何十行も書いてた
まあ、新規インストールの必要ないから客先の環境そのままでも動かせるから良かったんだけどね
大型のスーパーコンピュータで数十行のawkスクリプト動かすってのも何かシュールだったな
0320デフォルトの名無しさん垢版2018/08/27(月) 00:43:08.11ID:6cDpYi8T
POISXコマンドであるtput使ってればいいんじゃないの
tputの仕様上は、端末(というかTerminalアプリというか端末エミュレータ)までは知らんってことじゃないの
tputの仕様/機能を満たすために後は勝手にやってくれってことじゃないの。で、当然勝手にやってる、というか、それも標準的な方法でやってるだろう(だいたいはtermcap/terminfoとかベースで)
0327デフォルトの名無しさん垢版2018/08/27(月) 03:58:36.09ID:6cDpYi8T
直接、端末に問い合わせる
https://unix.stackexchange.com/questions/16578/resizable-serial-console-window
いちおう、POSIXコマンドオプション内ではあるな。まあ、端末種によって判断しのだけど、2つぐらいに集約されてんのかな?

C関数ではPOSIXのがあるので、ちっちゃいコマンドをCで書く

http://austingroupbugs.net/view.php?id=1053
らしい。時代を先取りして(?)気にせず >>322 を使う
0331デフォルトの名無しさん垢版2018/08/27(月) 07:11:24.04ID:i3Gxv5eF
>>317
組み込み向けでわざとない環境を作ったりすることはあるけど、
普通はあると仮定して問題ないよ。
総ディスク容量10MB以下のベル研UNIX の頃からあるコマンドだから。
0332デフォルトの名無しさん垢版2018/08/27(月) 07:46:41.74ID:y2YT/eYl
>>330
いやそうじゃなくてPOSIX標準に取り込まれるかどうかってことです
findの-print0オプションはこの間採用されたものの
対応するコマンドでナル文字区切りのデータを受け取れて,さらにそれを区切りとして解釈できるものが
awkくらいしかない状況なので
多くの拡張実装(BSDやGNU)で取り入れられているxargsコマンドの-0オプションが
POSIX標準にならないかな というのが知りたいのです。

そしてその情報をどう入手すればいいのか今迄分からなかったんですよ。
0333デフォルトの名無しさん垢版2018/08/27(月) 08:12:50.85ID:gOoey+yt
次期POSIXや将来のPOSIXで入れる入れない機能みたいな議論を知りたいってことでしょうか
0335デフォルトの名無しさん垢版2018/08/27(月) 13:54:28.91ID:i3Gxv5eF
>>334
ttp://austingroupbugs.net/view.php?id=244
を見ると追加する方向ではあるみたい。
でもレビュー中状態でもう7年近く止まってるから、いつになるやら。
0336デフォルトの名無しさん垢版2018/08/27(月) 13:58:31.29ID:6cDpYi8T
他にもあるけど、managerはあくまでも拒否って感じ。確か2015あたりのもあるけど、同じ応えばかりw
0338デフォルトの名無しさん垢版2018/08/27(月) 14:48:30.12ID:6cDpYi8T
0000251がファイル名に改行を認めるべきか認めないべきかっていうのがありの
んなのとっとと認めないでcloseすれば話が先にすすむのになって感じかなあ。議論が長いのでよくは読んではいない
0340デフォルトの名無しさん垢版2018/08/27(月) 20:40:23.57ID:y2YT/eYl
まあ互換性の最後の砦だから 新しい機能を付け足すのに慎重になりすぎることはないのかも
0341デフォルトの名無しさん垢版2018/08/27(月) 22:17:16.58ID:6cDpYi8T
>>339
dwheelerさんが問題解決を拗らせてると見えなくもないw
ファイル名に改行を認めないで、改行をNULLの代わりにxargsが対応すれば済むような。readはマズいのかなと思うがNULLと改行が同時に必要ってあるのかな??
0344デフォルトの名無しさん垢版2018/08/27(月) 22:36:28.15ID:6cDpYi8T
>>343
議論でEBICDICでとかあったが、そんなのももういらないUnicodeでいいやんここ(5ch)もいい加減Shift-JISを捨ててUnicodeにしやがれっ

あるの?知らん。あったら他でも問題あったりするんじゃないのかなあ。dwheelerさんもそんな感じで重箱の隅的なwなのになぜか-0や-print0はええやん的な
0345デフォルトの名無しさん垢版2018/08/27(月) 22:39:24.93ID:i3Gxv5eF
>>343
UNIXでサポートされてる既存のエンコーディングにそういうのはないし、
今後もサポートされないと思う。
0346デフォルトの名無しさん垢版2018/08/27(月) 22:59:48.13ID:zX+eejgv
COLUMNS LINES でいいわけがない
xtermみたいなターミナルエミュレータでも普通にリサイズされるからな
しらん間にサイズが変更されるttyなんかいくらでもある

ttyのサイズについて、常に正しい値を取得したい場合は
常にttyのサイズが変更されたシグナル(SIGWINCH)を受け取るようにして
毎回、COLUMNS LINESの環境変数を更新し続けるとか工夫しないと難しい

 ↓こんな感じのやりかた
 trap 'COLUMNS=$(tput cols) LINES=$(tput lines)' WINCH

あとはioctrlでTIOCGWINSZをじかにとるぐらいしか思い付かない
0347デフォルトの名無しさん垢版2018/08/27(月) 23:13:57.46ID:6cDpYi8T
>>346
俺の環境では、COLUMNS LINES が自動で変わるけどな。サーバーにssh接続して、クライアントでウィンドウサイズ変えても、ちゃんとサーバー側shellでのCOLUMNS LINESは
ので、それが当たり前かと思ってたよw xtermでもやりゃできるんじゃないのってか、そんな古いのは対応しないのかな
0349デフォルトの名無しさん垢版2018/08/27(月) 23:18:21.35ID:zX+eejgv
いやsshでの接続なら普通に対応してるからな
0350デフォルトの名無しさん垢版2018/08/27(月) 23:21:50.19ID:6cDpYi8T
なるほど!逆にローカルでは何もしないのか。なるほど。なんでやねんっ!xtermのせいか
0351デフォルトの名無しさん垢版2018/08/27(月) 23:23:01.18ID:zX+eejgv
xtermが対応してるとか
そういう問題じゃないからな
ttyはただのダム端末だからな

xtermみたいにサイズを変更できるターミナルがあって
それに対応できるかどうかという問題になる
0352デフォルトの名無しさん垢版2018/08/27(月) 23:25:15.75ID:6cDpYi8T
TTYの幅とかの概念あるの?行はまず無いでしょ。TTYの話じゃないよ
Terminalアプリでローカルでもちゃんとしているのはあるけど?
0353デフォルトの名無しさん垢版2018/08/27(月) 23:29:04.05ID:zX+eejgv
ただな幅の情報が取得できないと
cursorライブラリなんか使えない

ウィンドウサイズが端末の幅とか関係なく
好き放題サイズを設定できるとしても
使いようがない
0354デフォルトの名無しさん垢版2018/08/27(月) 23:31:24.22ID:zX+eejgv
ターミナルはエコーされた文字を
標準出力や標準エラー出力に出力するだけだからな
0356デフォルトの名無しさん垢版2018/08/27(月) 23:34:19.94ID:zX+eejgv
オレはxtermを例にあげただけで
xtermだけじゃない
puttyでもTeratermでもなんでもいい
0357デフォルトの名無しさん垢版2018/08/27(月) 23:35:13.23ID:zX+eejgv
昔のwindowsに附属してた
telnetでもいい
0358デフォルトの名無しさん垢版2018/08/27(月) 23:36:58.83ID:6cDpYi8T
あー...
ちょっとLinuxのでも使ってみ。今時は違うから。まあ、そゆのも対象にしたら使えないかもね
0359デフォルトの名無しさん垢版2018/08/27(月) 23:38:30.97ID:6cDpYi8T
telnetって...
まあ、そんな古いのを対象にしたらそかもね。なにかPOSIXの貧弱さに通じるものがあるなw
0360デフォルトの名無しさん垢版2018/08/27(月) 23:39:06.12ID:zX+eejgv
むしろ物理コンソールで計算機さわることのほうが希だからな
まずサーバーだったらxなんか立ちあげることなんかありえないから
xを使うようターミナルエミュレータを使う機会なんかまずない
0361デフォルトの名無しさん垢版2018/08/27(月) 23:40:16.59ID:zX+eejgv
趣味や遊びで使う分にはいいかもしれないどな
仕事で使う場合そんな使い方はまずしない
0362デフォルトの名無しさん垢版2018/08/27(月) 23:40:52.92ID:6cDpYi8T
だったら、今時はssh接続一択じゃないんじゃないかなあ。それで万事解決のようなww
puttyでもTeratermでもssh接続ならちゃんとしているのでしょ?
0363デフォルトの名無しさん垢版2018/08/27(月) 23:42:31.94ID:6cDpYi8T
仕事ならなおさらssh接続一択のような。まあ、仕事では未だにtelnetでしかとかいうとこがあるかもしれないが、そうじゃないのは趣味や遊びと決めつけるあたり、ホントに仕事でやってんの?と疑問
0364デフォルトの名無しさん垢版2018/08/27(月) 23:43:41.66ID:zX+eejgv
わかったか
オマエがニートだと思ったから
それようの書き方してる

わかってしまうのが怖い
0366デフォルトの名無しさん垢版2018/08/27(月) 23:48:48.71ID:zX+eejgv
telnet(オレはターミナルの例としてあげただけだ)はないにしても
xサーバーたちあげることはまずない

そんなもん使ってみればいいとか勧めてるいってる時点でな
残念なことに大体察しはつく
0367デフォルトの名無しさん垢版2018/08/27(月) 23:50:47.78ID:6cDpYi8T
Xサーバー??何を言っているのか。Windows前提絶対でモノ言っているでしょ?Windowsつかわなきゃ仕事じゃないと言っているわけ??
Windowsでウィンドウシステムが起動してそれを使ってるのと同じだよ。Windows以外でも
0368デフォルトの名無しさん垢版2018/08/27(月) 23:54:58.42ID:6cDpYi8T
てか、なんでこのスレでWindows前提絶対やねんっ。別にいいけど、他の作業環境を知らない認めないのはナイな
0369デフォルトの名無しさん垢版2018/08/27(月) 23:59:33.83ID:zX+eejgv
なにをいってるのか って?
オマエがいってることが意味がわからんわ

Xサーバーたちあげないで
どうやってそのUNIXライクな計算機のwindowを表示するワケ

なにも分かってない頭悪いのが使ったつもりになってるのが分かったわ
コレはもう確定
0370デフォルトの名無しさん垢版2018/08/28(火) 00:04:36.83ID:Hq0PMDIz
Linuxデスクトップでは普通に起動するでしょ?別に起動するって意識しなくて。Windowsでウィンドウシステムが起動しているのと同じだよ
このスレなんだから、Linuxメインで使っているのいてもおかしくもなんもないだろうにってことだけど?
Linuxを勧めるから仕事じゃないってw 俺のはLinuxでもWindowsでもないけど仕事でもよく/それなりに使われているんだけどなあ
0371デフォルトの名無しさん垢版2018/08/28(火) 00:09:02.63ID:hby/BPp+
Linuxデスクトップとな。。。
ちなみにX端末ってなにかわかる?
0373デフォルトの名無しさん垢版2018/08/28(火) 00:12:57.46ID:Hq0PMDIz
なんか老害?自分の古い知識でそれ前提絶対的なwもっと視野を広げた方がいいような。コンピュータ好きなら
0374デフォルトの名無しさん垢版2018/08/28(火) 00:13:46.49ID:hby/BPp+
まあた始まった
クソニートなの
もうバレてんのに
0375デフォルトの名無しさん垢版2018/08/28(火) 00:15:11.79ID:Hq0PMDIz
いや、いうか躊躇はしてたけど、あんたがそういうのを言い出しているんだけど
さすがに>>371>>372のことを言っているようで、堪えられなかったw
0378デフォルトの名無しさん垢版2018/08/28(火) 06:15:37.18ID:xeMH1v/N
半角くん、こっちにいたのか。
よかったら「cursorライブラリ」のことを教えてくれないか?
curses なら知ってるんだが、俺は無知なんだ。
0380デフォルトの名無しさん垢版2018/08/28(火) 09:10:20.79ID:yK6EJuSE
ウィンドウサイズ変えてもCOLUMNS LINESに正しい値が入ってるのは
親プロセスである対話的シェルがSIGWINCHハンドラで設定してくれてるからでしょ。
太古の昔の商用UNIXの/bin/shは設定してくれなかった気がする。
現代でも親プロセスがシェルじゃない場合には、
正しく設定されてない可能性がある。

まあシェルスクリプトならCOLUMNS LINES がもし設定されていれば
それを使えばいいとは思うけどね。
0382デフォルトの名無しさん垢版2018/08/28(火) 18:07:03.95ID:+71nChns
シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。

ですが、例えば cp みたいに、cp -a a b とかけるが
cp a -a b や cp a b -a というふうにオプションの順番を入れ替えても動くとか

gitみたいにサブコマンドが使えて、
git --no-pager log --stat のように--no-pagerはgitのオプション、
--statはlogのオプションみたいにする方法がよくわかりません

頑張ればできると思いますが、複雑になりそうです。
なにかいい方法はないでしょうか?

なお他言語を使うとか言うのは禁止です。
0383デフォルトの名無しさん垢版2018/08/28(火) 18:11:08.70ID:+71nChns
忘れてましたが、 ls ーal でも ls ーla みたいな書き方にも対応したいし、
git --exec-path=path でも git --exec-path path でも良かったりとか
git --exec-path でもOKとか、みんなどうやって引数解析してるんでしょうか?
0384デフォルトの名無しさん垢版2018/08/28(火) 19:06:24.55ID:C1AWmFJx
みんなは頑張ってやっている。
頑張らないでやる方法は他の言語とライブラリを使う。
0385デフォルトの名無しさん垢版2018/08/28(火) 21:17:43.19ID:gikJ8/5D
あなたとしてはgetopt(1)はシェルスクリプトとは別の言語ではないのかな?
思いきり外部コマンドなんだけど……。
0387デフォルトの名無しさん垢版2018/08/28(火) 21:30:00.13ID:Hq0PMDIz
Cで書かれたものを例に出している時点で変だけどな。それで他言語を使うとか言うのは禁止とか
まあ、シェルスクリプトでも頑張ってる人はググればすぐ出てくるな
0389デフォルトの名無しさん垢版2018/08/28(火) 21:42:55.17ID:gikJ8/5D
オプション解析とはまったく関係ないんだが

確かこのスレかその前あたりでaliasの可能性について論じてた人がいたよね
あれどうなったのかな。個人的にすごく興味がある。
0393デフォルトの名無しさん垢版2018/08/28(火) 22:09:30.12ID:+71nChns
>>388
何が終了なのかよくわかりませんが、
getoptを使えなんて言ってないですよ?
少し考えてください。
0395デフォルトの名無しさん垢版2018/08/28(火) 22:19:33.48ID:gikJ8/5D
>>393
もうちょっと勉強したら?
俺 学部生だぜ? ガキに知識で負けてくやしいよね?

OpenGroupっていうのはさ POSIXを制定している企業なんだわ。
つまりそこがPOSIX標準を定めてるってこと。
だからgetopt(3)はPOSIXに準拠したオプション解析器ってことだ。
どう? 理解した? これでも分からなきゃ相当 馬鹿 だなお前は。
0397デフォルトの名無しさん垢版2018/08/28(火) 22:36:33.43ID:+71nChns
>>395
いや、知ってるけど、何にレスしてるのかわからん。

あー、>>382

> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
> getoptとかgetoptsがあるのは知っています。

↑この行が見えてなかったのか。

だから「getoptってのがあるで(ドヤー)」って
書き込んだのね。そういうことか

あのね、getoptだけを使っても、gitのような複雑な
オプションを解析するのは大変なんだよ
0398デフォルトの名無しさん垢版2018/08/28(火) 22:41:19.86ID:+71nChns
>>387
> Cで書かれたものを例に出している時点で変だけどな。

それな。C言語の話もしてないのに、
なんでそれ持ってきたのかもわからん

なんか根本的なところで勘違いしてる気がする。
まあ所詮学生だしな
0399デフォルトの名無しさん垢版2018/08/28(火) 22:47:19.25ID:Hq0PMDIz
>>398
ww ズレすぎ。あんたのようなヤツなんていない。いたら怖いわっw
いちおう、念のために言っておくと、その引用されたのはあんたに対してだよ
0400デフォルトの名無しさん垢版2018/08/28(火) 22:49:42.88ID:+71nChns
>>399
え?なに?つーことはお前もずれてるじゃん

gitのようなオプション(つまりgitは例)を
シェルスクリプトで解析するって話なのに
なんでgitはC言語でかかれていますーなんて話になるの?
意味がわからんが、説明できる?
(学生さんは図星だったようでだまっちゃったみたいだけどさw)
0401デフォルトの名無しさん垢版2018/08/28(火) 22:53:12.08ID:Hq0PMDIz
Cで書かれてるのを例に出してるんだから、Cでまずはだろう。そこすっとばして、どうやってんのシェルでって意味通じないよ

てか、ちょっと素が出てきてるねえって感じ。ご苦労さん。なにしたいねん
0402デフォルトの名無しさん垢版2018/08/28(火) 22:54:52.38ID:+71nChns
>>401

>>382で真っ先に

> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
> getoptとかgetoptsがあるのは知っています。

って書いてあるんだが、どこからC言語の話が出てきたの?
0403デフォルトの名無しさん垢版2018/08/28(火) 22:57:40.65ID:+71nChns
もしかして、オプションの例として、gitのこういうオプションを
シェルスクリプト取り扱いたいですって言ったから、
C言語の話をしてると思ったの?
0404デフォルトの名無しさん垢版2018/08/28(火) 23:00:52.68ID:Hq0PMDIz
マジなのか?うそだろーw
>gitみたいにサブコマンドが使えて、
>git --no-pager log --stat のように--no-pagerはgitのオプション、
>--statはlogのオプションみたいにする方法がよくわかりません

gitのをしたいんでしょ?する方法がよくわかりませんって、Cでやってるとこを言っているんでしょ?
ロングオプションにしたってそう。Cでやってることをどうやってるって聞いてんだから、Cの話だろうに

あえてあんたよりにすると、「シェルで実現するにはどうしたらいいですか、または、可能ですか?」だな
0405デフォルトの名無しさん垢版2018/08/28(火) 23:02:58.05ID:+71nChns
> gitのをしたいんでしょ?する方法がよくわかりませんって、Cでやってるとこを言っているんでしょ?

だからgitがCでやっているようなことを
シェリスクリプトでやりたいんですが?

> Cでやってることをどうやってるって聞いてんだから、Cの話だろうに
Cでやってることを(シェルスクリプトで)どうやるって聞いてんだから、シェルスクリプトの話だろうに

あと>>2を読もう
> ・シェルスクリプトのことをシェルってゆうな

はぁ、レベルの低いやつに目をつけあられたな
日本語もろくに理解できてない
0408デフォルトの名無しさん垢版2018/08/28(火) 23:06:22.48ID:+71nChns
> 頑張ればできると思いますが、複雑になりそうです。
と書いてるのに、

複雑になるのが嫌だということも読めていないようだ

Cのコードがシンプルならまだしも、複雑なものを見せて
シェルスクリプトでもCのまねして書け。複雑に書け
とか、全然答えになってないですわ
0412デフォルトの名無しさん垢版2018/08/28(火) 23:10:58.04ID:+71nChns
ん?まさかと思うが、git "みたいな" オプションを使いたいって話を
例だとわからずに、本当にgitのオプションをそのまま扱うとか
勘違いしてないか?

一行目に
> シェルスクリプトで引数を取り扱ういい方法はないでしょうか?

と書いてあるから、間違うわけ無いと思うが?

> gitみたいにサブコマンドが使えて、

と書いてるのに「みたい」って文字を見逃して、
まんまgitのオプションを扱う方法だと思いこんで、
gitのオプション扱うなら、C言語のソースみればいいだろとか?


うわー、そう理解してしまうのは本気でやばい。ダメな方に意味でやばい
0414デフォルトの名無しさん垢版2018/08/28(火) 23:14:57.35ID:+71nChns
仕切り直すわ。なんでこの文章で理解できないのかわからないが、
ちゃんと補足する。


シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。

くり返しいいます。

getoptとかgetoptsがあるのは知っています。


ですが、例えば cp みたいに、cp -a a b とかけるが
cp a -a b や cp a b -a というふうにオプションの順番を入れ替えても動くとか
(もちろんcpは例です。cpみたいなと言ってるわけで、cpのオプションを
扱いたいなんて言っていません)

gitみたいにサブコマンドが使えて、
git --no-pager log --stat のように--no-pagerはgitのオプション、
--statはlogのオプションみたいにする方法がよくわかりません
(もちろんgitは例です。gitみたいなと言ってるわけで、gitのオプションを
扱いたいなんて言っていません)

頑張ればできると思いますが、複雑になりそうです。
(gitのC言語のソースのような複雑なコードは書きたくないです)
なにかいい方法はないでしょうか?

なお他言語を使うとか言うのは禁止です。
0415デフォルトの名無しさん垢版2018/08/28(火) 23:17:00.32ID:gikJ8/5D
>>397
「知っています」(ただし使えるとは言っていない)
だろ? どうせ。

gitのオプション解析のソース覗いてみろ。そして俺にあやまるがいい
0418デフォルトの名無しさん垢版2018/08/28(火) 23:19:04.23ID:gikJ8/5D
だいたいgitがどうやってオプション解析してるかも知らずに
よくもまあぬけぬけと「getoptは使わない方針で」と言えたもんだな
いままでそんなゴミみたいな思考回路で生きてきて恥かしくないのかね
0419デフォルトの名無しさん垢版2018/08/28(火) 23:19:26.80ID:Hq0PMDIz
>>415
>そして俺にあやまるがいい
なんかウケたww

>gitのオプション解析のソース
見たらしいよ。ものすごい文句言われたw
0420デフォルトの名無しさん垢版2018/08/28(火) 23:20:08.62ID:gikJ8/5D
>>416
おまえがgitの例を執拗に提示したから悪いんだろ
シェルスクリプトでオプション解析する方法はあるが教えてほしければまず
自分の不手際を謝罪してからにしろ
0424デフォルトの名無しさん垢版2018/08/28(火) 23:21:55.96ID:gikJ8/5D
あーあ。
オプション解析なんてみんながやってることで
そしてそのノウハウもかなり溜ってるんだから
質問の仕方さえ間違えなければすぐさま希望する答えが手に入ったのにね

もったいない
お前のような人間はこれからずっと人生負け組だよww
0428デフォルトの名無しさん垢版2018/08/29(水) 05:00:00.96ID:byfOgvI+
他板でもそうですが回答側がアレですねw
夏休みで低年齢層が増えていたからでしょうか。
0429デフォルトの名無しさん垢版2018/08/29(水) 08:40:49.02ID:JKfxUNfw
IDやワッチョイのつけられる板に越してきた理由が、
こういう感じの無意味な応酬が目に余ったからだしな。
知性はあっても子供だよね。
IDがあってホント良かったよ。
0432デフォルトの名無しさん垢版2018/08/29(水) 14:43:49.86ID:dthpACHL
>>414
頑張って下さい。

ま、しかし、bashだと素のshよりはちょっと楽かな?
0434デフォルトの名無しさん垢版2018/08/29(水) 14:51:01.95ID:ND6xKvzt
シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。
頑張ればできると思いますが、複雑になりそうです。
0440デフォルトの名無しさん垢版2018/08/29(水) 17:22:27.53ID:zGukP1bd
良いプログラマーとは、楽をする為に労力を惜しまないそうです
今回はその労力をここでの問答に費やす訳ですから
粘り強く頑張って頂ければ良いのかなと思いました
0441デフォルトの名無しさん垢版2018/08/29(水) 20:56:07.12ID:zRPnCBM0
なにもしないのが一番楽
やっぱりアホしかいないわ
0447デフォルトの名無しさん垢版2018/08/30(木) 09:43:05.13ID:Le3eFjin
しかし引数解析ってそんなに頑張らなくても自作できるよなあ。面倒なだけで。
0454デフォルトの名無しさん垢版2018/08/30(木) 11:12:04.78ID:rxoSSaq5
> --longと書いたら-oと誤爆するgetopsしか
--は先に除外すればできるか。リンク先のコードではダメだけど
あとgetopt。これはbashだから、caseの二段構成にするしかないんかな
これを「普通にできる」とは思わんけど
0455デフォルトの名無しさん垢版2018/08/30(木) 11:13:00.09ID:8BsM3ej5
getoptはGNUとBSDでは別物。GNUのはロングオプションに対応してる。誤爆って?
getoptsはKorn/POSIX シェル組み込みコマンド(らしい)。ロングオプションは使えないが>>450を「普通」にやってくれる

ロングオプションと羅列を混同してるのか??
0456デフォルトの名無しさん垢版2018/08/30(木) 11:17:10.20ID:rxoSSaq5
やっぱりデメリットあるのか。
ロングオプションが使えないのはだめだね
できるけど、べつのことができない
0459デフォルトの名無しさん垢版2018/08/30(木) 11:24:37.49ID:rxoSSaq5
例えて言うなら、ケーキ食べられる?って聞いて
普通に食べられる(だけどパンは食べられないけどね)
みたいだなーってことだよ

確かにケーキ食べられる?が質問だし、食べられるのだろけど
それ以前のできて当然のものができないっていうのは
がっかりするしか無いなぁってこと
0462デフォルトの名無しさん垢版2018/08/30(木) 11:28:00.65ID:rxoSSaq5
こういうふうに、話の流れから当然だろ?と思うことも
いちいち全部言わないと、話ができないってのは
アスペなんだろうなって思う
0463デフォルトの名無しさん垢版2018/08/30(木) 11:30:29.24ID:8BsM3ej5
それはあんたの勝手な話の流れの解釈だな
俺は、>>450は今までとは違う初心者のぶっ込みでしかないと思うけど。ある意味新たな
てか、本題はもう終わってるだろう?あんたの勘違いでwそれを認めたくなくダラダラなだけだな
0464デフォルトの名無しさん垢版2018/08/30(木) 11:38:24.71ID:rxoSSaq5
>>463
なんか自分が初心者の質問を解決してあげたみたいに思ってるかもしれないけど、
getoptでそれができるよ(ただしロングオプションは使えないよ)って
教えてあげたのは俺だからね

あんたは普通にできるといっただけで、どうやってできるとは言ってない。
getoptという名前を出すと、すぐにロングオプションが使えないことも
わかってしまうからね。制限付きであることを隠したいから、名前を出さずに
普通にできるという言葉でごまかしたんでしょう?
0467デフォルトの名無しさん垢版2018/08/30(木) 12:05:25.60ID:8BsM3ej5
>>464
解決してあげたww。次の文とかからもそこが大事なのねwなるほど
俺は別にお前のように俺が俺がというのはないなあ。単なる雑談の一種でしかないな
なので、お前のその言っていること全体がイミフメイ。妄想するのは勝手だが、妄想をダダ漏れさせてぶつけられても困ります。あとは勝手にやっとくれ
0471デフォルトの名無しさん垢版2018/08/30(木) 12:55:18.44ID:8BsM3ej5
暇なのは否定しないが、雑談の「一種」と言っているのだけどな
すんなっていってるそれも雑談じゃないの?
0474デフォルトの名無しさん垢版2018/08/31(金) 04:38:19.15ID:6Alav1/S
ひらめいた!

prog -abcde
を引数解析するには
prog -a -b -c -d -e
に変換すればいいんじゃね?

【お題】
prog --foo -abcde --bar param

prog --foo -a -b -c -d -e --bar param
と実行したように見せかけるにはどうしたら良いか?
0478デフォルトの名無しさん垢版2018/08/31(金) 07:58:25.86ID:ii43Mx6H
バッチはシェルではないけどMSDOSはシェルなん?
0480デフォルトの名無しさん垢版2018/08/31(金) 08:44:41.63ID:csqJsH/K
>>478
MS-DOSはWindows以前に使われていたCLIベースのOSの名前
MS-DOSではcommand.comというシェルが使われいていた
バッチファイルはcommand.com用のシェルスクリプト
バッチファイルはバッチ処理を行うために使われていたシェルスクリプト

Windows 9x系でもcommand.comは存在しDOSプロンプトとも呼ばれる。
16bitアプリケーションでありMS-DOS互換環境を提供する役割もあった

Windows NT系ではMS-DOSが完全に廃止され、DOSプロンプトから
名前を変えてコマンドプロンプト(cmd.exe)が標準のCLIシェルとなった。
(32bit版では互換性のためにcommand.comも残っているが
NT系はMS-DOSが存在しないため、実行環境はWindows 95と大きく異なる)

まとめると
MS-DOS、Windows 9x(95, 98など)、Windows NT(XP、7、10など)がOSの名前
command.com、cmd.exeがシェルの名前
拡張子 .bat .cmd のファイルが、バッチファイル
バッチファイルで行う処理がバッチ(処理)
シェルでバッチ処理を行うためのスクリプトがシェルスクリプト
0481デフォルトの名無しさん垢版2018/08/31(金) 12:15:59.98ID:4WvfdMT+
めっちゃ早口で言ってそう
0482デフォルトの名無しさん垢版2018/08/31(金) 12:54:57.94ID:hD6bHOXY
録音してゆっくり再生してようやっと何言ってるかわかる、ぐらいかな
0483デフォルトの名無しさん垢版2018/08/31(金) 13:05:55.30ID:DXKxWv2O
>>481-482
本当に自覚してないようだから教えてあげるけど
そういうくだらない雑談をよそでやんなさいって言ってんの。

それともそのレスになにか価値があるというのなら
どうぞいってください。話を聞くよ?
0485デフォルトの名無しさん垢版2018/08/31(金) 13:42:20.88ID:hD6bHOXY
このスレは君が価値を感じる書き込みをしなければならないスレではない。
0486デフォルトの名無しさん垢版2018/08/31(金) 13:43:18.09ID:hD6bHOXY
キリッ
0490デフォルトの名無しさん垢版2018/08/31(金) 14:48:59.64ID:LaBPL+3F
どういうぎゃぐなのかと思わせられるほどの無自覚ぶり。他人に自覚とか言ってるのに
0491デフォルトの名無しさん垢版2018/08/31(金) 15:00:22.51ID:/mKi/Wls
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
0493デフォルトの名無しさん垢版2018/08/31(金) 15:20:54.53ID:vplIlyda
ファイルの更新について教えてください

フラッシュメモリ(SDカード)にファイルを保存しています
ご存知のようにフラッシュメモリには書き換え回数があり
使いすぎると壊れるのですが

シェルでリダイレクトして追記していく形にした場合
追記分のブロック数分が更新されると考えていいのでしょうか
もしくは100バイト追記してもファイルの大きさが100MBあったら
ファイルシステム上再配置されて
フラッシュメモリ上は100MB相当(のブロック)の更新がかかりますか?

またviなどのエディタで更新した場合はどうなのでしょうか?
やはり100MB分の更新になりますか?
0494デフォルトの名無しさん垢版2018/08/31(金) 16:11:16.42ID:j8UTgVSe
>>493
OSやドライバに依存する。

でもだいたいはライトキャッシュがあって実際の書き込みは中々されないと思うよ。
ましてや書き込み回数が多くなると劣化するメデイアと初めからわかっているものに対してバンバン書くようなことは普通のドライバならしないと思う。
0495デフォルトの名無しさん垢版2018/08/31(金) 19:32:51.61ID:OUCwI4mz
この動きって仕様ですか?
No1と同じような動きを$@を一旦別の変数に入れて
実行したいのですがなにか方法はありますか?

./test.sh "a 1" "b 2"

# No1
for i in "$@"; do
 echo $i
done
# a 1
# b 2

# No2
args="$@"
for i in "$args"; do
 echo $i
done
# a 1 b 2

# No3
args="$@"
for i in $args; do
 echo $i
done
# a
# 1
# b
# 2
0496デフォルトの名無しさん垢版2018/08/31(金) 19:46:53.74ID:QWemr4wG
>>495
仕様だと思う。
$@の時点ではシェルが解釈した引数ごとに分かれているのに対して
"$@"←のようにしてしまうとそれがひとまとまりに見做されてしまい
結局args="a 1 b 2"と代入していることになる。
0497デフォルトの名無しさん垢版2018/08/31(金) 19:51:37.92ID:QWemr4wG
解決方法はevalやらを使って
#! /bin/sh

n=1
for i in "$@"; do
eval "arg$n=\"$i\""
n=$((n + 1))
done
こうやるといいんでは。
arg3とかで「3番目の引数」を参照できるようになってる筈
0498デフォルトの名無しさん垢版2018/08/31(金) 19:53:52.69ID:QWemr4wG
ていうか質問の内容から察するに二種類の別の引数を処理したいんだよね?
すなおにPythonとか使ったほうがいいとは思うが……
俺が示したやり方だと引数の位置が絶対参照だし 引数を処理する度に変数が衝突するし

もちろん俺の方法が下手というのもあるが まあシェルスクリプトで引数処理は鬼門であることは間違いない
0499デフォルトの名無しさん垢版2018/08/31(金) 19:59:38.59ID:OUCwI4mz
どう解釈すれば、この挙動を理解できますかね?

./test.sh "a 1" "b 2"

for i in "A $@ Z"; do
echo $i
done
# A a 1
# b 2 Z

for i in "A Z"; do
echo $i
done
# A Z
0500デフォルトの名無しさん垢版2018/08/31(金) 20:04:13.23ID:4o8e5lPA
>>493
シェルの追記はかからない。
vi/vim はかかる。

>> 495
仕様。配列にぶっこむ。
HOGE=("$@")
for ent in "${HOGE[@]}"; do
echo $ent
done
0501デフォルトの名無しさん垢版2018/08/31(金) 20:20:45.59ID:4o8e5lPA
>>499
"A $@ Z" → A\_a\_1_b\_2\_Z
"A Z" → A\_Z
アンダースコアはスペースと思ってくれ。
ダブルクォートはスペースをエスケープしてる。
man に載ってたと思って読んでたが見つからんかった。
0502デフォルトの名無しさん垢版2018/08/31(金) 20:47:48.56ID:6cxiNGZa
man の特殊パラメータの項に書いてあるのはこういうことか?
"A $@ Z" → "A ""$@"" Z"
確かに動作は同じだ。
試したコードはこんな感じ

for i in "$@"; do
echo $i
done
for i in "A $@ Z"; do
echo $i
done
for i in "A ""$@"" Z"; do
echo $i
done
0503デフォルトの名無しさん垢版2018/08/31(金) 20:52:30.52ID:OUCwI4mz
よくわからんね。 $@がダブルクォートの中に入ってたら
"$1" "$2" ・・・ "$n" に展開されるってことかな?

でもそれだと
# A a 1
こうなる理由がよくわからなんのだよな

"A $@ Z" は
"A $1" "$2" "$3" ・・・ "$n Z" に
展開されているとしか思えない
0504デフォルトの名無しさん垢版2018/08/31(金) 21:53:31.46ID:KmkRvZ7D
>>495
IFS="\n" を設定すると No3 は
a 1
b 2

>>499
IFS="\n" を設定して
args="$@"
for i in A $args Z; do
echo $i
done
ならば
A
a 1
b 2
Z

となりました
0507デフォルトの名無しさん垢版2018/08/31(金) 23:29:17.32ID:OUCwI4mz
イイかダメかで言えば、arg1、arg2、arg3、・・・では
ループできないのでこれだけではだめですね。
シェルスクリプトにもライブラリが欲しい所ですね
0508デフォルトの名無しさん垢版2018/08/31(金) 23:44:36.90ID:4ZfpOo1s
そんなもんいらない
そんなん使うぐらいなら別のスクリプトを
シェルから使う

ホントな頭悪いことばっかりいってるわ
0509デフォルトの名無しさん垢版2018/09/01(土) 00:01:57.02ID:Z9gelboG
>>507
もう何度も言ってるが別の言語を使え
お前は家で生ハムを作ろうとしているようだぞ
素直に店で買ったほうが旨いし危険性も少ないぞ
0510デフォルトの名無しさん垢版2018/09/01(土) 04:09:47.42ID:IN1XIdeB
最初は使い捨てだからとシェルスクリプトを書くが
なんだかんだ使い続けて、利便性向上の為にアップデートを続け
最後には複数ファイルに及ぶ意外に大規模な代物に
今更マトモな言語で作り直すのも面倒臭い
やるなら最初からマトモな言語で作っておけば良かったと
0511デフォルトの名無しさん垢版2018/09/01(土) 05:19:02.92ID:Z9gelboG
>>510
その通り
一部のよほど頭の良い人(USP研究所とかそのあたり)じゃないと
まともに扱えない単純だけど難しい言語

ほとんどの人間はPythonやらを使ったほうがいい
Pythonはエラー処理やセキュリティ関連も既定で充実してるから
バカでもプログラムが書けるようになってる
0512デフォルトの名無しさん垢版2018/09/01(土) 06:18:36.99ID:j0QmLW2E
シェルスクリプトを他のスクリプトへコンバートするツールとか無いのかな?
0513デフォルトの名無しさん垢版2018/09/01(土) 07:21:55.56ID:mPcVbgud
>>510
シェルスクリプト使うのは、
シェルスクリプトでやるのが適している場合で
規模で決めるもんじゃないだろ?
0516デフォルトの名無しさん垢版2018/09/01(土) 08:10:56.58ID:kUpkBQ3x
>>493-494
>追記分のブロック数分が更新されると考えていいのでしょうか
たぶん、追記分だけ

ページサイズが4KB で、20KB のファイルがある時、
追記すると、最初の5ページに変化はない。
6ページ目が追加されるだけ

ただし、ファイルの中ほどを更新した場合は、どうなるかわからない。
3ページ目だけを更新した場合、1, 2, 4, 5ページに変化はないけど、

3ページ目のサイズが大きい場合、6ページ目を確保して、それを間に入れるから、
1, 2, (3, 6,) 4, 5 のようなページの並びになるのかな?

まあ、ファイルシステムの説明を読まないと、わからない
0517デフォルトの名無しさん垢版2018/09/01(土) 08:19:23.69ID:kUpkBQ3x
vagrant, chef は、Ruby で書かれているだろ

大きい手順書を、シェルスクリプトで書くのは、途方もない!
0518デフォルトの名無しさん垢版2018/09/01(土) 08:31:44.88ID:Z9gelboG
・テスト環境……なし
・ドキュメント生成……なし
・バージョン管理……なし
・パッケージシステム……なし
まあそりゃ大規模開発には向かないわな。
やってもいいのは上記の諸々を自作できるような賢い人間。
(俺を含めた)普通の人間は「連番画像をDLする」とか「写真フォルダを整理する」
ときに一度限りのシェルスクリプトを書く程度に留めて
開発はPythonやRubyやJava(個人的に後者二つはあまり好きじゃないが)を利用するのが一番いい。
もちろん自身にとってもだが,他人にとっても不具合が少ないし事故が起こりにくいというのは大きな利点でしょうね。
0519デフォルトの名無しさん垢版2018/09/01(土) 08:38:18.84ID:mPcVbgud
>>517
シェルに関係ないツールなのだから当たり前では?

手順書がいつシェルに適していると?
rbenvは手順書じゃないよ
0520デフォルトの名無しさん垢版2018/09/01(土) 08:45:05.20ID:mPcVbgud
>>518
それ理屈にあってないだろ

"作れない" ならともかく、現在ないから大規模開発に向かないという理屈なら、
あれば大規模開発に向いているって言うことになるぞw

例えば、今はsystemdに役目を移してしまったが、
Linuxの起動の仕組みはシェルスクリプトだった。

ちなみにgitも結構シェルスクリプトが含まれているよ
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh

それにテストもドキュメントもバージョン管理もあるね。
(って今気づいたがバージョン管理ってなんだ?)
0521デフォルトの名無しさん垢版2018/09/01(土) 08:48:34.52ID:mPcVbgud
なんか、JavaScriptと同じ空気を感じるな。
いろんな仕組みがないから、簡易的な用途にしか使えないと
最初は思われていたが、それらの仕組みが揃った今では
サイト全体をJavaScriptで作るのもありえないことではなくなった。
0522デフォルトの名無しさん垢版2018/09/01(土) 08:50:14.95ID:dtHP3qHu
>>515
前提条件なしのインストーラーみたいな選択肢が他に挙がらないパターンは違うだろ

適してるかどうかで考えるってのは誰も否定せんわ
篩や目安として考えるのが規模だって話だろ
0528デフォルトの名無しさん垢版2018/09/01(土) 09:07:50.87ID:kUpkBQ3x
仮想化は、典型的な手順書だろ。
パッケージをダウンロードして、インストールして、環境変数PATH を通して

シェルスクリプトで作るのは面倒。
Ruby でOK
0529デフォルトの名無しさん垢版2018/09/01(土) 09:16:02.22ID:Z9gelboG
まあRubyじゃなくてもRubyのように
ドキュメント生成やパッケージ管理ができればいいんだよね
PythonがいいよPythonが。
0530デフォルトの名無しさん垢版2018/09/01(土) 09:23:11.21ID:mPcVbgud
>>527
え?今求められてる「例」は
「シェルスクリプトが適している物」でしょ?

いつの間に質問が「シェルスクリプトが適さない物」にすり替わって、
rbenvを「例外」としてだしたと思ったの?
0532デフォルトの名無しさん垢版2018/09/01(土) 09:25:44.74ID:mPcVbgud
>>528
> 仮想化は、典型的な手順書だろ。

たまたま手順書がシェルスクリプトで書かれていたからって、
手順書だからというのはシェルスクリプトで書く理由にはならないんだよ。

あんたはrubyが入ってない、入れたくないという環境でも
動かしたいという理由とごっちゃにしてるだけ
0534デフォルトの名無しさん垢版2018/09/01(土) 09:45:09.27ID:mPcVbgud
理解したならいい。
好きにするのは普通にしている。
ここでやってるのは、お前に理解させることだからな。
反論がなくなればそこで終了だ
0537デフォルトの名無しさん垢版2018/09/01(土) 11:35:25.52ID:mPcVbgud
>>526
1. シェル環境そのものをカスタマイズするためのもの(例 rbenv)
通常のプロセスはサブプロセスとして起動するので、カレントシェルのカスタマイズはできない

2. 特定の言語のライブラリやランタイムに依存したくないもの(例 Docker)
あらかじめ入っているものだけで起動できるので、環境を整える必要がなくなる
コンテナやIoTといった小さな制限されたイメージでも使える


逆にさ、他の言語の方こそ「適している理由」が少ないと思うな。
例えばRubyで作ったものはPythonで作ることだってできるだろ?
0538デフォルトの名無しさん垢版2018/09/01(土) 11:42:20.50ID:mPcVbgud
3. CLIコマンドとCLIコマンドのグルー言語
リダイレクトやパイプを使った処理はシェルスクリプトが得意
他の言語でもネイティブに記述するのが面倒だからか
内部的にシェルを経由してたりするしな
0540デフォルトの名無しさん垢版2018/09/01(土) 11:55:22.51ID:mPcVbgud
>>539
はぁ、だから

> 逆にさ、他の言語の方こそ「適している理由」が少ないと思うな。
> 例えばRubyで作ったものはPythonで作ることだってできるだろ?

こう書いたのに。

たとえ対象となるものが少なくとも、
適している理由があるだろ?
他の言語は、その適してる理由すらないのにって話だよ

2がC#ですら可能? じゃあ俺が使ってるルータ(OpenWrt)で動かしてみなよ
0541デフォルトの名無しさん垢版2018/09/01(土) 11:57:50.49ID:mPcVbgud
参考までに言っておくと、俺が扱ってるルータは
比較的スペックが高いものだが、Flashのサイズは16MBしかなく
ファームウェアを除いたら空き容量は10MB程度だからな
0542デフォルトの名無しさん垢版2018/09/01(土) 12:11:14.41ID:HRxiLrgz
自分が今使ってる環境を前提にして
同じように考えろと周りにも要求する人ってたまにいるけどその議論に意味あるのか?
0543デフォルトの名無しさん垢版2018/09/01(土) 12:23:32.27ID:mPcVbgud
>>542
意味ないだろうね。

だから sh しか入ってない、入れられない
環境っていうのも考慮しろ。

贅沢な環境を前提とするのは
大間違いだって言ってる。
0544デフォルトの名無しさん垢版2018/09/01(土) 12:35:03.95ID:HRxiLrgz
>>543
だからって極貧環境を前提にするのも間違い

極貧環境でリッチなスクリプトが動かないのはわかった
その環境ではshは素晴らしいものだ
スクリプト言語の完全敗北だよ
そりゃ動かせないのに勝負になるわけない
この結論に議論の余地はないだろう

じゃあ議論が終わったので次に行こう
業務規約でツールインストール禁止のWindows 7環境でshのメリットはあるか?
0545デフォルトの名無しさん垢版2018/09/01(土) 12:36:44.49ID:mPcVbgud
>>544
はぁ。前提としてねーだろ
そういう環境もあると言ってるだけなのに、

「無視するのが前提」で話をしてるのは
お前なんだよ

これからは「考慮するという前提」でいくからなw
0546デフォルトの名無しさん垢版2018/09/01(土) 12:38:38.54ID:dtHP3qHu
>>542
意味ないね

そもそも根本的に考えてることは同じハズなんだが、イメージ対象が違ったりアスペみたく妙なとこ拘り始めると話が拗れる
0547デフォルトの名無しさん垢版2018/09/01(土) 12:43:20.26ID:mPcVbgud
>>544
> 業務規約でツールインストール禁止のWindows 7環境でshのメリットはあるか?

WindowsとLinuxの両方で使うなら、
両方のOSでそのまま動くツールがほしいね

まずツールインストール禁止なんだから
任意のバイナリ、RubyやPythonをインストールすることは禁止だ。
(バイナリOKならbusyboxでもダウンロードすればいいということになる)

だからバッチファイル or PowerShell or JavaScript(JScript) と
シェルスクリプト の二段構えにするしか無いだろう。

二重にコードを開発するのが嫌なら、簡易インタプリタ言語でも作って、
WindowsではJavaScrptで、Linuxならシェルスクリプトで
パースしてコマンドに変換して実行とかかな

ってことで、シェルスクリプトでもそういう用途のために
ライブラリとか充実してるといいよねという話に戻すw
0548デフォルトの名無しさん垢版2018/09/01(土) 12:46:29.79ID:mPcVbgud
皮肉が伝わっていなそうだから言っておくが、>545は
「どちらもなにかを前提としてる」だろってこと

そして2つの違いはその前提が
「多くの環境に対応する」前提 なのか
「特定の環境を切り捨てる」前提なのかってこと
0550デフォルトの名無しさん垢版2018/09/01(土) 13:52:43.19ID:7zKoqoPj
最近知ったけど&&や||使えばifによる判定不要なんだね

ls aaa && echo exists
ls aaa || echo not exists

でもプログラムやってきてた自分としては
if使っちゃうかなあ・・・
0551デフォルトの名無しさん垢版2018/09/01(土) 14:21:11.49ID:mPcVbgud
> でもプログラムやってきてた自分としては
???

俺もプログラムやってきたが、こういう書き方を知った(意識した)のはperlが最初だな

http://perldoc.jp/func/die
> chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
(or は優先順位が違うだけで || と同じ)

以降Rubyや
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#or
> demo || die
> demo or die

JavaScriptでも使うようになった
https://stackoverflow.com/questions/51206667/or-in-ternary-operator-using
> (a === 0 || b === 0) && console.log('aloha amigo')

(Perlよりも前にやっていた)C言語でもできたんだが、当時は使ってなかったな。
https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290
> a || error(); // if(!a){ error(); } のような挙動
> a || (a = 1); // if(!a){ a = 1; } のような挙動(代入が式である言語で有効)

こういう書き方ができないのはVBぐらいじゃないか?
VBは短絡評価じゃないから、先に|| や && の右側が評価されてしまったはず


えーと、いつから自分がプログラムやってきたと錯覚していた?
0555デフォルトの名無しさん垢版2018/09/01(土) 16:10:37.86ID:W/mc6eBq
>>516
> 1, 2, (3, 6,) 4, 5 のようなページの並びになるのかな?
重複排除以外ならない。
アプリからそれを書き込もうとすると
write(fd, buf/*3, 6, 4, 5*/, size)
を実行するしかない。

>>549
向いていない。
0558デフォルトの名無しさん垢版2018/09/01(土) 17:43:01.15ID:vZp6TokW
何行以上なら大規模なのか、1人で開発したら大規模と言えるのか。
シェルスクリプト環境自体がシェルスクリプトを用いた大規模分散開発の成果と言えるのかもしれない。


という夢を見た
0561デフォルトの名無しさん垢版2018/09/01(土) 17:59:21.16ID:mPcVbgud
>>560
最初に思ったのが、glibcではないから。
たしかuClibcだっけ?と思ったが、musl libcに変わっていた。
glibc互換らしいから動くかもしれない。

次に思ったのがCPU。うちのルータは MIPS
ここを見るとARMはあるがMIPSはないのでアウト。動かない
https://www.microsoft.com/net/download/dotnet-core/2.2

おまけでARMのコアバイナリサイズ。圧縮状態で30MB近くある
展開したら60MB?。空き容量は10MBしかないので到底入らない。
ちなみにOpenVPNとか入れるんで10MB全部使えるわけじゃない
USBメモリを使うという裏技があるから不可能ではないが。

あとは使用メモリも気になるな。高スペックルータなので、
128MB"も"搭載されているが、どれくらいメモリ食うんだろうね
0562デフォルトの名無しさん垢版2018/09/01(土) 18:00:20.51ID:mPcVbgud
訂正
× おまけでARMのコアバイナリサイズ。圧縮状態で30MB近くある
○ おまけでARM版の.NET Coreランタイムのバイナリサイズ。圧縮状態で30MB近くある
0564デフォルトの名無しさん垢版2018/09/01(土) 18:02:59.63ID:/wwW4VSs
ちっちゃいコマンドを一杯つくって
そのコマンドを一杯組み合わせてどんどんコマンド作るのには最適
標準入出力でひたすら組み合わせて使えるのがベストだ

一つのシェルスクリプトでたくさんの機能の処理を書こうというのが
そもそもの間違い

単体のシェルスクリプトで完結して使える簡単な機能を作る

わかりましたか
0568デフォルトの名無しさん垢版2018/09/01(土) 18:19:40.37ID:mPcVbgud
>>564
いやわからんw

「簡単な機能」とはどういう機能なのか
理論的には、たくさんのコマンドを組み合わせるだけという
シェルスクリプトに適した単純な機能であっても、その量が多くなれば大規模になるだろう?
「機能の種類や複雑さ」と「機能の量」は別々の概念だ

俺にとっては大規模といったら10万行超えるぐらいのものなんだが、
その前提でいいのであれば1000行程度は小規模だろう。だがその
1000行でもライブラリあったほうが楽になるだろうと用意に予測できる

例えばgit subtreeが865行だな
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh
0571デフォルトの名無しさん垢版2018/09/01(土) 18:42:01.49ID:mPcVbgud
シェルスクリプトが大規模に向いてないという理由を
誰も答えてくれないので俺が書いてやる

まず前提としてどんな言語であっても、言語だけでは大規模開発を
するのは無理RubyでもC#でもJavaであってもだ。
少し前まではJavaScriptも大規模開発に向かないと
言われていたはずだ。それが解決したのは何故か?

大規模開発をするのに必要なのは言語じゃない。フレームワークとライブラリだ。
どんな言語でも大規模開発するためにフレームワークとライブラリを使うだろう?
逆にこれらを使わないで大規模開発なんて到底無理だろ?

JavaScriptが大規模開発できるようになったのも、
フレームワークとライブラリが補完されたからだよ。
シェルスクリプトも昔のJavaScriptと同じ状況。

といっても俺はシェルスクリプトで大規模開発をすることには興味がなく、
せいぜい数千行程度の中規模ぐらいまでしかやることはないだろう。
何故かと言うと単にシェルスクリプトに適した内容で
10万行を超えるようなものが思いつかないからだ

だがそれはシェルスクリプトで大規模開発ができないということにはならない。
実際USPとかいうので、無印良品や東急ハンズのシステムが作られている(いた?)だろ
http://www.atmarkit.co.jp/news/200909/07/lltv03.html
https://www.hands-lab.com/tech/entry/62.html
(適してないとは思うが)足りない部分を補えば大規模開発だってできることは証明済みだよ

まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
フレームワークやライブラリが不足しているから。
俺がシェルスクリプトで大規模開発をやらないのは、
シェルスクリプトが適した内容で大規模なものを思いつかないから。
それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。
0573デフォルトの名無しさん垢版2018/09/01(土) 18:46:41.92ID:/wwW4VSs
コマンドラインインタープリタを自動化したもんを
シェルスクリプトとというの

頭悪いバカのみんな分かった?

頭悪いバカは用途がわかってない、、、
0574デフォルトの名無しさん垢版2018/09/01(土) 18:49:33.52ID:/wwW4VSs
たとえばなこのスレにいるような
コマンド叩ける程度の知能しかないオペレーターみたいなヤツが
シェルスクリプトだったらいっぱい自動でコマンド叩けると
必死に主張してるワケ
0575デフォルトの名無しさん垢版2018/09/01(土) 18:55:47.33ID:mPcVbgud
お、今気づいたが、git subtreeってそのオプションの多さに比べて、
コードが少し少ないんじゃないか?と思ったら、

https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L11-L33

OPTS_SPECを定義して、git rev-parse --parseopt つかって
何やらオプションを正規化してるんだな
gitにこんな機能があったとは

とは言え、劇的にコードが減ってるわけじゃないから
これなら http://docopt.org/ の方が優れてるな
0576デフォルトの名無しさん垢版2018/09/01(土) 18:59:35.38ID:mPcVbgud
>>574
「コマンドをいっぱい叩ける」というのは量の話。
「適した用途」というのは量(大規模か否か)ではなくて
>>537-538に書いたような、処理の内容の話

いい加減、量にこだわるの止めません?w
0577デフォルトの名無しさん垢版2018/09/01(土) 19:05:44.41ID:/wwW4VSs
シェルスクリプトでじかに文字列の処理なんかしないからな
sedやawkを使っても
頭が致命的に悪いとコレもシェルスクリプトで書いてやりたいとなるわけか

なるほどな
0579デフォルトの名無しさん垢版2018/09/01(土) 19:09:38.27ID:mPcVbgud
サマータイムスレにもいた半角使いのキチガイ野郎かな?
みんな、こいつの味方するの?w
0588デフォルトの名無しさん垢版2018/09/01(土) 21:04:14.49ID:2NCbxz5b
>>583,587
その二人ともなぜか 俺だけ 優秀と思っている不思議さwだから嫌われ者同士でも互いに嫌ってるのかww
0589デフォルトの名無しさん垢版2018/09/01(土) 22:34:21.93ID:/wwW4VSs
オレが優秀なワケじゃない
オマエが健常者じゃないだけだからな

まずそこを自覚しないといけない

そこを勘違いしたらダメなワケ
オツムに軽度の障害があるとみなせるぐらい知能に問題がある
0590デフォルトの名無しさん垢版2018/09/01(土) 22:59:24.12ID:2NCbxz5b
別にそういう個別特定なのはいいのねん
お前には俺(のレス)がそう見えるというのはお前の価値観からそう見えるのはしょうがない
だがしかし、お前の場合はレス個別に対してじゃないのもあるからな。不特定多数のも。自称健常者は敵が多いからなのか??w
0591デフォルトの名無しさん垢版2018/09/01(土) 23:12:57.65ID:2NCbxz5b
wwww いや、笑った。すげえなww
低学歴 知恵遅れ 健常者じゃない と、どこのスレでもどのレスでもそういう言葉があるな。すごいなww
ちょっと頭のおかしな人が道中をぶつくさ他人に悪態ついてるのと似てると思うけどなあ。「健常者」なんて普通使わないと思うけど、もしかしたらマジ病気のひと?ww
普通に会話、普通のレスできないの?あったとしたらすまん、あまりにもあういうのばかりで見逃したかもw
0592デフォルトの名無しさん垢版2018/09/01(土) 23:17:02.98ID:/wwW4VSs
オレと会話したいの?

残念なことにな、知恵遅れとまともな人間のあいだでは
会話が成立しない

プロトコルが違う

オレと会話したいなら
まず相応のプロトコルを身につけてからだ
0596デフォルトの名無しさん垢版2018/09/01(土) 23:46:09.11ID:2NCbxz5b
>>592
会話のためじゃなかった、なんの為に数々のレスしているの?君は
まあ、自己顕示欲承認欲求からだけだろうなというのは、数々のレスからは垣間見えるけど、そういうことなのね、そういうことでいいのねw
0597デフォルトの名無しさん垢版2018/09/02(日) 00:04:43.96ID:Tb3tt8fk
この板をまともな板にするために
この板でレスしてる

オマエみたいな頭悪い低学歴知恵遅れが幅きかせて
いま、この板は正常に機能してない

低学歴知恵遅れは低学歴知恵遅れの自覚がない
しかも自己評価だけは高い
その分タチがワルイ
まともな人間が近寄らない

そしてその自覚すらない
その自覚がないから更生もしない
つまり更生することもないから排除しかない

つまりオレは
素晴らしく情報価値が高いレスを提供すると同時に
この板から低学歴知恵遅れのクソニート、底辺ITドカタを排除する作業を実施している

わかった?

まともな板にするためにな
ひたすらオレはレスをしている

わかった?
0599デフォルトの名無しさん垢版2018/09/02(日) 00:14:17.23ID:fQwovzZh
>>597
>この板をまともな板にするために
wwwww マジでっ!?
その言っているのは、いろいろ自分にも当てはまるだろうと思うんだけどな

自己顕示欲承認欲求と見なされるのは嫌らしいというのだけはわかったよw
0600デフォルトの名無しさん垢版2018/09/02(日) 00:15:05.38ID:Tb3tt8fk
当然、オマエも排除の対象だ
0603デフォルトの名無しさん垢版2018/09/02(日) 00:17:25.68ID:Oiltae2A
俺の目の黒いうちはまともにはさせんから安心しろ
0606デフォルトの名無しさん垢版2018/09/02(日) 00:27:05.66ID:elP7igYW
どうでもいいけど、
yesコマンドって

1. なんに使うんだ?
2. なるほど(使いみちを聞いて)
3. いつ使うんだ?(使ったことがない) ← みんなこの状態だよな?w
0608デフォルトの名無しさん垢版2018/09/02(日) 00:40:01.27ID:elP7igYW
だいたい、-yオプションとか、-fオプションとか、-qオプションがあるからねぇ

おっとまたオプションの話だw

オプションついでにいうとtarとかpsってなんでハイフンなしで
tar czvf とか ps aux とか書くんだろう?
ちょっと調べたら昔の仕様?らしいけど

今はtar -czvf とか ps -aux とかできるみたいだけどさ。
まあ今はハイフンなしオプションのことを考慮する必要は無いだろうけど
それに対応したライブラリ(getoptsみたいなの)ってあるんだろうか?
0609デフォルトの名無しさん垢版2018/09/02(日) 02:09:13.86ID:4Jf6YH6e
>>608
ないのでは? tar の場合はハイフンなしの Old style のオプション指定されていたら
まずはハイフン付きに置き換えてから解釈しているらしい。
https://qiita.com/junjis0203/items/6bb48184b508045e69da
0610デフォルトの名無しさん垢版2018/09/02(日) 06:17:08.93ID:667Fbrpy
>>609
すごいな。一発で持ってくるとは
でもID:elP7igYWみたいな馬鹿を相手にするなんてもったいない……。
0611デフォルトの名無しさん垢版2018/09/02(日) 09:16:59.93ID:elP7igYW
>>609
なるほど。

初期(いつ?)の頃ってコマンドの開発どうだったんだろうね
ハイフンなしのオプションはしばしば用いられていたのか?

どんなコマンドも最初の実装ってのは存在するわけで、
それが今とどう同じなのか違うのか少し気になってきた
0612デフォルトの名無しさん垢版2018/09/03(月) 09:07:41.26ID:Phd/3F0T
俺、数百行クラスになったら静的言語にするから、
シェルスクリプトどころかrubyもpythonも使わない。
数百行にもなると書き捨てって規模じゃないし、
静的型検査なしで書くのは面倒くさい。

あとJavaScriptには現代的言語の持つ抽象化機能があらかたあるから、
連想配列も構造体相当品もないシェルスクリプトと同列に並べるのはJavaScriptに失礼。
0616デフォルトの名無しさん垢版2018/09/03(月) 11:13:52.71ID:Phd/3F0T
>>615
そういう小規模なプログラムばかり書いてたらもっと動的言語を
使ってたかもしれないなあ。
就職して最初のプロジェクトがいきなり100万行オーバーのCプログラムの
大規模改造とかで、それ以後も数十万行クラスのプログラムばかり
触ってきて、ちょっと規模が大きくなると処理系の検査に頼る
習慣がついてしまった。
0617デフォルトの名無しさん垢版2018/09/03(月) 11:21:30.86ID:IWP2OX+N
>>616
うん、仕事でしかプログラミングしてないんだろうな
ってのはすぐにわかったよ。

1から作ったことがあれば、いきなり数百クラスに
なることなんて無いからね

保守的な開発しかしたこと無くて、
小さなシステムの組み合わせで大きなものを作るという発想がない
古臭いものメンテナンスしかしたことないんだろうなと
0618デフォルトの名無しさん垢版2018/09/03(月) 13:56:12.52ID:Phd/3F0T
>>617
あれだけの情報で趣味プログラム書いてないってわかるなんてスゴイ⤴⤴
その推理フツーに間違ってるがw

そもそも小さなプログラムだって普通に書いてるし、だからこそシェルスクリプトスレに来てるわけで、
大きなプログラムしか書いてないとするとその時点で矛盾するじゃん。

自己矛盾した推理を前提に話を進めるとか、同僚にいたら困りそうなタイプだなあ。
0619デフォルトの名無しさん垢版2018/09/03(月) 14:47:29.83ID:IWP2OX+N
>>618
いや、そもそもお前の発言が矛盾してるんだって。

↓これお前の発言な
> 俺、数百行クラスになったら静的言語にするから、
> シェルスクリプトどころかrubyもpythonも使わない。

数百行クラスになったら静的言語ってことは
数百行クラスになる前はどうしてるんだって話だよ
0620デフォルトの名無しさん垢版2018/09/03(月) 19:06:52.08ID:HxI+JP9z
>>619
> 数百行クラスになったら静的言語ってことは
> 数百行クラスになる前はどうしてるんだって話だよ

え、そこに矛盾はまったくないんだけど、マジでホントに分からないの?
明日の19時くらいまで待ってあげるから自分で考えてみた方がいいぜ。

降参すればもっと早く答を教えてあげるけど、こんな当たり前の話、ホントに分からないとするとそれはそれでまずい気がする。
0621デフォルトの名無しさん垢版2018/09/03(月) 19:27:06.50ID:HpF+lD7Q
おまいら、自分の書き込みが変に解釈された事の方を問題視しろよ。
相手が客だった場合、どんなに釈明しようが上司はお前が悪いとしか言わんぞ。
0622デフォルトの名無しさん垢版2018/09/03(月) 19:33:15.32ID:HxI+JP9z
>>621
え、もしかして君も分からんの?
客ならともかく、プログラマーならこんなの分かって当然だと思ってたけど、そうでもないんかな。

まあ明日の19時過ぎたら答は書くよ。
0623デフォルトの名無しさん垢版2018/09/03(月) 20:06:42.29ID:IWP2OX+N
上の方でもプログラマを自称しながら、アマチュアっぽいやつがいたからなぁw
まあ、明日なにか言おうとしてるみたいだから、何も言えなくなるように
大規模アプリを作るときの鉄則を言っておくよ。

まず大規模アプリを作るときに重要なのは細かくモジュールに分けましょうということ
モジュールという言葉の意味は文脈で微妙に異なるけど、きっちり定義したいわけじゃなく
小さなプログラム、小さなファイル、小さなクラス、小さな関数等に分けましょうという話

これをやっておかないと、例えばC言語のHello Worldであっても、
printfの複雑な実装を、一つのファイルに全部書かないといけなくなくなって
数百行なんてあっという間に超えてしまう

>>612は数百行程度で静的言語にするとか言ってるが、
俺に言わせれば、大規模アプリであっても"1モジュール(最小単位の関数)"で
数百行なんてめったになることなんてないだろうと。

まあ、どうせ >>612はプロジェクト全体で数百行と言ったつもりなんだろうが、
お前は単体テストできるようにしてないのかと。それぞれ独立して考えられるように設計しろよ。

小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。
Hello Worldでもプロジェクト全体という話ならprintfの実装も含めなきゃいけない。
でもブラックボックスとして扱ってるんだろ? それと同じで自分で作る場合もブラックボックス化させればいいんだよ
つまり小さなモジュールに分けて作れば、静的言語でなくとも大規模アプリは十分作れるわけだ。
もちろんシェルスクリプトであってもね

もし「シェルスクリプトは上から下へ流れるように作るのが普通なんだ。
関数なんて作ってはいけない、複数のファイルに分けたりしてはいけない、複数のスクリプトに分けるのも禁止
だから大きなものは作れないんだ!それが世界の常識なんだ!!」という理屈であれば、
それは頭が固いお前の思い込みが、大きな物を作れない根本原因だろ。ってこと

結局プログラマを自称しているようだが、小さく分けるという設計ができない
アマチュアレベルの人間なんだろうって話だ
0624デフォルトの名無しさん垢版2018/09/03(月) 20:11:02.86ID:lS5Tq6xt
渾身の長文わろたw
0626612垢版2018/09/03(月) 20:30:39.38ID:HxI+JP9z
やっぱり例の人だったかw
しかも長文の割に
(a) >>612が別に矛盾したこと言ってないと分かった
のか、それとも
(b) 相変わらず>>612が矛盾してると思ってる
のかを書いてないように俺には思えるというwww

>>623 よ、お馬鹿な俺に、君の意見が(a)なのか(b)なのか教えてくれ。
0627デフォルトの名無しさん垢版2018/09/03(月) 20:40:49.84ID:IWP2OX+N
>>626
いや、別にお前にレスしてないしw
大規模アプリを作るときの鉄則を言っただけだし

明日の19時過ぎたら、なんか答え書くんだろ?
それを書いてくれればいいよ。
俺の文章読んで恥ずかしくないならね


まあ一つ言うとしたら、技術力の差ってやっぱりあるよな
他の人が動的言語できているという事実があるというのに
俺はできないんだ!ってよく恥ずかしげもなく言えるよなーと
0628デフォルトの名無しさん垢版2018/09/03(月) 20:43:08.65ID:lS5Tq6xt
大規模アプリを作るときの鉄則www
なんやろ?www
0629デフォルトの名無しさん垢版2018/09/03(月) 20:43:49.57ID:IWP2OX+N
そうだ、ヒントをやろうw

俺、(1関数で)数百行クラスになったら設計が悪い思って作り直すから、
数百行クラスになることはない
0630デフォルトの名無しさん垢版2018/09/03(月) 20:45:19.54ID:RephN+2M
なんか一つ一つが長文でここ最近ずっとだらっと最下部までスクロールして閉じるを繰り返してるわ
0631612垢版2018/09/03(月) 21:00:52.21ID:HxI+JP9z
これはアレですね。
(a)と答えると自分の間違いを認めることになって耐えられないし、
(b)と答えると明日の19時以降に赤っ恥を書くことになるしで、
(a)とも(b)とも答えられないってヤツですねw

分かりやすい。
自分の間違いを認めると死んぢゃう病に罹患中って奴だw
0632デフォルトの名無しさん垢版2018/09/03(月) 21:09:15.31ID:E2St7m4+
個々の簡単な完結した機能の簡単なシェルにしといたほうが
単体試験仕様書の設計も簡単
結合試験仕様書の設計も簡単
総合試験仕様書の設計も簡単

知恵遅れが作ると試験による検証すらできないシステムができあがる
0633デフォルトの名無しさん垢版2018/09/03(月) 21:12:48.08ID:IWP2OX+N
>>631
ん? 俺は間違ってないんだから、必然的に(b)ということになるな。
はい、明日の19時待ってますよw
0636デフォルトの名無しさん垢版2018/09/03(月) 21:17:55.11ID:lS5Tq6xt
>>634
おまえ大規模アプリを作っとるんやろ?そうゆう初心者くさい事ゆうなよwwww
ちょっとだけ失望したわw
0638デフォルトの名無しさん垢版2018/09/03(月) 21:28:01.12ID:IWP2OX+N
作業していて気づいたんだが >>537-538
どういう場合にシェルスクリプトが適しているかの話

少し毛色が違うが、コールバックの仕組みを取り入れるなら
必然的にシェルスクリプトで書かなければいけなくなるな

つまり
1. 簡単なことをやるためにシェルスクリプトを使う
2. だけど中身で一部複雑な処理があるので、そこだけ別コマンドを使う
3. その別コマンドから、シェルスクリプトに定義したコールバック関数を呼び出す

というようなことをやろうと思ったが、2の「別コマンド」がシェルスクリプト以外(正確には別プロセス)だと
シェルスクリプトに定義したコールバック関数を呼び出せない

つまりPerlで書くならば以下のような感じで、正規表現置換をsedコマンドで
実行してしまったら、(スクリプトの内部関数である)foo関数を呼び出すことができない

sub foo { uc($_[0]) }
$text = 'abcdefg';
$text =~ s/([a-c])/foo($1)/eg;
print $text;
0640デフォルトの名無しさん垢版2018/09/03(月) 21:33:19.27ID:IWP2OX+N
どうでもいいが(俺にとってはどうでも良くないが)
sedとawkとgrepとexprで使える正規表現のパターンが違うのって地味に嫌だなw
もし1から仕様を決められるなら、全部統一されるんだろうな。
HTML5みたいに一度足並み揃えた仕様にリセットされてほしい
0643デフォルトの名無しさん垢版2018/09/03(月) 23:01:37.14ID:E2St7m4+
もうコタエは書いたからな
次の患者さんどうぞ
0646デフォルトの名無しさん垢版2018/09/03(月) 23:57:12.64ID:E2St7m4+
キミラは重篤な患者さんだからな
しょうがない
0647デフォルトの名無しさん垢版2018/09/03(月) 23:59:36.46ID:IWP2OX+N
sedで「command i expects \ followed by text」というエラーが出たが
なんか-iの話ばっかり見つかって、期待する答えがなかなか見つからないwww

GNUだと
echo text | sed 'i===' って書くだけで簡単に
===
text
と表示されるんだが、

BSDだと上記エラーがでて、しばらくどうすりゃいいの?状態だったw
持ってた sed & awk ポケットリファレンス 眺めても書いてあることがさっぱりでさ

正しく(POSIX)ではこう書かないといけないんだな。改行がいるとかw
echo text | sed 'i\
===
'

これを1行で書くために、改行を変数に入れるべくこんな変なことをしないといけなかったりw
LF=$(printf '\012_')

LF=${LF%_}


sedって置換機能以外の、本来stream editorとしてバリバリ使いこなそうと思ったら難しいな
ホールドスペース使いこなせる気がしない。何ができるのかも想像できないしw
0648デフォルトの名無しさん垢版2018/09/04(火) 00:05:33.37ID:gZnu4stV
ココは隔離病棟の集中治療室
0650デフォルトの名無しさん垢版2018/09/04(火) 06:08:51.64ID:fH4o5qCk
ホールドスペースをバリバリ使ってた。使いこなしてたかはともかく…
20 年以上も前のことだから、もうできない。
0651デフォルトの名無しさん垢版2018/09/04(火) 08:53:12.61ID:jvRjWg/I
ホールドスペースやブランチを使いたくなったらsedやめて他の言語使えって、Macで女子高生が話してた。
0652デフォルトの名無しさん垢版2018/09/04(火) 08:53:37.92ID:ROt4XEkp
sedがなんで分かりづらいかの理由がわかった
b(とt)の解説が悪いんだよ。

たいてい、b・・・無条件ジャンプのように書いてあるから
これだけでどうやってフロー制御すりゃいいんだよ?ってなる

正確にはこれ、条件分岐なんだな。ニュアンス的にはこんな感じ
/条件/b :label

bの前はアドレスってことだが、正規表現でもアドレス指定できるから
これを条件とすれば、条件分岐となる。

だけどアドレス(条件)はすべてのコマンドで使えるものだからなのか
そのコマンドの説明のところで省いてしまうから、解説だけを読んでも
ジャンプはあるが条件付きジャンプがねーじゃねーかってなるわけだ

条件文があるならあとは簡単だ。普通の手続き型のコードだわ
0654デフォルトの名無しさん垢版2018/09/04(火) 10:20:13.70ID:ROt4XEkp
>>653
アドレスの範囲を受け付けますって遠く離れた所に書いても
それが条件として使えるとは気づきにくいって話
0658デフォルトの名無しさん垢版2018/09/04(火) 18:17:39.81ID:i2l0SoWn
>>652
そこは、素人お断りですw よく読みましょう。
This is just a brief synopsis of sed commands to serve as a reminder to those who already know sed
0659612垢版2018/09/04(火) 19:19:21.04ID:GKTPwsNb
19時過ぎたから答を書く。

言っておくがチョー当たり前のつまらん話だよ。

・短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
・拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。あまり長くなると書き直しも面倒になるから、早めに手を打つ。
・長くなりそうだと初めから分かっている場合は、もちろん最初から静的型付き言語で書く

ってだけだよ。

静的型付き言語使いにはわりとよくある開発形態のはずだが、なんで>>612が矛盾してるなんて結論に至るのか。
0661612垢版2018/09/04(火) 19:43:12.33ID:GKTPwsNb
>>660
俺が>>612
「数百行くらいのプログラムになると、俺の場合は静的型検査がないと面倒くさいので、静的型付き言語で書く」
と書いたら、いつもの人が例のごとく謎の難癖をつけてきたってだけの話。

別に「全員がそうすべき」って書いたわけじゃなくて
あくまで「俺にとっては面倒くさい」って書いただけなのに、どうも許せないみたいだな。
難癖は全然反論になってないので読む必要はない。
0663612垢版2018/09/04(火) 19:53:45.96ID:GKTPwsNb
あ、>>612の「数百行クラス」ってのを
「(オブジェクト指向言語の)1つのクラスのコードサイズが数百行」と誤解されたようではあるな。
これは俺の表現も誤解を招くものではあった。
単に「1プログラムのコードサイズが数百行くらい」って意味で書いてたんだけどね。

まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。
0664デフォルトの名無しさん垢版2018/09/04(火) 21:01:45.22ID:wTvbP50/
>>612
興味本位で聞くんだが、数百行って具体的にはどの範囲をイメージしてる?〜500程度?
あと静的型付けって何使ってる?
0665612垢版2018/09/04(火) 21:24:00.90ID:GKTPwsNb
>>664
500行を越えるぐらいからかな。
常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
これは規模的に結構辛い。orz

言語は最近はCrystalを試してる。
まだ書き慣れたって段階には達してないけど。
0666デフォルトの名無しさん垢版2018/09/04(火) 21:57:53.47ID:wTvbP50/
>>665
俺は数百行って聞くと2、300をイメージするから、どのぐらいか気になった
crystalとは・・・俺は1.0も出てないものは使えんなあ

うちは処理結果が揮発で良いなら基本bash/pythonを使ってる
0667デフォルトの名無しさん垢版2018/09/04(火) 22:13:29.28ID:ROt4XEkp
>>659
やっぱり矛盾してるじゃんw

1. 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
2. 短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
3. 拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。

では、長くならない場合は?
シェルスクリプトやrubyもpythonを使うんだろw
0668デフォルトの名無しさん垢版2018/09/04(火) 22:15:09.44ID:ROt4XEkp
>>665
> 常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。

小さく分けようぜw
ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ
0670デフォルトの名無しさん垢版2018/09/04(火) 22:18:59.76ID:ROt4XEkp
>>663
> まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。

自分でrubyやpythonも使わないって言ったんだろw
自分でオブジェクト指向の言語だしといて何いってんだよ

結局最初に予測したとおり、大きな(それほど大きくもないがw)
プログラムを作るときの、小さなモジュールで作るってことを知らないだけじゃん
0671612垢版2018/09/04(火) 22:45:12.74ID:GKTPwsNb
>>667
> では、長くならない場合は?
> シェルスクリプトやrubyもpythonを使うんだろw

勿論そうだよ。

> やっぱり矛盾してるじゃんw

> 1. 俺、静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。

「シェルスクリプトどころかrubyもpythonも使わない」ってのが「数百行クラスになったら」に限定された記述だってことに気づかないあたりが君の鈍いところ。
初見で気づかないのはまあ元の文が多義的に解釈できるから仕方ないとしても、
この期に及んで気づいてないのは致命的かな。
0672612垢版2018/09/04(火) 22:52:14.96ID:GKTPwsNb
>>668
> 小さく分けようぜw
> ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ

勿論分けてるよ。
シェル関数も使ってるし、1ファイル500行を越えるモジュールはない。
まったく同じようにモジュール化しても、静的型付き言語に比べて
動的型付き言語は人間にかかる負担が大きいってのが
>>612の趣旨なわけだが、君は相変わらずそのことに気づいてないんだな。

それなりのプログラマーであれば、動的、静的と言った瞬間にこの趣旨に気づくはずなんだが...
0673デフォルトの名無しさん垢版2018/09/04(火) 23:01:52.48ID:ROt4XEkp
>>672
(全てのプログラムは)長くなるからシェルスクリプトどころかrubyもpythonも使わない
って言っただろ?

長くならないプログラムがあって
「その場合はシェルスクリプトやrubyもpythonを使ってる」というのなら、
明らかな矛盾。使わないと言っておきながら使ってると言ってる。


>>671
負担が大きいから何だって言うんだ?
負担の大小ではなく、管理可能かどうかだろ

現実見てみろ。動的言語でも全体で何万行もあるシステムは作れている
お前が作れないのは単にお前の能力不足でしかない

その事に気づいたようで、動的言語では作れないんだというニュアンスから
負担が大きいに言い換えたようだが、バレバレだw


最初(>>623)に言っておいたとおり、プロジェクト全体の行数を考えるのは意味がない
> 小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。

小さいモジュールのあつまりで作ればいいだけの話
小さいモジュールの集まりで作るから、
> 小さなプログラム、小さなファイル、小さなクラス、小さな関数等
は長くならない
0674デフォルトの名無しさん垢版2018/09/04(火) 23:05:52.86ID:ROt4XEkp
シェルスクリプトの話に戻すならば、
頭が固い人のたわごとは無視して、
複数のファイルで作れば良いってことなんだよ

もちろん、100行のコードと、
100行の10個のファイルだと後者のほうが
複雑だが(そりゃコード量が増えてるからな)

100行の10個のファイルの動的言語と
100行の10個のファイルの静的言語の
複雑度は変わらない
0675デフォルトの名無しさん垢版2018/09/04(火) 23:06:43.34ID:ROt4XEkp
行とかいたら、コメント含めたりするかw
一応実行行(ステップ数)と言い換えておく
0676デフォルトの名無しさん垢版2018/09/04(火) 23:14:44.94ID:RaX7EawA
この話オチあるんか?
0677デフォルトの名無しさん垢版2018/09/04(火) 23:17:47.09ID:ROt4XEkp
>>676
さあなー。能力が低いのを言語のせいにしてるだけだしね。

そういや、連想配列がなかったらプログラム作れないと
言ってる人がいるがC言語には連想配列はない
0678デフォルトの名無しさん垢版2018/09/04(火) 23:20:18.74ID:ROt4XEkp
C言語に連想配列はなくても、誰かが作ったライブラリはある
そう考えると>>571の結論に戻る

> まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
> フレームワークやライブラリが不足しているから。
> 俺がシェルスクリプトで大規模開発をやらないのは、
> シェルスクリプトが適した内容で大規模なものを思いつかないから。
> それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。
0679 ◆QZaw55cn4c 垢版2018/09/04(火) 23:25:36.88ID:lJV/Mb/R
>>678
>誰かが作ったライブラリはある
それは具体的にどこにあるのですか?
それを見つけたとして、それを自分のプログラムに適用できるかどうか判断できるのですか?

単に(論理的に)存在すること、だけを言及しても意味がないと思いますけれども
0682612垢版2018/09/04(火) 23:29:35.30ID:GKTPwsNb
>>673
どうも君は健忘症みたいだから>>612から引用してあげるね。

> 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。

「数百行クラスになったら」って書いてますね...
相手の発言を確認せずに「全てのプログラムは」とか言っちゃうの、仕事でやったら信用失うから今後は気をつけた方がいいと思うよ。

> 静的型検査なしで書くのは面倒くさい。

はい、「動的言語では作れないんだというニュアンス」なんて全くないですね。
動的言語だと「面倒くさい」って書いてるだけでした。

仕事でもこんな調子でコミュニケーションしてるのかなあ。

> 小さいモジュールの集まりで作るから、

せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
0683612垢版2018/09/04(火) 23:32:47.66ID:GKTPwsNb
search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
日頃POSIX POSIX言ってるけど、シェルスクリプトの範囲しか知らない人かな。
0684デフォルトの名無しさん垢版2018/09/04(火) 23:33:18.38ID:ROt4XEkp
>>682
> 「数百行クラスになったら」って書いてますね...

だから矛盾してるんだよ。

「条件付きの結論」っていうのは、その結論(シェルスクリプトやRubyやPythonを使わない)が
正しいのはあくまで条件を満たされている場合であって

条件を満たさなければ、シェルスクリプトやRubyやPythonを使うということになる
0685デフォルトの名無しさん垢版2018/09/04(火) 23:34:16.08ID:ROt4XEkp
>>683
> search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。

いつ俺がPOSIXじゃないって言ったんだ?
「glibcで提供している」と書いてあるブログを持ってきただけだろ
0688デフォルトの名無しさん垢版2018/09/04(火) 23:36:56.71ID:ROt4XEkp
>>682

> せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
> モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。

だから、負担が大きいが、別に作れるだろって話

お前は極端なんだよ。規模が大きくなったときのことで悩んで、負担が大きいから使わないと
規模を大きくしなければ済む話なのに、それに気づいていない

まあ行数が同じなら、負担なんて大して変わらんがね。
動的型付き言語で大変なら、静的型付き言語でも大変
0689612垢版2018/09/04(火) 23:39:09.68ID:GKTPwsNb
>>684
君には日本語の勉強をお勧めしておく。
0691デフォルトの名無しさん垢版2018/09/04(火) 23:41:11.31ID:gZnu4stV
隔離病棟はものすごいことになってる
0692デフォルトの名無しさん垢版2018/09/04(火) 23:41:41.00ID:ROt4XEkp
>>612の正しい日本語を書いておくよ

俺、数百行クラスにならないときは動的言語にするから、
シェルスクリプトやrubyもpythonも使う
0695612垢版2018/09/04(火) 23:43:57.27ID:GKTPwsNb
いや、IDがないともっと悲惨だよ、これ。
次スレはワッチョイもつけた方がいい気がする。
0696デフォルトの名無しさん垢版2018/09/04(火) 23:44:19.45ID:ROt4XEkp
>>693
そういう可能性も考えて、元の板にも
スレ立てといたんだがねw

サマータイム導入に気をつけろよ
ローカルタイム使ってると同じ日時が
2回でてくることになるぜ
0697612垢版2018/09/04(火) 23:44:37.68ID:GKTPwsNb
>>694
すいません、以後控えます。
0698デフォルトの名無しさん垢版2018/09/04(火) 23:46:10.08ID:gZnu4stV
懸命に手を尽くしたましたが
手の施しようがありません
0700612垢版2018/09/04(火) 23:47:07.77ID:GKTPwsNb
やっぱり前スレの荒らしおよび、UNIX 板で後から意図的に重複スレ立てた人物だったんだね。
まあそうだろうとは思ってはいたが。
0702デフォルトの名無しさん垢版2018/09/04(火) 23:50:01.24ID:gZnu4stV
なるほどサマータイムスレであばれた低学歴知恵遅れの一部で
マジキチだったヤツか
0705612垢版2018/09/04(火) 23:51:43.34ID:GKTPwsNb
福岡県かあ。関東かと思ってたが違ったんだな。
0706612垢版2018/09/04(火) 23:53:33.54ID:GKTPwsNb
>>703
前々からそうじゃないかと思ってたが、やっぱりでしたね。
0707デフォルトの名無しさん垢版2018/09/04(火) 23:55:45.20ID:ROt4XEkp
>>705
実はもう一つプロバイダ持ってるw
そっちはホスト名調べても県名がでない

予備回線で昔(10年以上前)は大手プロバイダでも時々回線異常発生してたんで
持ってたんだけど、最近は使わないからやめようかと思ってるけどね
もう2ちゃんねるでスレ立てるするときにしか使ってないしw
0709デフォルトの名無しさん垢版2018/09/04(火) 23:58:49.53ID:ROt4XEkp
ワッチョイ板でも書いたけど日付変わったらIPアドレス変更するよ!
攻撃しないでね!(まあやっても無駄だけど)
0710デフォルトの名無しさん垢版2018/09/04(火) 23:59:32.47ID:ROt4XEkp
(まあIPアドレス変わっても書き込み内容が独特なのでストーキングしていればすぐに分かる)
0711612垢版2018/09/05(水) 00:01:43.69ID:D7naH2YM
これだけ荒らしておいて、まだUNIX板に戻る選択肢があると思ってるとは...
絶対に戻らないっことが、今回の
件でさらに強固になっただけだね。
そして ID:+CEwKGA5 はもう一つのプロバイダーを使った自演だったというわけだ。
0713デフォルトの名無しさん垢版2018/09/05(水) 00:33:48.24ID:uppndDPA
まず馬鹿ガイキチには叶わないっていう如実なサンプルってことで、以後ID:ROt4XEkp とわかったら途中でも終了スルーでいいだろう
0714デフォルトの名無しさん垢版2018/09/05(水) 03:10:59.07ID:mw/V56zA
元に戻るってのはID無くすってことだぞ
全く解決になってない
解決ってのはワッチョイなりIPなり表示させることだ
0715デフォルトの名無しさん垢版2018/09/05(水) 09:56:32.93ID:NuDqxS96
a="abc" から最初の一文字を削除するのは
echo "${a#?}" でいけますが、
この削除した文字を取得する方法ってないですよね?
0716デフォルトの名無しさん垢版2018/09/05(水) 10:20:06.92ID:04P6tucf
>>715
そのままだと多分ないな
今手元にkshしかないから検証は出来んがbashだったら
echo "${a:1}"
echo "${a:0:1}"
で代用したらどうだ
0717デフォルトの名無しさん垢版2018/09/05(水) 10:33:50.47ID:NuDqxS96
bashはまあそれでいけますよね・・・

試しに文字列の長さを測って
(ループで空になるまで1文字ずつ消していけばわかる)

文字列の長さ-1個の??????・・・という文字列を作って
${a%????・・・} で文字列の後ろを削って1文字残す
というやり方でevalも駆使して取り出したけど、

このやり方で1文字ずつループさせたら
1KB程度の文字列で1秒かかってしまったw
これならたぶんsedで1文字ずつ改行させて処理したほうが速いだろうな
0722デフォルトの名無しさん垢版2018/09/05(水) 10:48:45.20ID:NuDqxS96
>>719
あ、いや、どんな仕事をしているのかという
Linux、Macではないようだから
どんなOSを使っているのかとか
0724デフォルトの名無しさん垢版2018/09/05(水) 10:51:44.08ID:NuDqxS96
>>720
それでもいけるように見えるんだけど
aの中にa*bとか入れてみたら動かない

動くパターン
a="abc"
echo "${a%${a#?}}"
=> a

動かないパターン
a="a*b"
echo "${a%${a#?}}"
=> a*
0726デフォルトの名無しさん垢版2018/09/05(水) 11:14:09.22ID:jCw2sC+8
特殊文字かあ。 ' で括ってで問題なさげ
${a%'*b'}
なので、こうかな
eval 'b=${a%'"'${a#?}'}"
0730デフォルトの名無しさん垢版2018/09/05(水) 11:33:48.80ID:jCw2sC+8
あら。" で括ってでいいみたい?また、入れ子にちゃんとなってるの?{ } でちゃんとなってるのか
echo "${a%"${a#?}"}"
dashでも大丈夫みたいな
0733デフォルトの名無しさん垢版2018/09/05(水) 12:30:25.22ID:NuDqxS96
>>728
WSLも使ってるんだよね。cygwinもそうだったけど
外部プロセス起動っていうかforkになるのかしらないけど、
かなり遅くて、これぐらいに差になっちゃう

time sh -c 'for i in $(seq 100); do echo > /dev/null; done'

real 0m0.030s
user 0m0.000s
sys 0m0.031s

time sh -c 'for i in $(seq 100); do /bin/echo > /dev/null; done'

real 0m1.213s
user 0m0.000s
sys 0m0.750s
0734デフォルトの名無しさん垢版2018/09/05(水) 12:32:33.02ID:NuDqxS96
evalはさほど変わらない

time sh -c 'for i in $(seq 100); do eval "echo" > /dev/null; done'

real 0m0.031s
user 0m0.000s
sys 0m0.016s
0735デフォルトの名無しさん垢版2018/09/05(水) 13:00:13.96ID:NuDqxS96
>>730
めっちゃ高速化したw

1506文字を>>717でやったら1.7秒だったのが0.1秒にまで減った。およそ1/10

もっとも4倍の約6000文字をやったら1.6秒にまでなったので、
文字列が長くなるにつれてどんどん遅くなるようだね。
コピーする文字が多くなるからだろう。

sedで1文字ずつ分解した場合は6000文字でも0.2秒だったので
長い文字列を1文字ずつ処理するならsed、もしくはそれ相当の何かを使ったほうが良さそう。
(シェル芸で有名らしい grep -o . は改行が抜け落ちる)
0736デフォルトの名無しさん垢版2018/09/06(木) 20:18:06.55ID:DUG5skog
macOSのbrewでインストールしたdashで
echo '!' って実行したら \! ってなぜか
エスケープされて表示されるんだけど誰か心当たりある?

printf '%s' '!' でも \! と表示される
0737デフォルトの名無しさん垢版2018/09/06(木) 20:33:38.49ID:DUG5skog
もう一つ

case '!' in
[\!]) echo OK ;;
*) echo NG ;;
esac

これを実行すると、kshだけNGって表示されるんだけどkshのバグ?
mkshだとOKなのに
0739デフォルトの名無しさん垢版2018/09/07(金) 03:14:55.87ID:SvYUtRYX
>>737
ブラケット内だけの特殊文字 ! (および ^) でのエスケープ対応が必須ならバグだし、言及してないとかだったら動作不定なだけだな
ブラケット内の ! と ^ でのエスケープが効く効かないの動作が違うのはcaseの場合だけじゃないよ
0740デフォルトの名無しさん垢版2018/09/07(金) 08:32:30.20ID:dfq99u5c
>>739

いろいろ挙動を調べたけど
1. ブラケット内で!のエスケープは必須ではないし、必要ない。
2. 多くの実装ではどんな文字でもエスケープできるため \! は ! と認識されるが、kshはそうではない
3. ブラケットの先頭に!をつけた、 [!・・・] は否定表現
4. 否定表現自体にはどの実装も対応している
5. 例えば[A]だとAにマッチだが、[!]だと否定表現として扱われる
6. kshでは[!]を否定表現として扱われるのを防ぐ方法がない
7. 普通は[]を使うときは2文字以上になるはずなので殆どの場合問題ない
 (ただし何かの処理で動的にパターンを生成している場合はありえる)

ってことなのかな?

ちなみにこれ、POSIXブラケット表現っていう名前なのかな?
0741デフォルトの名無しさん垢版2018/09/07(金) 08:42:27.12ID:SvYUtRYX
動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
[!] は文法上エラーのようなもんだから、そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
0742デフォルトの名無しさん垢版2018/09/07(金) 08:53:35.87ID:dfq99u5c
あー、動的っていうのは、
> そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
ということをしたいんだけど、
ここが設定ファイルに書かれている文字とかで
ユーザーが1文字を指定してしまった場合
とかいうことです。

まあ1文字なら[!]じゃなくて!にするようにすればいいんですが。

> 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
ksh以外だとエスケープして [\!] と書けばOKですが、
kshだとエスケープして [\!] と書いてもNGという問題です。
0743デフォルトの名無しさん垢版2018/09/07(金) 09:02:06.16ID:SvYUtRYX
POSIXブラケット表現は違うんじゃないかなあ
ブラケットだけを何というのか知らんけど、パターンマッチング、ワイルドカード、グロブ定義のひとつかな。グロブがどうやららしいがそんな言葉使ったことないw
0744デフォルトの名無しさん垢版2018/09/07(金) 09:04:59.23ID:SvYUtRYX
>>742
細かく拘ってるけど、なに言いたいのかちょっとわからないねえ。本題と関係ないってことでいいね?
0746デフォルトの名無しさん垢版2018/09/07(金) 09:27:59.54ID:SvYUtRYX
じゃ、パターンマッチングでいいよ。めんどくさいw

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
2.13.1 Patterns Matching a Single Character
では、エスケープ対応しろと読めるような気がしないでもない。が、! 関連ではエスケープだけじゃなく動作が違うな、dash/bash/kshでは(bashだけが違うというのもある)
0747デフォルトの名無しさん垢版2018/09/07(金) 09:40:21.51ID:dfq99u5c
あー、やっぱりバグな気がしてきました。
一旦変数に入れるとkshでもOKになりました
ちなみにksh以外とはbash、zsh、dash、yash、posh、mkshのことです。

# 挙動を合わせるためposix互換モードにしています
# もしかしてkshにも似たようなのありますかね?
# kshでPOSIXLY_CORRECT、set -o posixは使えませんでした。
[ -n "$BASH_VERSION" ] && set -o posix

[ -n "$ZSH_VERSION" ] && emulate -R sh


expression='[\!]'
case '!' in
$expression) echo OK ;; # ksh、ksh以外でOKになる
*) echo NG ;;
esac

case '!' in
[\!]) echo OK ;; # ksh以外でOKになる
*) echo NG ;; # kshだけNGとなる
esac
0748デフォルトの名無しさん垢版2018/09/07(金) 09:44:26.93ID:SvYUtRYX
なんか「バグ」にこだわっているようだけど、バグだったらバグレポートでもする気なの??
bashの [a!] の場合の方が大きな問題のような気がしないでもないが、それもエスケープすればすむのでkshさえなのかな??
0749デフォルトの名無しさん垢版2018/09/07(金) 09:52:52.93ID:dfq99u5c
>>748
> bashの [a!] の場合の方が大きな問題のような気がしないでもないが、
どういうことでしょうか?
試してみましたが、どの環境でも想定通り動いているようですが。
↓検証コード

[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh

expression='[a!]'
case '!' in
$expression) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac

case '!' in
[a!]) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac

!は最初に持ってきたときだけメタ文字扱い(エスケープが必要)で
途中にあってもエスケープは必要ないみたいですね。
(むしろエスケープしないほうが良いみたい。後述?)
0750デフォルトの名無しさん垢版2018/09/07(金) 09:57:25.65ID:SvYUtRYX
ああ、すまん勘違いしてた。コマンドライン上での ! でのヒストリからの展開だった
0751デフォルトの名無しさん垢版2018/09/07(金) 10:04:32.56ID:dfq99u5c
!が最初以外にある場合に、\! とエスケープするとどうなるか?ですが挙動がバラけました。

[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh

expression='[a\!]'
case '\' in
$expression) echo OK ;;
*) echo NG ;;
esac

case '\' in
[a\!]) echo OK ;;
*) echo NG ;;
esac

# 変数に入れると a \ ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されていない)
ksh  OK  NG
zsh  OK  NG
yash  OK  NG
posh  OK  NG
mksh  OK  NG

# 変数に入れると a ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されている)
bash  NG  NG
dash  NG  NG

変数に入れない場合は、どちらも\はエスケープ文字列として認識されている
0752デフォルトの名無しさん垢版2018/09/07(金) 10:11:14.19ID:dfq99u5c
まとめると、どのシェルでも同じように動かすには

1. 可能ならば!は[]の最初に書かない
2. 1を満たしている場合には、!はエスケープする必要はない(しても良い)
3. !が[]の最初に書く場合は変数に入れてマッチングさせる
4. 3の場合には、!はエスケープする

というところでしょうか?
0754デフォルトの名無しさん垢版2018/09/07(金) 10:13:19.48ID:SvYUtRYX
! を文字としてなら、ブラッケットで括らない、他の文字があるなら2文字目以降にする
だけじゃないのかなあ
0755デフォルトの名無しさん垢版2018/09/07(金) 17:31:04.46ID:+cI6iexZ
>>736はへえと思ったけど他は正直どうでもいい
シェルによって違いはあるものだし同じシェルでもバージョンによっても違うかもしれないし
0756デフォルトの名無しさん垢版2018/09/08(土) 12:02:12.04ID:t/+GvP7Y
文字列の末尾がLFのものを別の変数に入れる場合、
b=$a ってするしかないかな?
b=$(foo "$a") ってやったら消えるよね

関数で処理した結果を変数に代入したいんだけど、文字列末尾のLFは消したくないし、
LFはない場合も複数個の場合もあるので無条件にLFつけたりもできない
0759デフォルトの名無しさん垢版2018/09/08(土) 12:57:29.41ID:t/+GvP7Y
消えますよ

[test.sh]
IFS=""
LF=$(printf '\012_') LF=${LF%_}
a="test$LF$LF$LF"
foo() { printf '%s' "$1"; }

printf '%s' "$a" # 1つめのテストの末尾のLFは消えていない
b="$(foo "$a")"
printf '%s' "$b" # 2つめのテストの末尾のLFは消えてる

[実行]
test.sh | hexdump -C

00000000 74 65 73 74 0a 0a 0a 74 65 73 74 |test...test|
0761デフォルトの名無しさん垢版2018/09/08(土) 13:28:37.24ID:t/+GvP7Y
違う。$(・・・)をすると挙動が変わる(末尾のLFに全削除の効果)

foo "$a" だけなら末尾のLFは消えない
0763デフォルトの名無しさん垢版2018/09/08(土) 13:54:13.20ID:t/+GvP7Y
そういやファイル名やディレクトリ名に改行を含めるべきかどうか
POSIXで議論してるみたいな話が上の方で書いてあったけど
名前の末尾に改行が含まれてる場合に消えるから
dirnameやbasenameで取得できないってことになるな。
もういい加減仕様で含めるのやめればいいのに
0767デフォルトの名無しさん垢版2018/09/08(土) 16:55:08.56ID:SescvIaG
> IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば

消えますよ?だからまず自分のミスを認めましょうってことですよ。
0769デフォルトの名無しさん垢版2018/09/08(土) 16:59:06.30ID:SescvIaG
> IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば

>>759を読みましょう。
明らかに消えています。

あなたのミスですよね?
実験もしないで嘘ばっかり
0772デフォルトの名無しさん垢版2018/09/09(日) 01:30:00.09ID:40h5Vf3t
alias wgeti='wget -ci <(cat <<_'
エイリアスでwgetをちょっと弄ったんですがこれの関数版作れないですかね
これで複数行のURLをDLできるけど最後に_と)入れる必要あるので
0773デフォルトの名無しさん垢版2018/09/09(日) 11:41:02.87ID:ZnXA8VyU
bashの拡張機能で便利なのってなんだろうか?
変数展開は便利だと思うんだが、
配列とかハッシュとか必要なんだろうかね?

配列は標準入力から受け取ってループで回せば良いわけで
それが必要になった時点で使い方を間違ってるという気がしてる

他にbashで便利なものってあるかな?
pipefailぐらい?
0776デフォルトの名無しさん垢版2018/09/10(月) 00:47:57.63ID:hUyLWeb6
それってこれでいいのでは?

wgeti () {
wget -c $@
}
0777デフォルトの名無しさん垢版2018/09/10(月) 00:48:53.10ID:hUyLWeb6
ああ、でも、引数にするなら何もしなくていいのかw
そのまんま wget の後に URL 入れるだけだ。
0778デフォルトの名無しさん垢版2018/09/10(月) 02:03:17.65ID:P2aNZV+z
標準入力からURLのリストを渡したいから
<(cat <<_って書いてあるんだと思った。
wget、普通に引数から複数のURL渡せるね
0779デフォルトの名無しさん垢版2018/09/10(月) 02:36:11.00ID:MLFQqRH+
コマンド引数の文字数制限に引っかかる可能性を
考慮すると wget -ci <(cat <<_ の方が無難なのだろう
(xargs でもいいけど)
0780デフォルトの名無しさん垢版2018/09/10(月) 21:09:13.29ID:P2aNZV+z
local or typeset を使用しても本物のローカル変数ではないというのは面白い性質だよな
(本物のっていうのは一般的な言語相当のローカル変数という意味)

i=A
foo() {
local i=B
echo "foo1 $i" # => foo1 B
bar
echo "foo2 $i" # => foo2 C
}
bar() {
echo "bar $i" # => bar B
i=C
}
foo
echo "$i" # => A

「この関数の中だけで使う変数です。」ではなくて
「localの場所で変数を保存します。関数が抜けたら保存した値を戻します。」
という意味なんだよね。

POSIXにはないlocalやtypesetを使っても本物のローカル変数にはなれないが、
引数だけは本物のローカル変数になっているというのも面白い
(何も書かなくても関数に入った時点で、自動的にlocalが実行されると考えることもできる)

引数への代入は $1=123 とか 1=123 みたいにはできないけど、
set -- "123" "456" "789" みたいにすると再設定できる。
$1だけ設定したくても、すべての引数を設定する必要があるけど。
グローバル変数は時に分かりづらいバグを生むことがあるけど
これをうまく使えば、使用する変数をなくせたり減らせたりするかもしれないな
0781デフォルトの名無しさん垢版2018/09/10(月) 23:57:57.78ID:3w8KnLJN
ダイナミックスコープはperlとかpowershellとかmathematicaとかにもあるけど、これもグ口ーバル変数並にバグの温床な気がする
0782デフォルトの名無しさん垢版2018/09/11(火) 01:49:50.99ID:oHtbKRPF
あぁ、これがダイナミックスコープのことなのか
Perl?って思ったけど、(Perlの)localを使った場合の話なのね。
通常はmyを使ってたから。
0783デフォルトの名無しさん垢版2018/09/13(木) 14:07:12.80ID:q7iUBK5M
ふと思ったんだけどシバンってあるじゃんシバン
あれってさ、#がコメントじゃない言語だったらどうするの?
Cインタプリタだったら

//!/usr/local/bin/c

とか書くの?
0785デフォルトの名無しさん垢版2018/09/13(木) 16:45:07.13ID:1sKEH3Wo
>>784
シバンってカーネルが解釈してんのか
だからFreeBSDとOS XとGNU/Linuxで挙動が変わるんだな。同じbashでも。
0787デフォルトの名無しさん垢版2018/09/13(木) 21:25:29.73ID:fcPV9kIu
>>783
面白いネタを振ってくれてありがとう。いろいろ調べて勉強になったよ。
ちなみに質問の答えは「できないとは限らない」ということになるかなあ。
ネタを振ってくれたことには感謝するけど、自分で調べるほうが楽しいよ。
0790デフォルトの名無しさん垢版2018/09/14(金) 04:16:04.32ID:q3l06dS7
>>786
FreeBSDだと
#! /usr/bin/env awk -f
これが普通に通るけど
GNU/Linuxだと
“awk -f”なるコマンドがないとかなんとか言われる
0791デフォルトの名無しさん垢版2018/09/14(金) 05:06:28.57ID:hVbFTBye
素朴な疑問
・ shebangは シェバン? シバン?
・ "#!"の後にスペース入れずに "#!/bin/sh" ? スペース入れて "#! /bin/sh" ?
自分はともに前者、特にスペースについては入れるべきではないというの最初に覚えたんだけど、
結構後者も目にすることがあるので、実際のところ、どうなの?
0792デフォルトの名無しさん垢版2018/09/14(金) 09:25:36.66ID:lqNqtREE
>>790
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/execve.2.html
うぉ、Linuxまじ最低だな

インタープリタースクリプトの optional-arg 引き数の解釈方法は実装により異なる。
Linux では、インタープリター名 interpreter に続く文字列全体がインタープリターに
1個の引き数として渡される。 しかし、動作が異なるシステムもある。 あるシステム
では、 optional-arg のうち最初のホワイトスペースまでが 引き数として渡される。
また、別のシステムでは インタープリタースクリプトは複数の引き数を持つことができ、
optional-arg 内のホワイトスペースが引き数の区切りとなる。
0793デフォルトの名無しさん垢版2018/09/14(金) 09:40:37.87ID:CXa+ZLzo
>>790
本題のshebang仕様とは話がずれるが、
awkはいにしえの奴も含め俺の知る限りすべて/usr/bin/awkで起動できるから
env使う必要ないと思う。
0794デフォルトの名無しさん垢版2018/09/14(金) 09:48:01.90ID:CXa+ZLzo
>>791
#! の後のスペースは、どのOSでも有無に関わらず動いたと思う。
ただしshebang行に32バイト制限のあるOS があったので、
それに引っかかるギリギリならスペース無しにする必要アリ。

読みは知らない。
0796デフォルトの名無しさん垢版2018/09/14(金) 12:12:08.80ID:CXa+ZLzo
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?
0797デフォルトの名無しさん垢版2018/09/14(金) 16:14:10.39ID:6xTUz+7n
>>796
それだと実行権限の意味がなくなるじゃん
実行権限をつけるのは、いちいち実行プログラムのパスを指定しなくていいからでしょ?
拡張子もなくせばなんの言語で作られているかも意識しないですむし。

手でコマンドを打ったときと同じように、環境変数の$PATHからどれを使うかが決まる。
そもそもなんで最初からそういう仕組みにして置かなかったんだろう?
そうすりゃシバンなんて #!awk だけですんだのにね
0800デフォルトの名無しさん垢版2018/09/14(金) 16:36:11.79ID:6xTUz+7n
>>798
シバンの話だよ
実行するスクリプトのパスじゃなくて
実行するスクリプトが使用するインタプリタのパス
0801デフォルトの名無しさん垢版2018/09/14(金) 16:46:56.10ID:gmWhNmZA
シバンの話は分かってるけど?
実行するスクリプトが使用するインタプリタに実行権限付いてなかったら
当たり前だけど絶対パスで指定したって実行できないよ?
0803デフォルトの名無しさん垢版2018/09/14(金) 16:53:40.07ID:UfVRD/gP
>>794
> shebang行に32バイト制限のあるOSがあった
なるほど、そんな理由もあったんだね。

逆にスペースorタブを入れなければならない、なんていう例(4.1BSD)もあったみたいだ。
これについては修正されたようだけど、今でもこれを守っている人もいるらしい。

同じ#で始まっていても、コメントとは違うと思うから、
やはりスペースを入れることにはなんとなく躊躇しちゃうわ。
0804デフォルトの名無しさん垢版2018/09/14(金) 18:40:33.82ID:q3l06dS7
俺は半分脳死状態で
#! /bin/sh -
↑半角スペース ↑ハイフンマイナス
にしてるわ。

上でも書いてくれた人がいるけど,#!の後に空白が必要な環境があったり
先頭行から継続してパースしてしまい
(ほとんどありえないことだけど)
#! /bin/sh

-c
みたいなファイルに対し
/bin/sh -cというオプション付きshインタプリンタを起動してしまうOSもあるみたい
(オライリーのシェルスクリプト本に記述あり)
0806デフォルトの名無しさん垢版2018/09/14(金) 19:07:11.14ID:6xTUz+7n
>>802
わかってる

#!/home/me/bin/awk -f
って書いたら、必ず /home/me/bin/awk が使われてしまう

例えばdebian 9のawkは4.1.4だがdebian 7は4.0.4だった
debianのawkのパスは /usr/bin/awk だが。debian 9で自分でawkの
最新版をビルドして /usr/local/bin/awk に入れたとしよう

awkスクリプトのシバンが #!/usr/bin/env awk と書いてあれば
$PATHを見て適切な /usr/local/bin/awk を選んでくれるが、
envを使ってないと、/usr/bin/awk 決め打ちになってしまう

大量にある(かもしれない)awkスクリプトのシバンを全部書き換えるなんてナンセンスだし
せっかく実行権限が付いてるのに、awk スクリプトファイル名 と書くのもナンセンスだろ

実行プログラムが何の言語で書かれているかなんて、利用者には知ったことじゃないんだから
fooコマンドはfooコマンドとして実行してほしいし、 使用するインタプリタは $PATH を見て欲しい
0807デフォルトの名無しさん垢版2018/09/14(金) 19:21:44.66ID:za5qG/O1
なんかいろいろ誤解しとるw
0808デフォルトの名無しさん垢版2018/09/14(金) 19:27:29.88ID:EsLYvq4M
>>806
何をしたいとかは別として、実装としてできないんだよ。
カーネルのシステムコールexecveはPATHを見ない。
PATHを見てるのはユーザランドのライブラリ関数のexecvpとか。
大改造が必要になる。
0809デフォルトの名無しさん垢版2018/09/14(金) 19:38:49.59ID:6xTUz+7n
>>808
実装としてできないってどっちの話?

勘違いしている人がいて、話の前提で止まっている人がいてややこしいけど
>>806の話は理解した上で、俺が提案した #!awk でいいじゃんって話だよね?

PATHを見れないというのなら、見る必要はないよ。
#!awk -f という記述(絶対パスでないもの)を決め打ちした文字(/usr/bin/env )を
頭に入れて #!/usr/bin/env awk -f として解釈すればいいだけ

どういう文字を頭に入れるかはディストリが決めたカーネルの
ビルドオプションででも設定すればいいだろう

単なる文字列の変換でしかないので、カーネルだけでできる
0810デフォルトの名無しさん垢版2018/09/14(金) 20:18:23.13ID:EsLYvq4M
カーネルが特定の決め打ちしたバイナリを呼ぶようなことはないよ。
せいぜいinitだけ。
0811デフォルトの名無しさん垢版2018/09/14(金) 20:29:56.82ID:6xTUz+7n
そういう中途半端なレスはやめて欲しい。
結局>>809の方法で可能だってことだろう?
そうでないなら、そうでないとわかるように理由を添えて書いてくれ
0813デフォルトの名無しさん垢版2018/09/14(金) 20:33:54.17ID:6xTUz+7n
補足すると>>809読めばわかると思うけど、読み取ったシバンの文字列を置き換えるだけ。
だからカーネルが特定の決め打ちしたバイナリを呼ばないというのが事実であっても
読み取ったシバンの文字列を置き換える話と無関係の話ということ
0814デフォルトの名無しさん垢版2018/09/14(金) 20:35:05.30ID:6xTUz+7n
>>812
話がすり替わってる。

技術的に可能かどうかの話をしている所に、
じゃあってみせろと言われても、
それは関係者を説得するのは難しいだろう?別の話だろ?
0815デフォルトの名無しさん垢版2018/09/14(金) 20:36:01.42ID:EsLYvq4M
可能か不可能かで言えば、もちろん可能だよ。なんだって可能。
でも、カーネルとユーザランドは明確に分けろって怒られるだろうね。
0816デフォルトの名無しさん垢版2018/09/14(金) 20:39:33.43ID:6xTUz+7n
>>815
話聞いてるか?
シバンはカーネルが読み取るもの
ユーザーランドのものには一切手を出していない。
読み取ったシバン文字列を置き換えるだけなんだから
0817デフォルトの名無しさん垢版2018/09/14(金) 20:39:41.70ID:1jWDqP4V
>>809
カーネルいじればそれは可能だな。
カーネル書ける人なら目茶目茶難しいってほどじゃないから、
カーネル書ける人雇えばいいぞ!

ただしそれを標準カーネルの機能として入れてもらえるように
議論するのは、カーネルに機能追加するよりだいぶ大変かも。
#! じゃない別のmagic文字列にした方が提案通りやすいかもな。
頑張れw
0818デフォルトの名無しさん垢版2018/09/14(金) 20:42:06.79ID:6xTUz+7n
>>817
技術的に可能でありユーザーランドを触ってないってのは同意したの?

だから関係者と話をつけるのが難しいっていうのは
別の話だから、すり替えるのはやめてくれと行ったんだが
0819デフォルトの名無しさん垢版2018/09/14(金) 20:43:14.61ID:6xTUz+7n
つーか、いい加減にしないといつもの荒らしモードに入るぞ?w

議論に負けそうになると、話をすり替えて、
俺を呼ばわりするのはいつもの手だよなw

もうそろそろ荒らし認定することだと思ってるんだが?w
0821デフォルトの名無しさん垢版2018/09/14(金) 20:46:17.92ID:6xTUz+7n
反論しないならさっさとNGIDに入れて
俺に反論できない状態を作ってくれよ?

見れなくなったら俺に反論できないんだから
それこそ俺の望んだ結果だw

はい、結論。>>809の方法で技術的には実現可能です。
反論がある人は、関係者を説得して調整をするのが難しいって
別の話にすり替えないで技術的な話でお願いしますねー
0822デフォルトの名無しさん垢版2018/09/14(金) 20:46:23.72ID:1jWDqP4V
>>818
なんか別人と勘違いしてるようだが、俺は技術的にできないと書いたことは一度もない。

この勝手に勘違いしてるあたり、もしかしていつもの人か?
0824デフォルトの名無しさん垢版2018/09/14(金) 20:48:54.07ID:1jWDqP4V
だって勝手に勘違いして勝手な仮定して勝手に腹立ててるんだもん。

せっかく賛成してた俺まで敵視しだす有り様だし。
自業自得ってことよ。
0826デフォルトの名無しさん垢版2018/09/14(金) 20:54:16.23ID:6xTUz+7n
>>824
5ちゃんねるなんだからこの程度のもんよ

こっちが真面目に話をしていても、とりあえず何か言い返せば
それが反論したことになるみたいな、みたいなクソみたいなレスしてくる

いい案だと思うなら一言「それはいい考えだ」ぐらい書けと
自分が間違っていたら、素直に間違いを認めるやつばかりなら、
それもこんなにどうでもいいことを、毎回書かなくてすむんだよ
0831デフォルトの名無しさん垢版2018/09/14(金) 21:12:09.04ID:6xTUz+7n
>>830
単なる文字列の置換に過ぎない
カーネルはシバンがファイルパスなんて思ってない。

カーネルがシバンを読み取るというのなら、少なくとも
読み取ったものがシバンであるということはわかってる
あとはそこににある文字列が、ファイルパスだろうが
ランダム文字列だろうが関係ない

単に#!の後に固定の文字列を埋めるだけ
あとは後続のプログラムに渡せば、
そいつが勝手になにかしてくれるんだろ?
それはカーネルの知ったことじゃない
0833デフォルトの名無しさん垢版2018/09/14(金) 21:44:08.73ID:6xTUz+7n
>>832
お前1人で意味不明の話をしてるんだってw

(awkスクリプトで書いた)fooコマンドが実行できるのは
fooコマンドに実行権限がついているからだし、そのfooコマンドの
シバンで指定されたプログラムも実行権限がついていなければいけない

当たり前の話だが、上記の理由により awkであっても /usr/bin/envを
使っておいたほうが良いって結論を言ったんだが、
それに対して前は何の話をしてるのだ?
0834デフォルトの名無しさん垢版2018/09/14(金) 21:46:58.87ID:6xTUz+7n
どうもこの話を理解できないのが、おかしいと思うんだが、
もしかしてawkスクリプトに実行権限をつけるという発想がないのか?
いつもawk -f スクリプトファイル名 で実行してるとか?

いや、まさかな。
シバンはスクリプトファイル名だけで実行するためにあるんだし
そのために実行権限つけるだろう。

でもなぁ、ここまで以上に理解能力がないのは、
まかさが的中しているとしか思えない。
シバンをつける意味もわかってなかったりしてw
0836デフォルトの名無しさん垢版2018/09/14(金) 22:00:24.41ID:6xTUz+7n
>>835
ということは、シェルスクリプトを実行させるときはsh使って
perlスクリプトを実行させる時はperlを使ってるのかな?

かつてsystemdが普及するまではみんなが使っていた
serviceコマンドやbyobuはシェルスクリプトだし
apt-fileやshasumはPerlスクリプトだし
ufwはPythonスクリプトだよ

実装がなんのスクリプト言語で作られているかなんて気にしなくていいじゃないかw
0838デフォルトの名無しさん垢版2018/09/14(金) 23:01:40.99ID:gmWhNmZA
>>833
俺は>>797でお前が意味不明な
> それだと実行権限の意味がなくなるじゃん
と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
機能的文盲とかいうやつなのか?
0839デフォルトの名無しさん垢版2018/09/14(金) 23:05:15.75ID:fXySkelb
$ls aho.sh
rw-r--r-- aho
$. ./aho.sh
aho
$
0840デフォルトの名無しさん垢版2018/09/14(金) 23:06:41.90ID:fXySkelb
$cat ./aho.sh
echo aho
$
0842デフォルトの名無しさん垢版2018/09/15(土) 01:10:17.43ID:pm09nqHo
>>838
> と、書いてたからパス指定と実行権限の意味は無関係だと指摘してるだけなんだが
> 機能的文盲とかいうやつなのか?

実行権限がついているとパスの指定を省略できるんだよ

ご存知じゃないかもしれないが(皮肉)パスの指定を省略した時に
$PATHに設定された複数のパスから、パスを補完してくれる機能がある
つまり$PATHからパスを補完してほしいなら実行権限をつけないとだめ

(awk)スクリプトを$PATHの中から補完してほしいなら実行権限をつける。
そうするとパスを省略して実行できる。
スクリプト自体は$PATHから補完してくれる、だけどそのスクリプトに
シバンが/usr/bin/awkとなっていると、スクリプトを実行するインタプリタは
/usr/bin/awk固定となってしまう。

/usr/bin/env awk -f と書くことで、インタプリタ自体も$PATHから検索してくれる

パス指定を"省略すること" と 実行権限の意味、いい加減理解しましたかね?
0843デフォルトの名無しさん垢版2018/09/15(土) 01:13:44.97ID:pm09nqHo
ほんと、理解能力がないのか、
それとも、単に技術レベルが数ランク下なのか知らんが
馬鹿を相手にしてると疲れる。煽りたくもなるわw
0844デフォルトの名無しさん垢版2018/09/15(土) 01:20:22.61ID:pm09nqHo
> 796 返信:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 12:12:08.80 ID:CXa+ZLzo [3/4]
>>795
システム付属じゃ駄目で、自分でビルドした特有の事情があるなら、絶対パス指定で呼べばいいのでは?


797 名前:デフォルトの名無しさん[sage] 投稿日:2018/09/14(金) 16:14:10.39 ID:6xTUz+7n [2/20]
>>796
それだと実行権限(をつけてパスを省略できるようにした)の意味がなくなるじゃん


ここまで言えば、馬鹿でも理解できるかな?
まだ説明しないと理解できない?
0845デフォルトの名無しさん垢版2018/09/15(土) 01:22:03.62ID:pm09nqHo
実行権限は単に実行可能にするだけじゃない
パスを省略して$PATHの中からパスを補完してくれる機能があるのだ
0846デフォルトの名無しさん垢版2018/09/15(土) 01:32:29.75ID:pm09nqHo
まあ、細かいことを説明するなら、"スクリプトファイル" の実行パスを
検索してくれるのはシェルで、シェルが$PATHの中から
実行ファイルを見つけることができるようにするために実行権限をつける

でも今は "スクリプトファイル" の実行パスの検索の話ではなく
シバンから起動する "インタプリタ" の話
シバン自体には$PATHの中から検索してくれる機能はなくて
単にシバンに書かれたパスのプログラムを実行するだけ

そこで出てくるマジックが /usr/bin/env awk -f
シバンは$PATHを検索しないが、/usr/bin/envが$PATHを検索して
適切なプログラム(ここではawk)に引き継いでくれる


などと丁寧に説明してやったら、今度は長文だーとか言って
荒らし呼ばわりするんだろう?
0847デフォルトの名無しさん垢版2018/09/15(土) 02:03:07.61ID:pm09nqHo
話は変わるけどさ、

シェルスクリプト(シバンは #!/bin/sh 実体はdash)に
A=
A=123 echo "$A-1"
echo "$A-2"

って書いて実行したら以下のように表示されるんだよ。
-1
-2
この動きはA=123が評価される前にechoの変数展開が行われて-1になって
実行したらAの内容が元に戻るから-2と表示されるということで理解できる


でも以下のように書いたら
A=
A=123 eval 'echo "$A-1"'
echo "$A-2"

次のように表示されるんだよ
123-1
123-2

これはどういうわけだろう?

さらにbashとzshで実行した場合は以下のように表示されたw
123-1
-2
この動作ならまだ理解できる。

でもkshやposhやyashなんかはdashと同じ
どっちが正しい動きなんだろう?
0849デフォルトの名無しさん垢版2018/09/15(土) 05:43:59.56ID:krdUo6un
>>847
単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?
てか、あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから正しいか間違いかで考えること自体がおかしい。
0850デフォルトの名無しさん垢版2018/09/15(土) 06:12:06.93ID:pm09nqHo
>>849
> 単にシェルごとに仕様が違ってるだけで全て正常動作だろうし正しいと言えば正しいのでは?

POSIXの仕様と照らし合わせてって意味だよ

POSIXの仕様と照らし合わせて正しいのか間違ってるのか
そもそもPOSIXにこういったときの仕様は定義されていないのか

> あらゆるシェルはこのような時はこのような動きにならなければいけないみたいな決まりがあるわけでもないんだから

決まりはあって、それがPOSIXの仕様のことだよ
0854デフォルトの名無しさん垢版2018/09/15(土) 15:58:58.37ID:8KftQgLD
俺自身にもそういう傾向があるが
訊かれてもないことをずらずら書いて自己満足に浸るのはよくないと思う。
現実の人間関係でもそういう人はハブられがちだし。
0855デフォルトの名無しさん垢版2018/09/15(土) 16:00:37.10ID:KIanXBkQ
聞いたことを答えないで
聞かれてないことを答えるのは
それはそいつが何も知らないときだ

オマエはなにもわかってない
0856デフォルトの名無しさん垢版2018/09/15(土) 16:04:38.00ID:pm09nqHo
>>855
誰がそんなことを答えてくれと質問したんだ?

聞かれてないことをペラペラ喋ってるのは
あんただろう?w
0860デフォルトの名無しさん垢版2018/09/15(土) 16:32:31.20ID:Svn0IWNp
質問のときだけはへり下るのな
身を正してのつもりかもだが、質問のときだけですぐに豹変するからお前の場合はもうただただ気持ち悪いだけ
0861デフォルトの名無しさん垢版2018/09/15(土) 16:35:43.79ID:pm09nqHo
何だ?質問も高圧的にすれば満足するんか?
ただ文句言いたいだけだろ。
そんな無駄な会話してないで
本題にもどれや
0862デフォルトの名無しさん垢版2018/09/15(土) 16:38:13.80ID:Svn0IWNp
どうしてそっちになるのだか。やっぱりそっちが素で付け焼き刃のへりくだりか
社会的にはは豹変しない方になんだけどなあ
0863デフォルトの名無しさん垢版2018/09/15(土) 16:45:50.83ID:pm09nqHo
やっぱり意地でもスレと無関係の話をしたいようだ。
お前がいなくなればスレは平和になるのになぁw
0864デフォルトの名無しさん垢版2018/09/15(土) 16:50:58.66ID:Svn0IWNp
なにその俺は違う的なレスは
さすがいままでのレスで自己中ぶりを発揮しまくっただけあるやつだなあ。ただただ気持ち悪いのもそれは自己中ぶりからなんだかが、わからないだろうな、わかってたらそんな自己中にはならんだろうし
0865デフォルトの名無しさん垢版2018/09/15(土) 16:55:24.75ID:SSTURz0o
なるほど、コマンドライン上にある変数(シェルが予め展開する変数)はそのままなのか
fork & exec されるプロセス空間の環境変数にのみ作用するのだからそうなるわな

$ PATH=hoge ls "${PATH}"
$ PATH=hoge /bin/ls "${PATH}"
0866デフォルトの名無しさん垢版2018/09/15(土) 17:01:07.67ID:Svn0IWNp
>>865
それと、(一時的)環境変数をいつするのかと、環境変数をいつ展開するのかが被ってるてとこかなあ
A=123 /bin/echo "$A"
A=123 bash/dash/ksh/etc... -c 'echo "$A"'
0867デフォルトの名無しさん垢版2018/09/15(土) 17:19:32.41ID:8KftQgLD
>>866
そのコマンドラインは,「直前に指定した変数が影響しない」のが正しい挙動だよな

なぜならシェルはそれらを一緒くたに処理するから,変数の変化を参照できない
↑この理解って正しい?

bashコマンドラインで
$ VAR=val echo $VAR
# なにも返らず
$ VAR=val; echo $VAR
val
こういう挙動から推測したんだけども。
0869デフォルトの名無しさん垢版2018/09/15(土) 17:42:37.90ID:pm09nqHo
>>865
forkされる場合ってのはわかりやすいんだけどね

> A=
> A=123 echo "$A-1"
> echo "$A-2"
>
> 次のように表示されるんだよ
> 123-1
> 123-2

実行するのがシェルビルトインコマンドであっても実行後は元に戻る

ん?頭にA=123をつけた時、本当にシェルビルトインの
echoが呼ばれてるのか?と思ってecho --versionとしてみたが、
やっぱりシェルビルトインの方だった。
(/bin/echo --versionだとバージョン情報が表示される)
他のシェルで試してみたがすべて同じ挙動

ということで

> A=123 echo "$A-1"

と書いたら変数の内容は実行後に元に戻る。
というのが基本の動きでいいのだろう
まあよく知られた機能だよね。
0870デフォルトの名無しさん垢版2018/09/15(土) 17:43:08.57ID:pm09nqHo
ちなみにコマンドライン(シェル)じゃなくて
スクリプトを書いて実行して確かめてる
0871デフォルトの名無しさん垢版2018/09/15(土) 17:56:26.73ID:pm09nqHo
知ってると思うんだけど、念の為

var=value command

この構文は、変数varにvalueを入れるだけじゃなくて
export varした状態になる。だからcommandが
外部コマンドであっても値は引き継がれている
(今回の話とは直接関係はない)
0872デフォルトの名無しさん垢版2018/09/15(土) 18:00:22.45ID:pm09nqHo
話を簡単にすると

A=
A=123 eval :
echo $A

dashだと123と表示される。
bashだと何も表示されない。
0874デフォルトの名無しさん垢版2018/09/15(土) 18:22:17.36ID:pm09nqHo
>>873
それは気づかなかった。ってことはPOSIXで仕様化されてるってことかな?
evalだけ特殊と。なんでだろうね。
0876デフォルトの名無しさん垢版2018/09/15(土) 18:43:07.13ID:pm09nqHo
>>875
それは単に「VAR=var echo $VAR」が1行だから
先に$VARが展開されるだけだと思うよ

変数を一時的に変更したいけど、別変数にバックアップして元に戻すの面倒だな
その他にも方法あるけどアレ(省略)だし、

よし、var=value command構文を使おう!
うお、先に$VARが展開されちまった
ぴこーん!だったらeval使えば先に展開されることないんじゃね?

よし動い・・・あれぁ、変数を一時的に変更したかったのに
実行終わっても変数が元に戻らないよぉ

よし5ちゃんねるだ。という流れw
0877デフォルトの名無しさん垢版2018/09/15(土) 18:52:32.83ID:8KftQgLD
>>876
もうとっくに分かってると思うが 俺が思い付いたのは
$ VAR=val-b4
$ (VAR=val-tmp; echo $VAR)
→ val-tmp
$ echo $VAR
→ val-b4
くらいだな
0878デフォルトの名無しさん垢版2018/09/15(土) 19:22:09.86ID:imSsWev+
https://i.imgur.com/VhwX2Fq.jpg

このスクショのようにmediainfoというコマンドのAudioの項目のFormatを取り出す方法教えてほしいです

以前はそのAudioのFormatという文字列はFormat profileだったので、
mediainfo "$FILE" | grep -E '^Format profile' | sed -E 's/.*: (.*)/\1/'
こうやってその行を抽出していたんですが、mediainfoがバージョンアップしてFormatという文字列に変わってしまいました。
Generalの項目にもFormatがあるので、これだと調べられません。
どうやるんでしょうか?
0879デフォルトの名無しさん垢版2018/09/15(土) 19:37:37.26ID:SSTURz0o
GNU sed の -r オプション使ってるけど、こんな感じで

$ mediainfo "$FILE" | sed -nr '/^Audio/,$s/^Format +: (.+)/\1/p'
0883デフォルトの名無しさん垢版2018/09/15(土) 19:42:08.44ID:8KftQgLD
>>878
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s
これでどうだろう?

ところで綺麗な端末だね。
0885デフォルトの名無しさん垢版2018/09/15(土) 19:43:35.86ID:8KftQgLD
ちなみに俺のコマンドラインはPOSIXに準拠してるので可搬性は高いと思うよ(ドヤ顔)
0886デフォルトの名無しさん垢版2018/09/15(土) 19:50:28.32ID:pm09nqHo
Format複数あっても出力されるはずなのにおかしいと思ったら
CRLFになってたw いい加減ATOMのデフォルトを変えないと

>>885
> POSIXに準拠してるので
そうそう。それを言おうと思っていたw

>>879
> GNU sed の -r オプション使ってるけど、こんな感じで
-r じゃなくて -E を使えば良いのでは?
POSIX準拠?かどうか知らないけど-Eは使えるはず
0887デフォルトの名無しさん垢版2018/09/15(土) 19:57:27.53ID:SSTURz0o
>>886
>> GNU sed の -r オプション使ってるけど、こんな感じで
>-r じゃなくて -E を使えば良いのでは?
>POSIX準拠?かどうか知らないけど-Eは使えるはず

癖で指が -r を押してしまう…以後気をつけます
0888デフォルトの名無しさん垢版2018/09/15(土) 19:59:15.83ID:pm09nqHo
Macだと\sは使えないのかな?
とりあえず>>879を参考にしつつ修正してみた。
General、Audio、の次になにか来ても対応できるようにしてみた。
これなら-Eいらんかったわ。macOSで動くのを確認済み

sed -n '/^Audio/,/^$/ s/^Format *: *// p'
0889デフォルトの名無しさん垢版2018/09/15(土) 20:01:46.68ID:pm09nqHo
-Eが良いよ(ドヤァ)

POSIX準拠というより可搬性重視なので、
-Eが使えるなら-Eつけてれば良いんじゃね?ぐらいに思ってるw
0890デフォルトの名無しさん垢版2018/09/15(土) 20:06:03.93ID:pm09nqHo
>>883
> grep '^Format' | cut -f '2-' -d ':' -s

grepしてcutするって流れは、俺もよくやるんだけど、
awk一つにまとめられる(と後からよく気づくw)
0891デフォルトの名無しさん垢版2018/09/15(土) 20:13:17.74ID:8KftQgLD
>>890
でもなんかその操作をawk一つにまとめるって
emacsのorgモードに近い印象を受けるというか
ちょっとUnix哲学っぽくねえなと思う。

もちろんUnix哲学に従う必要性は皆無なんだけど,あくまで個人的な意見として。
0893デフォルトの名無しさん垢版2018/09/15(土) 20:20:10.43ID:8KftQgLD
>>892
俺の >>883 ←これはそんなことやってねえぞ(謎の自信)
検索→表示オンリー

スレチにもほどがあるのでそろそろやめるわ
0894デフォルトの名無しさん垢版2018/09/15(土) 20:41:53.02ID:pm09nqHo
sedもawkも複数行のスクリプトを実行できるわけで
一つのコマンドで複雑な異なる機能を提供してるから
Unix哲学から反してるのかもね

だから例のアレはUnix哲学がどうとか言ってる割に
結局awkでプログラム書くんかいって突っ込みたくなるんだな
0895デフォルトの名無しさん垢版2018/09/15(土) 20:45:00.31ID:8rxpHkWL
まだとどまる事のない誤解を披瀝し続けとってわろたw
0896デフォルトの名無しさん垢版2018/09/15(土) 21:28:41.91ID:imSsWev+
みなさんどうもありがとうございます!

>>881
おお!こんなオプションがあったんですか!って思って試してみたんですが、
上のスクショのLC-AAC-Sample.aac、HE-AAC-Sample.aacで試すと、どちらもAACと表示され、
このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。

INFO=$(mediainfo "$FILE" | sedほげほげ"
case "$INFO" in
"AAC LC" )
ほげほげ1

"AAC LC SBR")
ほげほげ2

*)
ほげほげ3

って感じで次の処理に進むんですが、
>>879、880、888だとほげほげ1か2に進めて、>>883だとほげほげ3になってしまいました。
0898デフォルトの名無しさん垢版2018/09/15(土) 21:43:49.56ID:pm09nqHo
>>896
> このファイルはLC-AACかHE-AACなのか判別して次の処理に進む事が出来なかったので、このオプションではダメでした。

ちゃんと調べた? %Format%以外で出るのあるんじゃないの?
0899デフォルトの名無しさん垢版2018/09/15(土) 21:59:26.07ID:imSsWev+
>>898
Audio;%Format/Info%
だと上のスクショの
Advanced Audio Codec Low Complexityなになに
が取り出せるようでした。
これだとLC AACならAdvanced Audio Codec Low Complexity
HE-AACならAdvanced Audio Codec Low Complexity with Spectral Band Replication
が取り出せるので判別出来そうです。
0900デフォルトの名無しさん垢版2018/09/15(土) 22:08:36.45ID:8KftQgLD
>>896
>>883のコマンドラインを提案した者だが
mediainfo "$FILE" | sed -n -e '/^Audio/,$p' | grep '^Format' | cut -f '2-' -d ':' -s | sed -e 's/^[[:blank:]]//1'
↑これでいけるかな。
ただ長いので他の人のを使ったほうがいいかも
0901デフォルトの名無しさん垢版2018/09/15(土) 22:18:17.17ID:8KftQgLD
>>899
ところで
http://www.mpeg-audio.org/members/files/DASH_Files/Audio_Only_Stereo_Dash.zip
↑こっからDLできるサンプルファイルで試したところ

AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4

HE-AAC/Technology-en-69s-2-heaac-64000bps_seg.mp4

mediainfoの出力結果で
Audio;FormatではどちらもAAC表示で区別できず
Audio;Format profileでやっと区別できるんだけど,俺の勘違いかな。
0902デフォルトの名無しさん垢版2018/09/15(土) 22:25:58.84ID:8KftQgLD
何度も投稿してすまん。
これでいいんじゃないかな。
確かめた環境はMediaInfo 0.7.91 on Debian 9.5。
case "$(mediainfo --Inform='Audio;%Format_Profile%' "$FILE")" in
HE*) echo 'HE';;
LC*) echo 'LC';;
esac
0903デフォルトの名無しさん垢版2018/09/15(土) 22:45:32.78ID:pm09nqHo
>>896のコード見て思うのは

Unix哲学(を完全に受け入れたわけじゃないが)
9. 全てのプログラムはフィルタとして振る舞うようにせよ。

すべてのプログラムはフィルタとして振る舞うようにしたとして
そのプログラムを使う側もフィルタとして利用するようにすべきだと思うわけよ

つまりね、こういうふうに書くべきじゃないのか?ってこと

mediainfo --Inform='Audio;%Format_Profile%\n' "$FILE" | while IFS= read -r line; do
 case $line in
  HE*) echo 'HE';;
  LC*) echo 'LC';;
 esac
done

本当は$FILEの所も"$@"にして複数ファイル対応できるようにしたい。
だけどメディアファイルっていうのはオーディオを複数入れることができるはずだから、
この場合どうなるのか?という疑問がある。その場合はうまくいかないかもしれない。
まあ適切なサンプルファイルを思いつかんし面倒だから試しては見てないが
0904デフォルトの名無しさん垢版2018/09/15(土) 23:39:36.74ID:imSsWev+
みなさんどうもありがとうございます
>>896の時点のコードは以下です
https://pastebin.com/qdNT6iBm
拡張子がaacのファイルがあるディレクトリでこのスクリプトを動かしたらaacファイル全て(ひとつづつ)処理させてます。

>>900-903
明日確認してみます

$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1

以前のバージョンではFormat profile欄があったのでそこで判別してたんですが、いつのまにか(昨日気がつきました)最近のバージョンではFormat profile欄がなくなっているんです。>>878のスクショです
0905デフォルトの名無しさん垢版2018/09/15(土) 23:59:46.80ID:8KftQgLD
>>904
なるほどね。Debainのaptで入れたやつは古いのか。

$ mediainfo --version
MediaInfo Command line,
MediaInfoLib - v18.08.1
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/HE-AAC/Technology-en-69s-2-heaac-32000bps_seg.mp4
LC SBR
$ mediainfo --Output='Audio;%Format_AdditionalFeatures%' ./Audio_Only_Stereo_Dash/AAC-LC/Technology-en-69s-2-lc-64000bps_seg.mp4
LC
これは結構見分けやすいんじゃないか?
0906デフォルトの名無しさん垢版2018/09/16(日) 00:12:32.41ID:ynEgKPZ+
>>904
ちょっと訊きたいんだけど,MPEG4のLCとHEの違いってSBRが適用されてるかいなかの差?
もしそうならまさにそのオプションがあって
mediainfo --Output='Audio;%Format_Settings_SBR%'
↑これは,SBRが含まれていれば“Yes (Explicit)”,含まれていなけば空文字を返す。
0907デフォルトの名無しさん垢版2018/09/16(日) 00:17:30.07ID:6L484PJq
>>904
> >>896の時点のコードは以下です
> https://pastebin.com/qdNT6iBm

つまらん。特に指摘する点はない。
細かい趣味程度のことぐらいだな。

ファイルは引数で渡したほうがいいんじゃね?とか
俺ならset -eu -o pipefailをつけるとか
(一行で書く場合を除いて)コマンドの後ろの ;; は嫌いだとか
0910デフォルトの名無しさん垢版2018/09/16(日) 13:43:22.79ID:dTju3huw
ネタフリ、これ前に紹介したことあったっけ?

modernish: a shell moderniser library
https://github.com/modernish/modernishhttps://github.com/modernish/modernish#modernish-a-shell-moderniser-library

良さそうなことを書いてあるが、大きすぎて、それでいて何ができるのかよくわからない
ようするに誰か日本語で簡潔に解説してくれとw
0911デフォルトの名無しさん垢版2018/09/16(日) 21:03:29.36ID:ynEgKPZ+
変な人が二人いるせいで質問者が帰っちゃったじゃん。せっかく良い案を思いついたのに。
0914デフォルトの名無しさん垢版2018/09/17(月) 09:30:58.79ID:yJ/mJYoq
二人いるんじゃなくて、同一人物なんじゃ?
例の人、プロバイダー2つ契約してて自演に使ってるんだし。
0915デフォルトの名無しさん垢版2018/09/19(水) 03:32:21.41ID:6Ke1Nn09
引用符を除去するいい方法ってないかな。
個人的には変数の仕様("abc"はabcとみなされる)とかを利用してエレガントに解決できるんじゃないかと思ってるんだけど うまくいかん。
いまのところsed -e 's/"\([^"]+\)"/\1'で問題はないけれど「\"」の形のエスケープに対応したりするのが面倒になってくるんだよね この形だと。
0916デフォルトの名無しさん垢版2018/09/19(水) 04:43:37.82ID:ScWhkKn/
a='"aa\"a"'
eval echo "$a" とか eval "b=$a"
じゃだめ?


おまけ、最近のbashには以下のような変数展開が
増えているけど今回は関係なさそう
${parameter@A}
${parameter@E}
${parameter@P}
${parameter@Q}
0917デフォルトの名無しさん垢版2018/09/19(水) 07:25:21.58ID:6Ke1Nn09
>>916
なるほどevalは思いつかんかったわ。
ただそれだと "aa\""→aa" になってしまうんだが これは正常な動作なんだろうか。
0918デフォルトの名無しさん垢版2018/09/19(水) 07:59:33.05ID:ScWhkKn/
>>917
さあね。「引用符を除去するいい方法」の正確な意味がよくわからないので
もしかして単に前後の引用符を除去するだけだった?
ならこれだけで行けるけど

a='"aa\"a"'
a=${a#\"}
a=${a%\"}

エレガントに解決っていうから、なんかもっと複雑な話かと思った
0919デフォルトの名無しさん垢版2018/09/19(水) 08:36:50.27ID:6Ke1Nn09
>>918
いや 別に文句を言ったつもりはない
先に挙げてもらった方法で解決してるし あれはすごくエレガントだと思う。


エレガントっていうのは数学畑の言葉のつもりで使った。
つまりまわりくどいやりかたではなく本質をつらぬいた方法。
今回は,
「シェルに対してトークンの区切りを示すための引用符をシェルに読み込ませることによって除去する」
という非常に直感的で素晴しい方法を学べた。
俺のやりかたはわざわざsedを使ってる点で,シェルが解釈するという本質から外れてしまっている。
0920デフォルトの名無しさん垢版2018/09/19(水) 08:38:35.76ID:6Ke1Nn09
ちなみにやりたかったことは単純に
VAR="value with space"
↑こういうことが書かれたファイルから
value with space
という語句を取り出すというもの。

$ cat /etc/os-release | grep '^PRETTY_NAME' | cut -f 2 -d '=' | eval echo "$(cat)"
↑こういう感じ。
0922デフォルトの名無しさん垢版2018/09/19(水) 09:41:44.85ID:ScWhkKn/
>>919
単に文字列の途中にどういう意味かわからなかっただけだよ。
>「\"」の形のエスケープに対応したりするのが面倒
とか書いてあったから、何がしたいんだろうと

前後の""を取るだけなら>>918のやり方が最短で最速

>>920
> VAR="value with space"
> ↑こういうことが書かれたファイルから
> value with space
> という語句を取り出すというもの。

それだとまた話が変わってくるな
(. /etc/os-release; echo $PRETTY_NAME)

()でくくってるのは、単に変数のスコープをサブシェルに閉じ込めてるだけ
カレントシェルにばらまいていいなら()はいらない

シェル互換の文法としてみなせるファイルならこれでいけるよ
コードが入っていたら実行されるから、安全なファイルと断定できるものにしか使えないけど
0923デフォルトの名無しさん垢版2018/09/19(水) 22:30:20.23ID:/Yn8C735
"a" → a

こういう変換は、CSV でも苦労してる。
" が偶数個なら良いけど、奇数個なら形式エラーにするとか

CSV は、様々なバグが考えられるから、TSV が良い

"a""b" → a""b

ただし、" " 内で、" を使う場合、"" と連続させる。
この場合も、奇数個なら形式エラーにするとか、ややこしい
0924デフォルトの名無しさん垢版2018/09/19(水) 22:42:07.01ID:ScWhkKn/
>>923
別々の言語で3回ぐらいCSVのパーサーを書いたことありますよ
ダブルクォートがない場合、あって改行が入ってる場合など
Excelの仕様に完全対応したCSVライブラリがその言語になかったので

Perlの変態正規表現レベルにまでなれば可能かもしれないですが、
そういうネスト構造のあるものは単純な正規表現では解決不可能な問題です。
0925デフォルトの名無しさん垢版2018/09/19(水) 22:46:07.55ID:xLP4ypV2
タブ区切りでも
当然ダブルクォートがいる

頭悪いこといってるわ。。。
0926デフォルトの名無しさん垢版2018/09/20(木) 09:41:46.66ID:cMPVhU9i
ダブルクォートを特別扱いするかどうは仕様によるのでは?
0928デフォルトの名無しさん垢版2018/09/20(木) 12:24:25.01ID:rEtRtbV+
>>927
それって区切り文字がタブの場合も書かれてるの?
0930デフォルトの名無しさん垢版2018/09/20(木) 20:07:29.45ID:v1EqyHAs
まあいくらRFCで規定してもディファクトスタンダードのExcel読めるフォーマットでないと意味ないしな w
0931デフォルトの名無しさん垢版2018/09/20(木) 20:41:14.92ID:jnBpqPJK
>>930
RFC4180とExcelのCSVはほとんど同じ

違いはデータの中に改行が含まれてる場合
Excelデータの中の改行はLF。(一行の最後はCRLF)
RFC4180はデータの中の改行はCRLF(一行の最後は同じくCRLF)

これだけしか違いはないよ
0932デフォルトの名無しさん垢版2018/09/20(木) 20:45:03.75ID:jnBpqPJK
CSVもTSVデータとしてキーボードから入力可能な文字を
区切り記号としているわけで、なんで
RS (0x1e Record Separator) とか
US (0x1f Unit Separator) とかいう
便利な文字を使わなかったのか?って思うな
0933デフォルトの名無しさん垢版2018/09/20(木) 21:32:37.16ID:zLqp8E23
頭悪いこといってるわ
そんなコードなキーボードからどうやって入力すんの

viならできるが
こんなアホが、vi使えるとは考えらればいしな
0934デフォルトの名無しさん垢版2018/09/20(木) 21:37:28.28ID:IHzBiPD0
いつまでトリップはずしてんねんお前
0937デフォルトの名無しさん垢版2018/09/20(木) 21:39:06.57ID:Rg0LfXUv
ほとんど病気
0938デフォルトの名無しさん垢版2018/09/20(木) 21:42:44.26ID:zLqp8E23
カンマのキーとタブのキーと改行のキーは
どのキーボードについてる

低学歴知恵遅れにはコレが分からない
0941デフォルトの名無しさん垢版2018/09/20(木) 21:53:59.48ID:jnBpqPJK
つーかCSVファイルをテキストエディタなんかで閲覧、編集する人なんていないでしょう?
可能か不可能かで言えば、可能だけどバイナリエディタでテキスト編集するような感じで
効率が悪いから、みんなエクセルつかってCSVファイルの読み書きするんだけど
0942デフォルトの名無しさん垢版2018/09/20(木) 22:13:21.07ID:8Bepevhe
国によっては、カンマとピリオドの意味が逆転してるのあるけど
そんな国でも割り切って、セパレータはカンマにしてるんだろか

小数点がカンマ、どーしてそうなったか興味あるが
0943デフォルトの名無しさん垢版2018/09/20(木) 22:16:57.13ID:zLqp8E23
引用符でくくられてたらどんな記号でも問題起きないからな
textを普通のエディタで開いてなんのコードが混入してるか分からないほうが
普通の感覚でイヤだから

低学歴知恵遅れなら細かいことは気にしないかもしれない
0945デフォルトの名無しさん垢版2018/09/20(木) 22:24:15.47ID:zLqp8E23
たとえばhttpもsmtpもコンテンツ以外は
crlfを除いて普通にぜんぶ0x20以上0x7e以下のテキストでやりとりしてるからな
低学歴知恵遅れなら、自分はそんなの意識しないUA使ってるからなんでもいいというワケ
0946デフォルトの名無しさん垢版2018/09/20(木) 22:28:11.99ID:zLqp8E23
低学歴知恵遅れは
まずcsvがデータ交換用のフォーマットであることが分かってない
0948デフォルトの名無しさん垢版2018/09/20(木) 22:39:27.57ID:zLqp8E23
デファクトスタンダードのエクセルで
タブ区切りで保存すると
ふつうにこうやって保存されるからな

aho<HT>"boo""foo"<HT>baka
aho<HT>"boo""foo"<HT>baka
0950デフォルトの名無しさん垢版2018/09/21(金) 00:46:25.95ID:m8DL5ZJ4
>>931
TSV にして、データ中に、タブ・改行を使わないのが良さそう

>Excelデータの中の改行はLF。(一行の最後はCRLF)
Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ
0951デフォルトの名無しさん垢版2018/09/21(金) 01:24:23.69ID:i9i22CNp
Excelで直接開くと勝手にフォーマット変換されるのが気に入らないからテキストエディタで開いてからExcelにコピーとかやってるわ
0953デフォルトの名無しさん垢版2018/09/21(金) 02:43:36.28ID:v8LFlyn0
>>950
> Linux・Windows 間で、テキスト転送しても、改行コードが変わるから、ヤバイ
バイナリ扱いすればいいだけ
0954デフォルトの名無しさん垢版2018/09/21(金) 04:04:34.44ID:m7KC0L1Z
>>951
拡張子を txt にしてから開いてウィザード動かすか、または 0 で始まる数字だけの文字列は ="0123" のようにして最初から作っておくとうまく行く。
0955デフォルトの名無しさん垢版2018/09/21(金) 04:48:00.63ID:dtC8HZuo
ちょっと荒れたのであまり話題にはしたくないものの
Unicodeの区切り文字を使うのはいい手段だと思う。
ただし思い切り独自規格なので既存の製品には対応できないけどね。もちろん
0958デフォルトの名無しさん垢版2018/09/21(金) 06:06:23.57ID:v8LFlyn0
一般人はCSVファイルをExcelで編集する
となると別にテキスト形式ベースじゃなくても良いわけだ
だとすると誰がCSVファイルを望んでいるのだろうか?
おそらくプログラマなんだろうね。

考えてみればテーブル型データに限っていれば
CSVはJSONよりも効率よくデータを記述できる
JSONだったらこんな感じだしね

[
{"field1": 1, "field2": 2, "field3": 3},
{"field1": 1, "field2": 2, "field3": 3},
]

これがCSVだとここまでコンパクトに纏められる

field1,field2,field3
1,2,3
1,2,3

一般人のことを考えないくていいという前提のものと、もっと良い形式が考えてみよう
それもシェルスクリプトで扱うのが容易な形式

一行ずつ読み取るのだから、一データの終わりはLFであるべきだろう
そしてデータの中には改行は含まず、カンマや制御コードはprintfコマンドで
簡単に解釈ができるよう8進数にエスケープを行う。どうかね?
エスケープの処理を除けば既存のツールでも扱えるだろう

ただ問題があるとすれば、printfで変数に代入する時forkを行う必要があるということだな
これだと時間がかかってしまう。かといって1文字ずつパースするのも時間がかかる

一行ずつ処理するのが可能で、1カラムずつ処理するのも可能で処理に時間がかからない方法はないだろうか
0959950垢版2018/09/21(金) 07:09:48.97ID:m8DL5ZJ4
>>931
>Excelデータの中の改行はLF。(一行の最後はCRLF)

もし、このCSV を、Linux で扱う場合には、やばくない?
行区切りをCRLF に設定すれば、データ中に、LF があっても問題ないのかな?
0960デフォルトの名無しさん垢版2018/09/21(金) 08:12:42.97ID:LR4lwFnG
>>959
別にLinuxでも行区切りがCRLFで行内の改行がLFのアプリは作れるでしょ
標準のアプリと動作が違うけどそういう特殊フォーマットだと思えばいいだけ
0961デフォルトの名無しさん垢版2018/09/21(金) 09:34:09.19ID:7bTZc31z
>>958
fork?どういう処理を想定してるのか?
0963デフォルトの名無しさん垢版2018/09/21(金) 09:56:30.62ID:7bTZc31z
【審議中】
    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'
0966デフォルトの名無しさん垢版2018/09/21(金) 12:41:08.14ID:FeY49FdE
構内放送「直ちに中庭に集合してください」
従業員 (また誰かforkコマンド実行したな…)
0967デフォルトの名無しさん垢版2018/09/21(金) 12:48:09.10ID:v8LFlyn0
>>960
> 別にLinuxでも行区切りがCRLFで行内の改行がLFのアプリは作れるでしょ

よく考えたら、シェルスクリプトでもそれなりに使いやすいかもしれない。
readで1行(LFがくるまで)読んで、読み込んだ最後がCRだったら行区切りあつかい
そうでなければ同一行としてあつかえば良いわけだし
0968デフォルトの名無しさん垢版2018/09/21(金) 12:50:18.79ID:isbUNhMl
8進数エスケープってbashの機能で文字に直せなかったっけ?
0970デフォルトの名無しさん垢版2018/09/21(金) 12:56:03.96ID:dtC8HZuo
たとえばエスケープをするのは
US,RS,エスケープ文字自体
↑これでどうだろうか各種エスケープは
\#,\%,\\
これ。

ちなみにあたり前だが 端末の画面に「分かりやすく」表示するときは
\#→水平タブ,\%→改行(LF)
に置換するのがいいだろう。
0974デフォルトの名無しさん垢版2018/09/21(金) 20:25:16.42ID:FeY49FdE
思いつきだけど、エスケープ文字自体を表すときは別の文字をエスケープして表現するほうが何かと都合がよくないか?
0976デフォルトの名無しさん垢版2018/09/21(金) 23:27:59.03ID:/eJt2TVD
例えば\rsを検索したいときに、\が\\でなければ\rsを検索するだけでよいけど、\が\\のときは見つけたあとに\の数をたどってそれが本当に\rsなのか調べないといけない、とか、
とある場所までシークしたときに、その場所の文字が何なのか、\を繰り返し数えないといけない、とか、
\?はすぐエラーとわかるとか。
0977デフォルトの名無しさん垢版2018/09/22(土) 00:50:25.74ID:9bcvhAfJ
>>974
その別のエスケープ文字をエスケープするには
どうすればいいの?
0978デフォルトの名無しさん垢版2018/09/22(土) 01:10:24.01ID:Whfp6XnZ
>>977
エスケープ文字はあくまで\だけ。
例えば%を使うとして、
rsを表すなら\rs、
usを表すなら\us、
\を表すなら\%、
%を表すなら%、
と記す。とかね
0979デフォルトの名無しさん垢版2018/09/22(土) 03:37:20.07ID:LHC7cNdc
>>978
よくわからん。そのルールだと

\rsを表すときは、\%rs
\usを表す時は、\%us
\%を表す時は、\%%
%を表す時は、%
ってことか?

%を検索した時、それが本当の%であるかは
一文字前が\であるかどうかを調べないといけなくて、
\rsを検索したい時は、\%rsで検索しないといけないってことか?
0980デフォルトの名無しさん垢版2018/09/22(土) 04:10:01.34ID:wyOkhzEz
>>979
あってるよ。

\が\\の場合は、
\を検索するときは\\を見つけるだけじゃ不十分だけど、
\が\%の場合は、
%を検索するときは一文字前が\でない%を見つけるだけで十分だし、
\を検索するときも\%を見つけるだけで十分なんだ。

同様に、
\が\\の場合は、
\rsを検索するときは\\rsを見つけるだけじゃ不十分だけど、
\が\%の場合は、
\rsを検索するときは\%rsを見つけるだけで十分になる。
0981デフォルトの名無しさん垢版2018/09/22(土) 06:13:58.91ID:dKJ+Zat7
どうせRS,USとかの非文字を使うんなら
エスケープ文字もESCでいいんじゃないだろうか。
0982デフォルトの名無しさん垢版2018/09/22(土) 06:46:52.90ID:LHC7cNdc
bashでさ、typesetで関数の中身を出力できるじゃん?
それをevalで評価したら同じ関数が出来上がるじゃん?
これってどれくらい信用できるんだろう?

作成した関数のコードそのままの形で出力されるなら
evalで評価して同じものができるだろうけど、
ぱっとみtypesetで出力するされたものをみると、
改行の位置とか変わって整形された状態になって
関数にはfunctionが頭に追加されてる。

元のコードをどれくらい書き換えるんだろうか?
これ以外になにか変わる事知ってたりする人いない?
0985デフォルトの名無しさん垢版2018/09/22(土) 12:03:50.02ID:rfhCLeCr
今まで人気ないスレだったから全く不要だったわけだが、今後は次スレ立てる安価指定しといたほうがいいか
次回の勢い次第でテンプレ編集で
0993デフォルトの名無しさん垢版2018/09/22(土) 21:27:56.90ID:PGp2AKzL
荒らすなよハゲ
0995デフォルトの名無しさん垢版2018/09/22(土) 21:28:36.50ID:PGp2AKzL
ID:SEEeyc/q ← アラシ
0997デフォルトの名無しさん垢版2018/09/22(土) 21:30:18.74ID:SEEeyc/q
このスレも埋まらんうちにすでにCSV荒らしと半角荒らしが次スレ移動してるからな
前スレ使え言っても子供が言うこと聞くわけないから自分でやることにしただけよ
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 60日 10時間 31分 16秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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