18/07/24 11:01:46.51 r0TJj2hB.net
お約束
・特記なき場合、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: URLリンク(www.speech-lab.org))
・POSIXに準拠しましょう
有用なリンクはURLリンク(en.wikipedia.org)にまとめられています。
最新の仕様はこちらへ: URLリンク(pubs.opengroup.org)
(左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHei
3:rloom 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オプションでそれらしい単語による簡単な検索もできます。 ・ワイルドカードは正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな
4:デフォルトの名無しさん
18/07/24 11:02:04.48 r0TJj2hB.net
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
5:デフォルトの名無しさん
18/07/24 11:05:09.89 r0TJj2hB.net
補足(今スレ限り)
いままではUNIX板でスレ立てをしていましたが、IDやワッチョイが無いことを理由とした自演・荒しが目立ってきておりスレがまともに機能しなくなりかけているので、今回よりプログラム板に移動することになりました。
6:デフォルトの名無しさん
18/07/24 14:22:58.96 r0TJj2hB.net
とりあえず保守っぽい書き込み
7:デフォルトの名無しさん
18/07/24 15:29:38.59 4yafhCFC.net
おつ
8:デフォルトの名無しさん
18/07/24 15:31:12.93 ux1Ayazo.net
り返せ
9:デフォルトの名無しさん
18/07/24 16:40:14.98 PsBikv9p.net
ません
10:デフォルトの名無しさん
18/07/24 16:45:11.85 dOWUO1eS.net
m9
11:デフォルトの名無しさん
18/07/24 20:36:43.40 0V9luMBh.net
>>1
スレ立て乙!111
12:デフォルトの名無しさん
18/07/24 21:04:07.46 ux1Ayazo.net
112
13:デフォルトの名無しさん
18/07/24 22:37:58.80 ukUjoRN2.net
>1 乙
支援
14:デフォルトの名無しさん
18/07/25 01:58:18.49 41CwtA3+.net
乙なんよ
15:デフォルトの名無しさん
18/07/25 02:54:55.73 7zvfAEGp.net
テンプレの↓
> 自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
ちょっと痛いかな
16:デフォルトの名無しさん
18/07/25 03:03:02.74 JJXqrWB8.net
bashのあれやこれは、shでどうかけばいいかってのがあるといいな
特に配列。配列は引数として処理するんだよっていうのが体系的にまとまるといいな
17:デフォルトの名無しさん
18/07/25 08:44:11.14 go981At1.net
本来の引数配列以外で配列が必要になったら、基本的にはawkその他の言語使うなあ。
まあ自分用だと気の迷いで引数配列転用したり、evalで頑張ったりすることもあるけど、
仕事で他の人に引き継ぐこと考えると保守性で問題になるので
仕事ではやらないようにしてる。
18:デフォルトの名無しさん
18/07/25 15:17:48.54 JJXqrWB8.net
>>16
配列が必要になるっていうのは、シェルスクリプトの
プログラミングの仕方が間違えてるってことだよ
例えて言うならば、関数型言語をオブジェクト指向言語的に
使って、オブジェクト使いたい。インスタンス作りたい
メソッド作りたい、継承、カプセル化欲しい!って言うようなもん
シェルスクリプトは引数または標準入力で渡されたものを
順次処理していくという書き方をするもんなんだろう。
一時的に変数にためておくなんてことはしないので
配列は使わないですむ
19:デフォルトの名無しさん
18/07/25 15:24:58.23 eezz2RvW.net
evalだけは怖いから使わない
それでしか解決できない問題をまだ扱った事がないからだが
20:デフォルトの名無しさん
18/07/25 15:32:42.01 JJXqrWB8.net
evalは信頼できない文字をevalするのが問題なのであって
コードの中で作り出した文字をevalするなら問題もないんだよ
信頼できない文字であっても、使える文字種を限定すればいいし
21:16
18/07/25 17:16:52.45 BMgdIVPp.net
>>17
だいたい同感。
配列や連想配列がぴったりした応用もあるんだけど、
シェルで書くようなプログラムじゃないね。
22:デフォルトの名無しさん
18/07/25 17:47:06.73 7zvfAEGp.net
あるリモートファイルの最新のバージョンをダウンロードする方法ってありますか。
具体的にはURLリンク(ftp.jaist.ac.jp)←ここの最新バージョンのディレクトリを知りたいです。
23:デフォルトの名無しさん
18/07/25 17:59:04.34 DddK84yb.net
ある
24:デフォルトの名無しさん
18/07/25 21:12:21.99 l3Vcc9bz.net
>>17
バッチファイル程度のシェルスクリプトしか
知らないからそう思うんでしょ
知れば奥が深いよ
配列も結構多くのシェルがサポートしてる(例えばcsh)
25:デフォルトの名無しさん
18/07/25 21:32:58.42 tKZkTFhc.net
極端な例を挙げるなら、行列演算をシェルスクリプトで書く馬鹿はいないみたいな話よ。
配列に限った話ではなく、ほとんど全ての高級言語にあるのにシェルにはない言語機能がいろいろある。
例えば構造体に類する機能とか、参照とか。
言語には向き不向きがあって、シェルでは向いてない用途に無理矢理使うのは井の中の蛙。
26:デフォルトの名無しさん
18/07/25 22:46:32.67 c/fHfsdl.net
>>21
wget -qO - 'URLリンク(ftp.jaist.ac.jp)' | grep -m1 -Po '\[DIR\].+?href="\K[0-9.]+'
27:21
18/07/26 05:58:11.67 BvZq73xc.net
>>25
ありがとうございます。
上手くいきました。
28:デフォルトの名無しさん
18/07/27 11:44:05.25 +pgu0NCD.net
この本って信用していいの?
URLリンク(image.yodobashi.com)
29:デフォルトの名無しさん
18/07/27 15:01:43.20 GvW3yrkV.net
できるだけ可搬なUNIX時間<->ISO 8601形式時間の変換器ってどんなのがありますかね
PerlやRubyでいけるのは知っていますが,もうちょっとPOSIXに従ってるやり方が知りたいです
30:デフォルトの名無しさん
18/07/27 15:34:58.00 2MP7doyF.net
>>28
GNU date 限定の技だと思うのであまり嬉しくないかもしれないけど、以下のコマンドでいけるそうだ。
date --date "@1501201492" +"%Y%m%dT%H%M%SZ"
ちなみに出典は以下の記事です。
dateコマンドを使ってUnixTimeをISO8601形式へ変換する - Qiita
URLリンク(qiita.com)
31:デフォルトの名無しさん
18/07/27 15:42:57.75 2MP7doyF.net
>>28
小出しでスマン。こういうオプションもあるみたいなんだけど、man に記載されてないね……
$ date --date "@1501201492" --iso-8601=seconds
2017-07-28T09:24:52+0900
32:デフォルトの名無しさん
18/07/27 16:35:57.77 GvW3yrkV.net
>>29
ありがとうございます。
そうっすね……。dateコマンドでできるのは知っていますが,
これ,ものっすごく可搬性悪いんですよ。下手するとPerlでやったほうがマシなくらい。
なぜかというと,各種OSによってdateコマンドのUNIX時間<->ISO 8601形式時間変換のオプションが違うんです。
*BSDはdate -jだしGNU/Linuxでは書いてもらったdate --dateとかdate -dとか。
ある種のOSではdate -rもあるっぽいです……。
33:デフォルトの名無しさん
18/07/27 20:53:36.25 5PTGcdNX.net
>>31
BSD一般は date -r 数字 では?
最近の NetBSD だと date -d @数字 とも書けるから GNU と共通にできる。
34:デフォルトの名無しさん
18/07/31 09:25:51.28 nOeIYYJj.net
>>28
アルゴリズムとしては
秒数→日時変換と日時の足し算だけなんだから
自力で作れない?
35:デフォルトの名無しさん
18/07/31 09:56:38.03 2+1mdxB2.net
自力で作るならコマンド見分けたほうが楽だなw
どちらも同じオプションだけど意味が違うものを使って見分ける
36:デフォルトの名無しさん
18/07/31 11:29:27.77 3VAn/oI8.net
>>31
自分で言ってる様に Perl で書いちゃえば良いような…
37:デフォルトの名無しさん
18/07/31 19:49:30.25 M5dn2TAr.net
自分で足し算すると、サマータイム・うるう秒は、大丈夫なのか?
38:デフォルトの名無しさん
18/07/31 20:11:42.59 qTamNnJo.net
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"
39:デフォルトの名無しさん
18/07/31 20:15:49.79 6LkeIiyI.net
何か間違ってるんだろ
40:デフォルトの名無しさん
18/07/31 20:18:57.37 qTamNnJo.net
どこを変更したら動くの?
41:デフォルトの名無しさん
18/07/31 21:14:19.18 1f/UcTRP.net
想定通りの動きをしてない行
42:デフォルトの名無しさん
18/07/31 21:14:23.24 MEUSBOQW.net
eval ${cmd}
43:デフォルトの名無しさん
18/07/31 21:16:43.59 MEUSBOQW.net
bb.sh で
echo "$*"
してみりゃ、理解できるだろう
44:デフォルトの名無しさん
18/07/31 21:24:56.48 qTamNnJo.net
>>41
サンクス!できたw
45:デフォルトの名無しさん
18/07/31 21:27:46.12 MZe54JNj.net
>>43
cmdに代入しなきゃダメなの?
46:デフォルトの名無しさん
18/07/31 22:50:34.87 nOeIYYJj.net
>>36
確かそういうのを考慮してないんじゃないの?
47:デフォルトの名無しさん
18/07/31 22:58:00.65 RprViRTw.net
>>45
うるう秒はUNIX Epochからの秒数には入ってないので無視して良い。
サマータイムやタイムゾーンの考慮は必要だしとても大変。
日本のタイムゾーン固定ならサマータイムも今のところ無視できるし簡単だけど、perlでも使ってライブラリに任せた方がいいと思う。
48:デフォルトの名無しさん
18/07/31 23:52:51.22 nOeIYYJj.net
どうでもいいが俺のID末尾がjってなんだこれ
49:デフォルトの名無しさん
18/08/01 08:18:10.49 4ZTIK2TR.net
>>47
この板のIDは8桁だから9桁目(いわゆる末尾)はないよ
50:デフォルトの名無しさん
18/08/01 11:52:30.09 cj6lI2dq.net
昨日発見した事なんだけど、シェルというよりは test コマンドの問題だけど、test -f で対象のファイルを指定しない時って0になるのな。
これはbash用に書かれたこんな記述の時の動作によって気づいた。
if [ ! -f $file ]; then
echo ファイルなし
exit 1
fi
これで file に何も代入されてないとか空文字列の時にファイルなしにならない。
なんだこの動作は?
testコマンドの仕様?たまたま俺の使ってたLinuxのtestコマンドのバグ?
まあbashなら[[ ]] 使っとけばエラーになるからそっち使っておけば良いんだけどね。
51:デフォルトの名無しさん
18/08/01 12:14:18.97 sWzzPqiz.net
testの仕様。
"" で囲まなかったのが悪い。
52:デフォルトの名無しさん
18/08/01 12:31:44.03 GtWBM62w.net
find [xxx] -type f | xargs grep [yyy]
をよく使うので
search xxx yyy みたいな alias にしたいんですけど
引数を途中に挟むのってどうすればいいんでしょうか
53:デフォルトの名無しさん
18/08/01 12:34:38.30 cj6lI2dq.net
>>50
そ、そうか。
しかしなんでまたそんな仕様になったんだ?
54:デフォルトの名無しさん
18/08/01 12:43:22.75 cj6lI2dq.net
>>51
bash の場合は function で定義するしかないようだよ。ググって探してみな。
55:デフォルトの名無しさん
18/08/01 14:48:58.76 GtWBM62w.net
>>53
functionでできました
ありがとうございました
56:デフォルトの名無しさん
18/08/01 14:58:33.41 RF/jFH0Y.net
>>52
ググって探してみなw
まあ、何らかの歴史的な背景だろうけど、明確に仕様に書いてあるのだから
57:デフォルトの名無しさん
18/08/01 15:09:30.95 Al4aQLEL.net
>>51は grep -r [yyy] [xxx] もしくは rgrep [yyy] [xxx] でいいんじゃねーの?
俺はagの方をよく使うが
58:デフォルトの名無しさん
18/08/01 15:16:54.25 Al4aQLEL.net
>>49
そもそも if [ ! -f $file ]; then だと $fileにスペース等が入っている時に
対応できないので "$file" と書くのは必須
更に言うなら set -u すればいい。$file が空のときはエラーになる
59:デフォルトの名無しさん
18/08/01 15:25:42.75 RF/jFH0Y.net
0 arguments:
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
って、だけなんだけどな。2 arguments から本格的に判定に入るってとこかな。演算子が有効なものなのかも含めて
60:デフォルトの名無しさん
18/08/01 15:35:17.39 RF/jFH0Y.net
ああ、1 argumentの場合は空文字列でないかどうかっていうテストになるのか。そう思えば不思議でも何でもないな。使わないけどw
歴史的にそんなのがあっても不思議ではないな、実際どうなのか知らんけど
61:デフォルトの名無しさん
18/08/01 23:58:14.58 GZaAdjmn.net
# 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
62:デフォルトの名無しさん
18/08/02 00:06:27.75 LJtboBWc.net
>>60
変数の値として ; が入ってても、文の区切り扱いにはならないので嘘くさい。
evalしてれば話は別だが。
63:60
18/08/02 00:07:43.15 yvP4ulwr.net
だから、ディレクトリパス・ユーザー名とか、
システムで使うものに、半角空白を入れたら、ダメ
シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
パスに半角空白を入れないようにって、
Mac ユーザーにも、よく言われる
Windows には、半角空白が入ったフォルダ名があるから、危険
64:60
18/08/02 00:12:09.87 yvP4ulwr.net
>60 は、
日経Linux で連載している、Piro の有名なマンガ、
「Linux シス管系女子3」に書いてある
このマンガを知らなかったら、もぐりw
65:デフォルトの名無しさん
18/08/02 00:35:21.87 4n+0BAwB.net
>>62
> Mac ユーザーにも、よく言われる
ほんとかよ。macOSの標準ディレクトリに普通にスペース入っているのあるけど
うそくさい、えせくさいw
66:デフォルトの名無しさん
18/08/02 00:47:05.64 aFy8Ou9l.net
実際に試してみればええんじゃないの
$ 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/
67:デフォルトの名無しさん
18/08/02 00:51:46.28 dc2nLErP.net
>>60
>一方、固定値は囲まない
囲まなくていいのは囲まないだな。当然囲む必要があるのなら囲む " でなく ' ででも
囲まないで ¥ 使う物好きもいるかもしれないが
変数でも囲まないのは同じように囲まなくてもっていうところが原点だろうが、世の中そんな条件付けが許されるほどそう甘くはないっていう
その下の rm はイミフだな。>>61のほぼ言う通り。もちょっと「なんか」あるんじゃないの
そんなマンガ知らなかったらモグリよばわりされるならモグリで十分すぎるw
68:60
18/08/02 01:12:36.09 yvP4ulwr.net
日経Linux は、Ruby の作者・Matz と、マンガの「シス管系女子」の連載が有名
「シス管系女子」も、もう3冊目。
たいてい本屋の目立つ所に置いてある
システム管理者の必須本
69:デフォルトの名無しさん
18/08/02 01:20:26.73 AdBDijUE.net
坂本文さんの 「たのしいUNIX」なら知ってる
70:デフォルトの名無しさん
18/08/02 01:47:58.08 dc2nLErP.net
>>67
それ以上システム管理者とやらを貶めるなよw
71:デフォルトの名無しさん
18/08/02 03:58:43.02 tOum0Ceh.net
>>60
> 変数中に空白があっても良いように、たいてい変数は" " で囲む。
> 一方、固定値は囲まない
固定値だから囲まないんじゃなくて、
固定値かつ、空白が含まれてないから囲ってないだけ
固定値でも、空白が含まれていれば囲む
72:デフォルトの名無しさん
18/08/02 04:04:23.88 tOum0Ceh.net
>>62
> Windows には、半角空白が入ったフォルダ名があるから、危険
危険なんじゃなくて、半角空白が入ったフォルダがあるから
きちんと対応せざるを得なくなってバグが減る
下手に半角空白がないシステムばかり使っていたら
半角空白に対応するのを忘れてしまう。そっちのほうが危険。
そんなことよりもshellcheckでチェックするほうが常識
これを知らないやつはモーグリ
73:デフォルトの名無しさん
18/08/02 04:16:33.42 tOum0Ceh.net
>>60
> こういうように、シェルスクリプトには様々な引掛けあるから、危険!
> Ruby などのプログラミング言語を勧める
Rubyは外部コマンドを呼び出すのがすごく面倒くさい言語だが
参考 URLリンク(qiita.com)
> _人人人人人人_
> > めんどい <
>  ̄Y^Y^Y^Y^Y ̄
``を使えば、最小2文字の追加で呼び出すことができる
(正確にはputsしないと標準出力は表示されないからスペース入れて7文字)
Rubyでも結局同じ問題が起きる
# ruby -e 'dir="a b"; `ls -al #{dir}`'
ls: cannot access 'a': No such file or directory
ls: cannot access 'b': No such file or directory
(全角なのは書き込みエラーが出たから。もう面倒だから一律変換する)
回避策はいちいち言わなくていい、そんなのあるの知ってる。
Rubyでも様々な引掛けがあるという話。
74:デフォルトの名無しさん
18/08/02 05:32:18.98 5bB71pa/.net
Ruby使うくらいならPython使うわ。
でもここはシェルスクリプトのスレなんですよ。
しかも「ダブルクォートで囲む」という至極単純な対策でバグを回避できるんだから
他の言語を使う必要もないな。
ところでファイル名にダブルクォートが入っている場合があるので
ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
75:デフォルトの名無しさん
18/08/02 06:11:19.56 tOum0Ceh.net
>>73
> ところでファイル名にダブルクォートが入っている場合があるので
なんのことでしょう?
ファイル名にダブルクォートが入っていても
なんの問題もないですよね?
[test.sh]
#!/bin/sh
n="a'\"b"
file "$n"
$ echo test > a\'\"b
$ ./test.sh
a'"b: ASCII text
76:デフォルトの名無しさん
18/08/02 11:35:22.97 N9CdGDK2.net
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
77:デフォルトの名無しさん
18/08/02 11:45:13.93 N9CdGDK2.net
ちょっと訂正します。
間違えたコードはi==0ではなく、条件式にi=0としていました。
だから毎回判定するごとにiに0が代入されてループに入れなかったんですが、
お聞きしたかったのは0が偽だからループに入れなかったのか?ということでした。
条件式に代入式を持ってくる時点で素人丸出しなんですが、どうかご容赦ください。
78:デフォルトの名無しさん
18/08/02 12:23:00.77 N9CdGDK2.net
URLリンク(mywiki.wooledge.org)
ここのサイトを見たらfor (( ; ; ))もArithemetic Expression(算術式)で、
However, when evaluating an arithmetic expression, C language rules (0 is false, anything else is true) apply.
と書いてありました。Cの原則が適用されるようですね。自己解決したっぽいです。
どうもお騒がせしました。
79:デフォルトの名無しさん
18/08/03 14:17:14.85 htH9kPBS.net
>>72
エディタに、TeraPad を使っているけど、半角・全角文字へ変換ってある
こりゃ便利
80:デフォルトの名無しさん
18/08/03 14:39:56.40 nG7YYTv9.net
そんなんsakuraだってあるぞ
81:デフォルトの名無しさん
18/08/03 14:58:08.23 htH9kPBS.net
>ファイル名に、ダブルクォートが入っている
ファイル名に、! が入っていたら、どうなる?
テレビ番組の録画で「何々!」「何々!!」みたいな番組名が、ファイル名になる場合
82:デフォルトの名無しさん
18/08/03 15:01:48.95 TC+4ZTQW.net
>>80
感嘆符が特殊文字になるのってインタラクティブなときだけじゃね?
83:デフォルトの名無しさん
18/08/03 17:12:49.75 5qGFGeHO.net
>>80
こういうのって何言いたいのかわからんな。「問題」でも出してるのか??
84:デフォルトの名無しさん
18/08/03 17:30:20.61 TDL18VXl.net
>>80
それこそ、自分で何とかしろって感じだな
85:デフォルトの名無しさん
18/08/03 18:47:15.20 TC+4ZTQW.net
いやだから,感嘆符が特殊文字になるのはインタラクティブなときのみじゃないの?
86:デフォルトの名無しさん
18/08/03 18:49:00.35 BX8VumvQ.net
bashあんまり使わんからなあ
87:デフォルトの名無しさん
18/08/03 20:02:10.32 X+nM2ZWl.net
! を特別扱いするシェルを使っているかどうかの問題ではないかな。
OSやファイルシステムが特別扱いしているってこともあり得なくもないが。
UNIX系OSだと / しか特別扱いしてないよね。
88:80
18/08/03 20:31:20.88 htH9kPBS.net
Linux 板で、テレビ番組名に、!!! みたいなものが入っていて、
それがファイル名になる場合に、バグるって言ってたから
! は、エスケープも出来ないとか
89:デフォルトの名無しさん
18/08/03 20:50:55.07 TDL18VXl.net
他の環境ではNGの可能性があるということを考えると
怪しい文字は極力ファイル名に使わないようにしてる。
ある意味思考停止だけどw
CD-R焼く時、使える文字がフォーマットによりまちまちで、
ものすごい複雑だったことを思い出したわ。
ロミオとジョリエットwとか、ロックリッジとかあったなぁ。
90:デフォルトの名無しさん
18/08/03 20:52:13.47 u/asMYJG.net
余計な手間を省くのは正攻法だしいんじゃね
91:デフォルトの名無しさん
18/08/03 21:25:09.26 5qGFGeHO.net
>>87
だから、なにを言っているのかわからんてww
92:デフォルトの名無しさん
18/08/03 21:36:10.72 8YejLfKY.net
>>80
ばーかばーかさんへ
file "$1" が文字が原因で失敗する事例なんてありません
エスケープが必要な場合など存在しません。
わかったら黙って帰れ
93:デフォルトの名無しさん
18/08/03 21:38:01.51 5qGFGeHO.net
>>86
特殊文字って場合によりでしかないよな。特殊文字だから必ずバグる(?)なんてないし
シェルというか引数として受けたコマンドがって感じかなあ。bash自体がスクリプト中の引数を含めたコマンド文字列に特殊文字があっても何もしない/しないようにできるし
ID:htH9kPBSが言っているのは、ID:TC+4ZTQW が言っているコマンドラインでのヒストリ(参照)処理に引っかかる場合で、シェル「スクリプト」の問題ではないだろう
94:デフォルトの名無しさん
18/08/03 22:13:10.45 5qGFGeHO.net
スクリプトとして關係ないが、超シンプルにしての
$ ls '!'
ls: !: No such file or directory
まあ、そうだな
$ ls !
ls: !: No such file or directory
ほう
$ ls "!"
-bash: !: event not found
なんでやねんっ!ってとこではあるな
コマンドラインでも ! を打たなきゃファイル名がんなの入っていてもだし、! を含めたファイル名なんぞを打たなきゃでも ' でくくればいいんじゃね
95:デフォルトの名無しさん
18/08/03 22:47:23.99 TC+4ZTQW.net
だからすごく単純な話で
$ cat ./hstex.sh
#! /usr/bin/env bash
case $- in
(*H*)
echo enabled
;;
(*)
echo disabled
;;
esac
$ ./hstex.sh
disabled
こういうことでしょ?
つまりシェルスクリプトになってるときbashはヒストリ展開を既定で行わないから
エスケープを考える必要はないの。
96:デフォルトの名無しさん
18/08/03 22:52:05.62 8YejLfKY.net
はぁ、シェル「スクリプト」かどうかの問題じゃないんだってば
>>93はevent not foundってでなかったんで
考えるのメンドーなんでぐぐって
URLリンク(qiita.com) のネタパクるけどさ
$ 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した時の挙動と一緒だろうが
プログラミングの基礎やで。ソースコードをパースするときの処理かどうかの違い
97:デフォルトの名無しさん
18/08/03 23:09:12.00 5qGFGeHO.net
>>95
なにを言っているのかわからんww なんか面倒なことになってるなww
「スクリプト」の問題じゃないよ、ソースコードをパースとかよくわからん例えに見えるけど、単に「コマンドライン」でのパース(?)の問題。それもヒストリ展開だけの。>>94でID:TC+4ZTQWが再び言及しているような
ああ、bashのバージョンで
$ ls "!"
-bash: !: event not found
にならんことあるな。新しいのは。
$ ls "!!"
でもいいよ。今度は
$ ls !!
の挙動が変わるけど。まあ '' でくくればいいだけ&単に「コマンドライン」での問題
98:デフォルトの名無しさん
18/08/03 23:09:28.23 TC+4ZTQW.net
えぇ……
もしかして俺が間違ってるのかと不安になるほど自信満々な書き方だなw
99:デフォルトの名無しさん
18/08/03 23:11:06.77 5qGFGeHO.net
>>96
>'' でくくればいいだけ
うっかり ' を二つ並べた。シングルクォーテーション
100:デフォルトの名無しさん
18/08/03 23:14:28.27 5qGFGeHO.net
>>97
まあ...気にすんな。「ナニ」か違う(?)と思ったのだろう。よくわからんけど
101:デフォルトの名無しさん
18/08/03 23:28:02.17 h174pTLw.net
若者はヒストリー置換を知らないんだなあと感じいる俺はオッサン。
ヒストリー置換は対話的な入力にしか影響しないから、
スクリプトにするときは気にしなくていいよ。
102:デフォルトの名無しさん
18/08/04 02:05:18.25 j+kw9Zam.net
>>97
そりゃ間違ってるでしょ。
シェルスクリプトになってるときは~とか言っちゃってる
インタラクティブシェル上でも変数を""で囲えば同じなのに
103:デフォルトの名無しさん
18/08/04 03:08:34.02 ddNokTrS.net
イミフ
104:デフォルトの名無しさん
18/08/04 03:15:50.13 ddNokTrS.net
初見イミフ、よく読んでもやっぱりイミフw
なんか問題点を勘違いしているでしょ
>>94のcaseからesacをコピペってみて実行してみ。たぶんそういう文脈での「シェルスクリプトになってるときは~」だと思うぞ=間違ってはないと思うぞ
何を問題にしてんの?「インタラクティブシェル上でも変数を""で囲えば同じなのに」って
105:デフォルトの名無しさん
18/08/04 03:24:02.15 XmDLxyoB.net
なんでこんなに丁寧に教えてやらんと理解できんのか
>>62の話だろ
> だから、ディレクトリパス・ユーザー名とか、
> システムで使うものに、半角空白を入れたら、ダメ
>
> シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
ヒストリー展開はスクリプトだと既定で無効だが、
それ以前にファイル名にスペース入ってたりするから、
変数はダブルクォートでくくるのは当たり前なんだよ。
106:> shellcheckすればデフォルトで指摘される項目 変数はダブルクォートでくくればいいって言ってんのに 今度は「ファイル名にダブルクォートが入っていたら?」 「ビックリマークが入っていたら?」とか言い出してんだろ そ・れ・も「変数をダブルクォートでくくればいい」で終わりつってんだろ ダブルクォートでくくればヒストリー展開が有効であっても ファイル名に!が含まれてようが関係ない
107:デフォルトの名無しさん
18/08/04 03:25:51.10 XmDLxyoB.net
>>103
話の流れをよめ。
変数に入っている文字に
空白やダブルクォートやビックリマークが
入っている場合の話だ
変数をダブルクォートで囲めば全部解決
エスケープなんぞいらん
108:デフォルトの名無しさん
18/08/04 03:26:21.86 ddNokTrS.net
違うよ。>>80の話だけだぞ?
109:デフォルトの名無しさん
18/08/04 03:28:41.06 ddNokTrS.net
! と " は別の問題
話の流れをよめ...ってw だめだこりゃ
110:デフォルトの名無しさん
18/08/04 03:57:51.51 ZE1/UEds.net
それは>>73からの続きだろ
> ところでファイル名にダブルクォートが入っている場合があるので
> ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
これも囲む必要はない
ファイル名を文字列で直接書くならそもそも\でエスケープすればいいだけ
だからこれは変数の話であることは明白
その話の続きで>>80の
> >ファイル名に、ダブルクォートが入っている
>
> ファイル名に、! が入っていたら、どうなる?
という流れだ
111:デフォルトの名無しさん
18/08/04 04:07:16.79 ddNokTrS.net
いや、だから、その話の流れはあるかもしれないが、途中からの話の流れは ! が特殊文字になるのはっていうだけの話だぞ?
その>>73は>>74で終わってるし、なんかまたわけからんのが出てきたが ! がっていうのはそういえばっていうだけの
なんかあなたが強調しているのはそんなのわかっている上でのだぞ?なんでそんなとこに拘っているの??
112:デフォルトの名無しさん
18/08/04 07:02:26.79 fp3S0oAr.net
ヒストリ置換知らないのはゆとり
113:デフォルトの名無しさん
18/08/04 08:42:45.49 Zm4mz9Pa.net
俺はゆとり世代より下だがずっと指摘してたぞ(>>81)
そういう決め付けやめろ
114:デフォルトの名無しさん
18/08/04 15:19:02.62 EGr8asH9.net
やはりIPも入れたほうがいいかね
115:デフォルトの名無しさん
18/08/04 15:19:27.32 EGr8asH9.net
IPじゃねーやワッチョイ
116:デフォルトの名無しさん
18/08/06 08:36:00.23 /d0+B2Ty.net
ファイルやディレクトリを引数に取り、その許可属性を返すコマンドってありますか。
少なくともPOSIX Utilityにはないと分かっています。
期待する動作はそのコマンドの名前をownとして
$ own /some/file
-rwxrwxr-x
というような具合です。
117:デフォルトの名無しさん
18/08/06 09:07:09.56 BzDkzOUM.net
lsすりゃ済むのにunix的なセンスでそんなコマンドは作らないよ
118:デフォルトの名無しさん
18/08/06 09:23:02.61 Q3wSzLhg.net
ls
それで満足できないなら作れ、さすがにそれくらいできるだろ
119:デフォルトの名無しさん
18/08/06 09:25:30.08 RuHjlTsU.net
>>114
stat -c '%A' /some/file
120:デフォルトの名無しさん
18/08/06 09:26:53.13 4JbBAPy3.net
>>114
lsまたは stat の出力の一部を自分で切り出せば良いのでは?
なんだったらそれだけをするシェルスクリプトまたはシェル関数作れば良い。
121:デフォルトの名無しさん
18/08/06 09:29:30.92 4JbBAPy3.net
うはっw NGワードで引っ掛かってあれこれ変えてる内に回答が二つ書かれてたw
122:デフォルトの名無しさん
18/08/06 09:43:00.91 9v8Yooys.net
>>117でわかるのに、unix的なセンスとか、ワロえる。
センスないのはむしろ。ぷぷぷw
123:デフォルトの名無しさん
18/08/06 10:15:49.41 BzDkzOUM.net
なんか嘲笑してるつもり?
124:デフォルトの名無しさん
18/08/06 11:45:03.11 jTWGCXc0.net
>>115,116,118
わたしも最初はlsの結果をcutするシェルスクにしようと考えたけど
>>117
GNUならそれで、BSDのstatなら stat -f "%Sp" /some/file な感じか
POSIXの縛りならlsとcutかもしれんけど
125:デフォルトの名無しさん
18/08/06 15:01:42.52 /d0+B2Ty.net
stat -c '%A'
↑すばらしいです。ありがとうございました。
126:デフォルトの名無しさん
18/08/06 20:56:55.63 Z/jXU7Rj.net
>>960>>970>>980
次スレ立てるならワッチョイで頼む
127:デフォルトの名無しさん
18/08/10 03:53:11.11 5eVCbRBd.net
OpenWrtでこんなの見つけた。何処がオリジナルだろう?
物自体はバイナリだけどシェルスクリプトと親和性が高い(?)
JSONのパースと生成の方法のアイデアとして
URLリンク(wiki.openwrt.org)
128:s/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;
129:デフォルトの名無しさん
18/08/10 08:46:11.76 bLDrGgRY.net
>>125
jq(1)が定番では?
130:デフォルトの名無しさん
18/08/10 11:19:27.53 zsXdw2zN.net
>>126
あ、はい。ググればわかる。
なんか変な人がjqはクソだって言ってる
で頑張ってオレオレで変なの実装してるが、
すでにあるよって話
131:デフォルトの名無しさん
18/08/10 11:44:23.91 r84RRSaO.net
>>127
そのおかしな人の言うことを解釈すると
そのコマンドはオプション引数でデータを受け渡すのであまりよくないのでは?
Unix哲学としてはデータは標準入力から渡すべき。
132:デフォルトの名無しさん
18/08/10 12:48:42.64 vqUG5YbC.net
おかしな人の言い分だな、確かにw
133:デフォルトの名無しさん
18/08/10 12:52:37.04 EBuB6o8O.net
パイプで繋いで使えるようにってことかな
134:デフォルトの名無しさん
18/08/10 13:42:12.09 ndPpyRQZ.net
おかしな人がケチつけてたのって何年も前じゃん
135:デフォルトの名無しさん
18/08/10 14:53:48.86 19uTC1v8.net
ああ、某原理主義者のことか
136:デフォルトの名無しさん
18/08/10 14:57:29.03 xNR7R3k1.net
ポジックス
137:デフォルトの名無しさん
18/08/10 15:54:52.38 ndPpyRQZ.net
でもあの人の言うことなんて聞いてらんないよね。こっちは宗教で食ってるわけじゃないんだからさ。
作って見せたツールだって痒いところに手が届かない部分は
「そんなのはそもそもこうこうであるべきで必要ない」みたいな感じでほっぽってるし
作ってマウント取って射精後スッキリになったら全くメンテなんてしないし。「各人個別で改修・メンテしろ」ってことなんだろうけど、
こんなの個人の便利ツール止まりで世界中の不特定多数の共有便利ツール・知識にはなり得ないよ。
138:デフォルトの名無しさん
18/08/10 15:59:32.13 xNR7R3k1.net
何やってる人か知らんが、それはそれでいんじゃないの?
頼まれずに作ったツールの公開なんてオナニーそのものやろ
139:デフォルトの名無しさん
18/08/10 17:01:03.73 r84RRSaO.net
誰かが例の記事のはてブで言ってたけど,ああいう人も必要だとは思う。
というか正直俺はプログラマじゃない(つまりコーディングで飯食ってるわけじゃない)ので,
ああいう考え方にはすごく興味があるし,実際研究室の管理シェルスクリプトをPOSIX準拠で書き直したりもしてる。
しかし繰り返すがプログラマにとっては邪魔な存在なんだろうなとは感じる。
というか言い方がキツすぎる。
140:デフォルトの名無しさん
18/08/10 17:59:17.69 q2LOavXt.net
だが、それがいい。
141:デフォルトの名無しさん
18/08/12 14:51:04.97 EQS0DV6K.net
#!/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' は無効な日付です
て表示されます。
助け船おねがいします
142:デフォルトの名無しさん
18/08/12 15:45:28.66 CtXb4bgk.net
>>138
シングルクオートだと変数が、展開されない気がすダブルクォートにしてみて
143:デフォルトの名無しさん
18/08/12 17:45:18.75 EQS0DV6K.net
144:>>139 n=`date +%Y-%m-%d_%H "-d ${i} hour ago"` ありがとう、動きましたw
145:デフォルトの名無しさん
18/08/13 00:38:00.83 z6+TJcGX.net
"-d ${i} hour ago" の部分が -d "${i} hour ago" ではないのに何故大丈夫なのかと思ったが、
短いオプションだからパラメータと繋がってても大丈夫ってことだったんだな。
146:デフォルトの名無しさん
18/08/14 19:59:14.84 0dSYKDxo.net
上のやり取りをみてふと思いたって実験してみると
GNU dateではフォーマットにCSIとかに代表されるANSI制御綴りを指定できるけど
BSD dateでは無理だな。
POSIXではこの二つのどちらが正しい実装なのかはよく分からんが
個人的な意見としてはBSD dateのほうが堅牢で,GNU dateのほうが柔軟だとは思う。まあ当然すぎる事実だけどw
147:デフォルトの名無しさん
18/08/15 02:35:15.09 sxh1cciH.net
BSD date の仕様が分からないけど、標準出力が端末とは限らないし
指定そのまま出すほうが正しいんじゃないかな
148:デフォルトの名無しさん
18/08/15 13:56:33.60 /R99sNfj.net
標準出力がなんのかんけーがあんのー?
149:デフォルトの名無しさん
18/08/15 16:29:17.30 fSWxnCwv.net
かんけーし
150:デフォルトの名無しさん
18/08/17 03:06:26.97 DWhhxT1h.net
単純な文字列置換ってどうしたら良いですかね?
sedつかうとメタ文字の置換で困るんです
151:デフォルトの名無しさん
18/08/17 03:42:44.91 l9m154d6.net
その辺りが楽なperlでいいんじゃない?
シェルスクリプトから使っちゃいけないというわけじゃないし
152:デフォルトの名無しさん
18/08/17 04:16:11.31 DWhhxT1h.net
>>147
さーせん、こんな状態なんです。
# perl
-ash: perl: not found
153:デフォルトの名無しさん
18/08/17 04:55:42.82 xP9ZimWn.net
awk
154:デフォルトの名無しさん
18/08/17 04:56:29.20 DWhhxT1h.net
awkに正規表現じゃない文字列置換命令ってありましたっけ?
155:デフォルトの名無しさん
18/08/17 06:24:27.95 /a+SCakG.net
Ruby が簡単
156:デフォルトの名無しさん
18/08/17 06:38:46.91 eWaVkn5S.net
>>151
perlが無いならrubyも無いでしょ
157:デフォルトの名無しさん
18/08/17 07:03:28.31 DWhhxT1h.net
はい、rubyもないし、pythonもなし、nodeもないです
158:デフォルトの名無しさん
18/08/17 08:18:50.56 /a+SCakG.net
Ruby をインストールすれば?
漏れは、WSL で、Rubyを入れているけど
159:デフォルトの名無しさん
18/08/17 08:24:08.77 RTbKyx/W.net
>>154
残り容量600KBを切ってるので入りません
Rubyは依存関係も含めると圧縮された
パッケージサイズで1MB以上あります。
160:デフォルトの名無しさん
18/08/17 08:34:23.82 vhwq6spf.net
viは?
161:デフォルトの名無しさん
18/08/17 08:36:24.83 RTbKyx/W.net
手動で置換は嫌です
162:デフォルトの名無しさん
18/08/17 08:40:03.28 vhwq6spf.net
viはスクリプト組めるでしょ
163:デフォルトの名無しさん
18/08/17 08:44:27.28 TmUZ5Zjz.net
パターン文字列をsedで置換しちゃうとか(GNU sed の場合)
$ pattern='foo[1]'
$ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]'
foo[2]
164:デフォルトの名無しさん
18/08/17 08:49:02.25 vhwq6spf.net
脳みそが解読を拒否してる
165:デフォルトの名無しさん
18/08/17 08:53:02.98 xP9ZimWn.net
URLリンク(paste2.org)
(こういうのをすんなりレスで書けないのはイラつく)
変なこだわりは知らん。細かくはテストはしてないけどまあ動くんじゃね
166:デフォルトの名無しさん
18/08/17 08:56:35.86 RTbKyx/W.net
>>158
スクリプトの実行はできましたが、 %s/~/~/g
だと~に/が入っていた時に困ります。
~には何が入るかわかりません。
あとviは標準入力から読み込めませんでした
できれば標準入力から読み込みんで標準出力に出力したいです。
ちなみにviのバージョンです
# vi -H
These features are a
167:vailable: 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
168:デフォルトの名無しさん
18/08/17 09:00:22.48 RTbKyx/W.net
>>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).
169:デフォルトの名無しさん
18/08/17 09:16:35.01 RTbKyx/W.net
>>161
ありがとうございます。動きました。
さくっとはできないもんなんですね。
170:デフォルトの名無しさん
18/08/17 09:16:49.96 TmUZ5Zjz.net
>>163
ああ、bash じゃなくて ash だから here string("<<<") が使えないのね…
# echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
こんな感じかな。
171:デフォルトの名無しさん
18/08/17 09:33:56.45 xP9ZimWn.net
>>164
-v のはawk内で展開されての右辺を文字列リテラルとして処理されてえのっぽい。ので、バックスラッシュが鬼門のよう
URLリンク(paste2.org)
172:デフォルトの名無しさん
18/08/17 09:48:06.80 RTbKyx/W.net
>>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
173:デフォルトの名無しさん
18/08/17 09:57:27.72 TmUZ5Zjz.net
>>167
う~ん、ash でやってみたけど、1番目、2番目は問題ないなぁ
Busybox の sed は -r オプションがないんじゃなかったかな
174:デフォルトの名無しさん
18/08/17 09:58:49.05 TmUZ5Zjz.net
あ、ごめん勘違いしてた。ちょっと考えてみる
175:デフォルトの名無しさん
18/08/17 10:03:14.53 RTbKyx/W.net
そう。何が問題なのかよくわからないw
176:デフォルトの名無しさん
18/08/17 10:13:01.82 TmUZ5Zjz.net
あれ?でもさ、
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"
こっちの方が良いみたい。
177:デフォルトの名無しさん
18/08/17 10:13:20.76 5I+JCiH1.net
どうかな
URLリンク(ideone.com)
178:デフォルトの名無しさん
18/08/17 10:18:32.56 RTbKyx/W.net
>>171
ごめん、紛らわしかった。
そっちは正しいパターン
おかしいのは「a+」の時
179:
180:デフォルトの名無しさん
18/08/17 10:20:29.64 RTbKyx/W.net
だから要するに + はエスケープしたらダメってことなのか?
単純な文字列置換って正規表現置換よりも簡単な処理なのに
どれも面倒くさいなぁw
181:デフォルトの名無しさん
18/08/17 10:33:33.58 hKcJGgnp.net
ashの日本語manページはないのかなと思って検索した時に出てきた画面。
URLリンク(i.imgur.com)
182:デフォルトの名無しさん
18/08/17 10:37:43.83 RTbKyx/W.net
>>175
いや、そんなの見せられましてもねぇ
URLリンク(www.google.co.jp)
183:デフォルトの名無しさん
18/08/17 10:41:51.16 hKcJGgnp.net
>>176
カラフルな検索結果だがこれと言って役に立たないという共通点があるな・・・
184:デフォルトの名無しさん
18/08/17 10:51:57.16 RTbKyx/W.net
>>177
ニヤニヤできるぞ
今更だがluaなら入ってたで
185:デフォルトの名無しさん
18/08/17 11:32:47.25 TmUZ5Zjz.net
grep にある -F オプションと同等のオプションが sed にも
欲しいところではあるなぁ。生まれは同じなのに sed には無い
のは何故…(実はあったりして)
186:デフォルトの名無しさん
18/08/17 18:50:11.51 D/YAmHXf.net
fsedみたいなのを作ってる人ならしってる
187:デフォルトの名無しさん
18/08/18 17:22:09.36 rQWtSS3z.net
Googleのシェルスクリプトに関するコーディング規約で
「そう〔訳注: 連続したパイプ節が二つ以下〕でない場合は一行につき一つのパイプ節を含むようにする。その際,二番目以降のパイプ節は,2文字分の欧文空白による字下げを行なう。」
とあるんだが[1],ここの例示が
command1 \
| command2 \
| command3 \
| command4
となっている。
普通(といってもパイプをこのように多用しかつ改行しまくっている例はほとんど見たことがないのだが)URLリンク(github.com)
↑こことかでは
command1 |
command2 |
command3 |
command4
という書き方になっている。
俺はこっちの書式のほうが見慣れているので,自分のシェルスクリプトもこういう書き方でやっているのだが,みなさんはどういう書き方がいいとかあるだろうか。あるいはGoogleとは別のところが発表してるシェルスクリプトのコーディング規約とかないだろうか。
188:デフォルトの名無しさん
18/08/18 17:22:24.47 rQWtSS3z.net
一応俺の意見: 後者の利点としては,バックスラッシュが不要なこととコマンドが行頭に来て流れを掴みやすいということがある。
加えて簡易的なデバッグするときに,前者は
command1 \
| command2 \
| cat
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
cat
# command3 |
# command4
このように「新しい行を挿入してcatを入力」という単純な動作ができるので,例えばVimやEmacsなどマクロが作れるエディタなどでのデバッグ用の編集に有用というのもある。
実際俺はシェルスクリプトに関してはIDEを使わずVimで開発していて,この類のマクロを作成して便利に使っている。
長文すまん
[1]: URLリンク(google.github.io)
189:デフォルトの名無しさん
18/08/18 18:05:23.17 5BnyFmRJ.net
簡易的なデバッグするときに前者は
command1 \
| command2 \
# | command3 \
# | command4
などとするのに対して 後者は
command1 |
command2 |
# command3 |
# command4
のように行頭に#をいれるだけではSyntax errorになるから前者の方がデバッグなど編集に有用とも言える
個人的には大差ないと思う
190:デフォルトの名無しさん
18/08/18 18:29:20.16 LW/iu6SG.net
末尾にバックスラッシュを入れることで次行を見なくても明確にコマンドが続くことがわかるから前者を支持する
191:デフォルトの名無しさん
18/08/18 18:38:12.95 Bu4pj5O8.net
一長一短やな
使い分けか
192:デフォルトの名無しさん
18/08/18 19:19:56.79 rQWtSS3z.net
>>184
でも>>183のように,コメントアウトすると
「末尾にバックスラッシュがあっても後ろにコマンドがない(実行されない)」
という状況がありえる以上,
末尾のバックスラッシュの有無を過信するのはよくないと思う。
もちろん気をつければいい話だが。
なんというか,ハンガリアン記法の間違って流布された方法に近しい危険性がある
(変数i_VARを見て,本当はfloat型なのにint型だと思い込む)
193:デフォルトの名無しさん
18/08/18 19:21:44.26 rQWtSS3z.net
ていうか少なくとも二人くらいは
後者の方式に賛同してるのか。
Googleもそっちを推奨してるし,俺も手癖を直すべきなのかな。
194:デフォルトの名無しさん
18/08/18 20:18:01.73 pAmB63kN.net
>>184
それ、末尾にパイプ記号あるから~
と同じことじゃね?
個人的には見栄え的には前者の方を採用したいが余計な継続記号が不要な後者で書いてる
195:デフォルトの名無しさん
18/08/18 21:09:33.95 bNUWoVQ1.net
パイプ記号が重要だから頭にもってきたいかなあ
196:デフォルトの名無しさん
18/08/19 00:41:34.89 6q4oK8R8.net
scsh 使え URLリンク(scsh.net)
197:デフォルトの名無しさん
18/08/19 01:23:37.19 A4xH6fb7.net
バックスラッシュで行継続(改行)って多くの言語で採用されているから
多くの人はパイプ先頭、バックスラッシュ行末じゃないかな?
198:デフォルトの名無しさん
18/08/19 02:52:07.69 YqoTvka6.net
俺は1行か2行くらいなら後者だな。
何行もずらずら並べるなら中括弧で囲んでパイプ記号を先頭に持ってくるかも。
行末にバックスラッシュを置いて行継続はあまり美しくないと思うのでなるべく書きたくない。
>>191
構文的に行末で文(言語によっては式)が完結できていれば行末を文の終わりとみなし
そうでなければ次の行に継続、というのもshそのものをはじめpython, JavaScriptなど多くの言語で採用されているよ。
(pythonはshと同じく行末バックスラッシュで継続もできるが)
更にRubyは行の終わりで完結できるように見えても次の行の先頭を見てどうするか決めていたりする。
199:デフォルトの名無しさん
18/08/19 04:00:58.03 O9LemqF2.net
>>190
無知ながら初耳だった。
scshの説明をざっと読んだけど、今回の問題の解決になる?
むしろ「括弧の前で改行するかいなか」みたいな新たな規約が生まれそうじゃない?
200:デフォルトの名無しさん
18/08/19 16:16:41.68 L67BZdE+.net
shに限らず末尾に演算子を置く
201:デフォルトの名無しさん
18/08/19 19:55:46.26 O9LemqF2.net
シェルスクリプトの話題からちょっと外れるんだけど
$ somecmd --help
としたときの手引きって標準エラー出力に出力すべき?
GNU Coreutilsでは基本的に標準出力なんだけど……。
202:デフォルトの名無しさん
18/08/19 20:37:51.45 6q4oK8R8.net
stderr だとページャにつなげたい時に
$ somecmd --help 2>&1 | $PAGER
とかするのが面倒。でも zsh とかだとエイリアスで
どうにかできるんだっけ?
203:デフォルトの名無しさん
18/08/19 22:24:00.37 teBDlI3J.net
helpはエラーではないから標準出力でいいのでは
204:デフォルトの名無しさん
18/08/19 23:44:45.76 O9LemqF2.net
>>196
$ somecmd --help |& $PAGER
↑これでいいんでは
205:デフォルトの名無しさん
18/08/20 00:18:14.36 anhi4Zz/.net
>>198
㌧クス、"|&" が使えるのは bash と zsh だけかな
206:デフォルトの名無しさん
18/08/20 00:25:54.45 V9a8ZDkH.net
>>199
csh(系)も使える
207:デフォルトの名無しさん
18/08/20 01:00:54.38 Za3ebEAA.net
>>199
あ ごめん。それPOSIX互換じゃねえわ
知らんまにbash主義に染まってた 反省。
208:デフォルトの名無しさん
18/08/20 03:03:17.26 miyFFq/v.net
csh由来のものをbashismというのはどうかと……
209:デフォルトの名無しさん
18/08/20 03:04:00.88 O40ujeeV.net
つくづく宗教戦争じみてるなこの文化は
210:デフォルトの名無しさん
18/08/20 03:32:09.94 OmELABLW.net
まあ>>201はそんな大層な意味で言ってるわけではないだろ。単にbashしか使ってない使い込んでるってだけの意味だろう。無知でしたという
211:デフォルトの名無しさん
18/08/20 03:46:49.27 GIvuOFoC.net
--helpで思い出したけど、あれって書き方ってあるの?
usageの書き方とかオプションの書き方とか
引数は大文字にするの?とか [ファイル]... とかの[] とか ... の使い方とか
あるようで、バラバラな気もしている
212:デフォルトの名無しさん
18/08/20 04:15:12.27 Za3ebEAA.net
>>205
とりあえず 天下のPOSIX様はこうおっしゃってる
utility_name[-a][-b][-c option_argument]
[-d|-e][-f[option_argument]][operand...]
URLリンク(pubs.opengroup.org)
ので 俺はそれに従ってる。だいたいのmanページやGNUユーティリティの--help出力もこれに準ずる形だと思うよ
213:デフォルトの名無しさん
18/08/21 20:17:11.95 ExpCY3/V.net
>>206
多分>>205はそういうのを求めてたんじゃないな
214:デフォルトの名無しさん
18/08/23 05:30:33.48 L+hDtmKU.net
シェルスクリプトの言語にJavaScriptってアリだと思う?
#! /usr/local/bin/js24
みたいなシェバンでさ。
215:デフォルトの名無しさん
18/08/23 05:39:54.64 ncZgpeak.net
シェルスクリプトっていうのは
シェルとして実用に堪えるものじゃないとダメ
名前の通り
コマンドを呼び出すのに、いちいちsystem関数を
使うとかいうのは、シェルとして使えない
ls だけでlsコマンドを実行できるようにしたら
シェルスクリプトと認めてもいいが
216:デフォルトの名無しさん
18/08/23 07:32:38.64 d2Ifs7B7.net
>>208
ナシだと思う
217:デフォルトの名無しさん
18/08/23 07:38:44.84 1n1CeI2l.net
シェルスクリプトというより、他のインタプリタ言語と同じようにコマンド(内容)記述用としてあっていいって話だろう
218:デフォルトの名無しさん
18/08/23 08:56:23.64 AY9SoYfw.net
普通にやるだろ。
#!/usr/bin/awk -f
とかだってたまにはやるぞ。
「#」がコメント扱いになる言語なら
気にせずどんどんやればいい。
そもそもshebangはUNIX上で「スクリプト言語」を呼び出す時の記法であって
現代UNIXではシェルは一切関与しないカーネルの機能だから
「シェルスクリプト」なんかじゃない。
(つまり実はスレ違い)
なお昔のSystem-V系UNIXにはカーネルにこの機能がなくexec(2)が失敗するので、
その場合にはシェルが代行してスクリプトのインタープリターをよびだしていた。
そういうUNIXはほぼ滅びたけどシェル側にはまだこの代行機能が残っていたりする。
シェルは関与しないのにshell-bangなんて変な名前だけど、
この言い方自体比較的新しくて、実装されてからだいぶ長い間名前がなかったんだよ。
普通はカーネルが処理しててシェルは関係ないってことを
知らない奴がつけた名前じゃないかと前から疑問に思ってる。
219:デフォルトの名無しさん
18/08/23 09:39:55.05 ncZgpeak.net
>>212
> 普通にやるだろ。
> #!/usr/bin/awk -f
> とかだってたまにはやるぞ。
落ち着け
それはスクリプト言語だ
"シェル"スクリプト言語ではない
220:デフォルトの名無しさん
18/08/23 09:45:44.18 ncZgpeak.net
> シェルは関与しないのにshell-bangなんて変な名前だけど、
shebang を shell-bangの略だと主張する人は少数派だよ
221:デフォルトの名無しさん
18/08/23 12:56:18.33 /qY100we.net
>>208
それはシェルスクリプトじゃなく、
JavaScriptスクリプトだ
222:デフォルトの名無しさん
18/08/23 12:59:05.57 XdhcXIaw.net
スクリプトスクリプトはもにょる
223:デフォルトの名無しさん
18/08/23 13:18:49.52 cYcyOMDR.net
スクリプト
スクリプトスクリプト
スクリプトスクリプトスクリプト
スクリプトスクリプトスクリプトスクリプト 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
224:デフォルトの名無しさん
18/08/23 14:49:29.73 AY9SoYfw.net
>>213
落ち着け。
もうちょっと先まで読めば同じことが書いてあるぞw
225:デフォルトの名無しさん
18/08/23 14:59:38.25 AY9SoYfw.net
>>214
shebang の e って何から来てるの?
俺は shell から来てるんだと思ってた。
なお shabang という書き方も少数派だが使われてはいるみたい。
実際 sharp-bang なわけで、こっちなら分かる。
shabang ならシバンじゃなくて、シャバンだよな。
シャバ~ン。
226:デフォルトの名無しさん
18/08/23 15:01:24.58 2Dv2zxdP.net
男なんだろ?
227:デフォルトの名無しさん
18/08/23 15:09:53.60 Jv3FRRxD.net
違うよ~☆
228:デフォルトの名無しさん
18/08/23 15:11:13.70 e+w5jH4y.net
若さ、若さってなんだ
229:デフォルトの名無しさん
18/08/23 15:13:13.81 eJiCstIz.net
なんというか、ヒーローの名前のようだ。
230:デフォルトの名無しさん
18/08/23 15:42:31.50 bMgbpjF3.net
それはギャバン
231:デフォルトの名無しさん
18/08/23 16:36:01.71 YQoAQycd.net
さぁ、盛り上がって参りました
232:デフォルトの名無しさん
18/08/23 16:45:35.96 ssILkLQJ.net
宇宙刑事シャバン
233:デフォルトの名無しさん
18/08/23 16:48:23.72 e+w5jH4y.net
ギャバン
シャバン
シャリバン
234:デフォルトの名無しさん
18/08/23 17:03:22.02 ncZgpeak.net
癒着!
235:デフォルトの名無しさん
18/08/23 18:14:50.72 AY9SoYfw.net
なんつーかオッサンばっかだな。
まあ俺もそういう反応を期待してたわけだがw
236:デフォルトの名無しさん
18/08/23 18:43:16.20 1n1CeI2l.net
>>219
#! -> sharp-bang -> shabang -> 単語ならshellだしすでにあるとても似たshebangでいいんじゃね、shebangの意味自体が似合ってるし
とか。shebangというれっきとした単語の由来は別にある
237:デフォルトの名無しさん
18/08/24 01:02:04.55 TjDOkMEc.net
元ネタ分かんねーと思ったらおっさんどころかジジイじゃねーか
238:デフォルトの名無しさん
18/08/24 07:46:54.31 mVdVBkdF.net
マジで検索しても元ネタわからんw
平均年齢どのくらいだこのスレは
239:デフォルトの名無しさん
18/08/24 08:04:01.22 lit/+L8O.net
機動刑事シバン
240:219
18/08/24 08:55:32.25 57yPHNQD.net
>>232
>>227 が元ネタ。
ギャバン/シャリバンのバンと、シャリバン/シャイダーのシャと、
ギャバンのオープニング末尾のギャーバーン♪
からの連想でシャーバンと書いた。
残りは歌詞検索とかすると分かる。
こんな連想するの俺だけかと思ったら他にも複数いてワラタ
241:デフォルトの名無しさん
18/08/24 09:13:07.93 LbFHGrVQ.net
>>234
男なんだろ?
の一言でギャバンOPテーマとわかるのはギャバン世代というよりもFLASH黄金世代な予感
実際俺はギャバンじゃなく当時の面白FLASHギャバソで知った
242:219
18/08/24 09:35:23.98 57yPHNQD.net
>>235
そんなFLASHがあったのか。
4月のAnisonDaysに串田アキラが出てギャバンのOPを歌ってたから、
それで記憶が蘇ってる人もいるかも。
てゆうかそれ俺。
243:デフォルトの名無しさん
18/08/24 10:43:03.55 wXpFbMeR.net
そして>>228の癒着というのはケロロ軍曹の登場人物
556(コゴロー)が変身するときのセリフ
元ネタはギャバンが変身するときに言うセリフの蒸着
40代ならここまで連想する
244:デフォルトの名無しさん
18/08/24 10:59:15.82 4te4jIm4.net
蒸着の元ネタってギャバンだったのか…
DeadSpaceのアーマー更新シーンを蒸着言うやついたけど元ネタあったんだな
245:デフォルトの名無しさん
18/08/24 15:39:45.35 mVdVBkdF.net
>>237
あ それなら知ってるわ
ケロロ軍曹だったら子供のころアニメで観てた
246:デフォルトの名無しさん
18/08/24 16:02:03.60 wXpFbMeR.net
>>239
ようこそ。おっさんの世界へ
247:デフォルトの名無しさん
18/08/24 19:44:16.61 Gfkbj1yB.net
バッチファイルやパワーシェルもシェルスクリプトですか?
何言語っていうんでしょうか?
248:デフォルトの名無しさん
18/08/24 19:45:54.13 wXpFbMeR.net
>>241
どうでもいいことを気にするな
249:デフォルトの名無しさん
18/08/24 19:54:12.80 Gfkbj1yB.net
静かに
250:デフォルトの名無しさん
18/08/24 20:30:04.55 ap1IsA9z.net
確かに
だと思ったら
静かに
でなんか笑った
251:デフォルトの名無しさん
18/08/24 22:34:41.93 UXXFLepR.net
>>241
バッチファイルはシェルスクリプトには入れないなあ。
PowerShellの方は、PowerShellスクリプトって言うな俺は。
252:デフォルトの名無しさん
18/08/25 06:14:56.78 TgLfCzAb.net
バッチファイルをシェルスクリプトに入れない理由はないと思うけど?
253:デフォルトの名無しさん
18/08/25 12:12:23.81 r5O9PJUC.net
スクリプトに入れるのはありだけどシェルスクリプトって言う奴は少ないと思う
254:デフォルトの名無しさん
18/08/25 12:16:23.36 zrQnMjpj.net
ちゃんとした定義は知らんが、
シェルスクリプト=.sh
バッチファイル=.bat
と大抵は認識してそうな印象
255:デフォルトの名無しさん
18/08/25 13:58:20.34 R/mHQH6/.net
Wikipedia に書いてあることでだいたいいいのではいか?
スクリプト言語
URLリンク(ja.wikipedia.org)
256:デフォルトの名無しさん
18/08/25 14:43:10.95 0Hfq0tYW.net
シェル スクリプトと言えばだから違うくね。バッチファイルをシェルスクリプト(ファイル)と実際に呼んでるヤツを見たことはないな
command.com自体が原始的でシェルのように打ち込んでってってのも見ない。あれはやっぱりバッチファイルを作るためのでしかないってうすうすわかっているからじゃねとか
257:デフォルトの名無しさん
18/08/25 14:47:50.16 TgLfCzAb.net
>>250
最初から結果ありきで書くなよ。単にお前がバッチファイルをシェルスクリプトに入れないためのこじつけを
お前が考えてるだけじゃねーか
wikipediaにも書いてあるし
> スクリプト言語の一種は、ジョブ制御の自動化から生み出されたもので、システムプログラムの起動と制御を行う。
> そういう意味ではシェルの祖先としてIBMの Job Control Language(JCL、ジョブ制御言語)があるとも言える。
> この種の言語の処理系(インタプリタ)の多くは、UNIXのシェルやMS-DOSのCOMMAND.COMといった
> コマンドラインインタプリタと呼ばれるものである。
258:デフォルトの名無しさん
18/08/25 14:48:52.43 TgLfCzAb.net
URLリンク(ja.wikipedia.org)
> シェルスクリプト用インタプリタの多くはコマンドラインインタフェースも兼ねており、各種Unixシェル、
> Windows PowerShell、MS-DOSのCOMMAND.COMなどがある。
259:デフォルトの名無しさん
18/08/25 14:51:47.98 0Hfq0tYW.net
>>251
「実際」にだよ。お前の周りでバッチファイルをシェルスクリプトと呼んでいるヤツいるの?
呼んでもいないのになぜそんなとこに拘る。バッチファイルはバッチファイル、Unix系のはシェルスクリプトはシェルスクリプトでええやん
逆にシェルスクリプトで書かれたはファイルをバッチファイルとなぜ呼ばないまでこだわれよ、だったらw
260:デフォルトの名無しさん
18/08/25 14:58:00.88 TgLfCzAb.net
>>253
はい、いますー。論破w
261:デフォルトの名無しさん
18/08/25 15:01:01.94 0Hfq0tYW.net
いるんだww
262:デフォルトの名無しさん
18/08/25 15:31:37.30 4b56uGjx.net
いるのか…
263:デフォルトの名無しさん
18/08/25 16:39:23.62 CiVrtAH/.net
>>248
自分はこの定義に賛同する
264:デフォルトの名無しさん
18/08/25 17:13:00.55 aJ7Wjpaw.net
バッチファイル=バッチスクリプトであってる?
バッチファイル=シェルスクリプトはまちがえ?
265:デフォルトの名無しさん
18/08/25 17:34:24.45 TgLfCzAb.net
>>258
シェルスクリプトというカテゴリがあって、
その中で、特別に言語を指定する場合は、
bashスクリプトやバッチファイルなどという具体的な呼び方をしている
バッチファイル = シェルスクリプト ではなく
バッチファイルはシェルスクリプトに含まれる
266:デフォルトの名無しさん
18/08/25 17:57:18.64 0Hfq0tYW.net
>>258
バッチファイルを作るための制御文なんぞを特に命名はしてないんじゃないの。バッチファイルというのがあってそれを作る/それで使える制御文は的な存在。誰も名前を言えないように
バッチファイルのバッチとは バッチ処理 という古典的コンピュータ用語。MS-DOS/Microsoft上でバッチ処理を書いたファイル/バッチ処理のファイルということで、バッチファイルと名前付けしたにすぎない
シェルスクリプトファイル、シェルスクリプトで書かれたコマンドも、広義ではバッチ処理のファイルなのでバッチファイルと呼べるが、そんな呼び方をする人はいない
そもそもシェルやシェルスクリプトだって、Unixでそう呼んだからにすぎないんだけど、どうして一緒くたにしたがるのかわけわからん
てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレでバッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?てか、そんなトンチンカンが現れたことがないんだから、わかるようなもんだと思うけど
267:デフォルトの名無しさん
18/08/25 18:06:28.42 0Hfq0tYW.net
>>260
>バッチファイルと呼べるが、そんな呼び方をする人はいない
サーバーなんぞの1日深夜1回とか1週間に1回のごちゃごちゃ処理するのを呼んだりしているかもしれない。そういう狭義のある意味全くもってなバッチ処理を記述したファイルという意味で
268:デフォルトの名無しさん
18/08/25 18:11:40.65 TgLfCzAb.net
> てかさ、バッチファイルのアレもシェルスクリプトだって言いたがりは、このスレで
> バッチファイルのことが出てきたらどうすんの?当たり前のように受け止めるの?
なにか問題でも?
>>2に
> ・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です
> csh/tcshでのシェルスクリプトは*まったく推奨しません*。
などと書いてあるから、バッチファイルと明記して書けば問題ないでしょ?
269:デフォルトの名無しさん
18/08/25 18:18:00.15 0Hfq0tYW.net
なにそれw
無茶苦茶やな。書かなくても誰もがわかっていたからそんなのが出てない書く必要もないという事実を無視して自説のためにでしかないやん
270:デフォルトの名無しさん
18/08/25 18:22:59.07 TgLfCzAb.net
なにいってんだか。
バッチファイルという名前が有名だから、普段はそっちの名前で読んでるだけで
cmd.exeはシェルだし、シェル上で動く言語という定義なんだから、
シェルスクリプトに当てはまるという至極まっとうなことを言ってるだけ
271:デフォルトの名無しさん
18/08/25 18:29:18.68 0Hfq0tYW.net
>シェルスクリプトに当てはまるという
だから?で?それが何かの役に立つというか意味があるのか?ってことだよ。別に当てはまろうが当てはまらないだろうが意味ないだろう??
バッチファイルといえばアレで、シェルスクリプトといえばコレでいいことやん。それでなにも問題もなくうまくもいってるってのが、このスレででもっていう
バッチファイルをここで話題にしたがってるの??ww
272:デフォルトの名無しさん
18/08/25 18:29:21.83 zrQnMjpj.net
もうスクリプトでいいんじゃないかな(鼻ホジ
273:デフォルトの名無しさん
18/08/25 18:31:36.33 0Hfq0tYW.net
すでに出てたけど、>>247だわな
274:デフォルトの名無しさん
18/08/25 18:33:12.36 zrQnMjpj.net
cmd=シェルってのがピンとこないんだよな
大体シェル=シェルスクリプトみたいな使い方してるからなんだけどさ
275:デフォルトの名無しさん
18/08/25 18:34:28.54 TgLfCzAb.net
>>265
意味がないならシェルスクリプトでいいだろw
276:デフォルトの名無しさん
18/08/25 18:37:31.47 0Hfq0tYW.net
薄いな。なんでそんなに拘る。意味がないのはあんた個人に対してだよ
バッチファイルがシェルスクリプでもなければならない意味を言いなさい
277:デフォルトの名無しさん
18/08/25 18:42:40.13 0r5h6/lL.net
コマンドラインインタープリタを自動化したもんを
シェルスクリプトとというの
頭悪いバカのみんな分かった?
当然、バッチファイルもシェルスクリプト
わかった?
278:デフォルトの名無しさん
18/08/25 18:43:26.08 0Hfq0tYW.net
>>268
Unixでsh(系=シェル)を使うと、貧弱なにもできないって感じからcmd=シェルとはピンとこないこともあるな
シェルを起動してとは言わんし。てか大体の記事とかでも、いや、Microsoftでさえシェルとは呼んではく、Command Promptだからね
279:デフォルトの名無しさん
18/08/25 18:49:15.78 TgLfCzAb.net
>>270
普通にcmd.exeがシェルだし、そのシェルの言語で動くんだから
シェルスクリプトですってだけだが?
なんでシェルスクリプトじゃだめなの?
> cmd=シェルとはピンとこないこともある
お前が本質をわかってないからだろうねw
280:デフォルトの名無しさん
18/08/25 18:50:24.91 TgLfCzAb.net
> 貧弱なにもできないって感じから
何もできないからなんだっていうんだろうか?
リダイレクトできるよ? パイプ使えるよ?
まさにシェルスクリプトの特徴だよね
281:デフォルトの名無しさん
18/08/25 18:53:58.18 0Hfq0tYW.net
>>273
さっぱりだな。だからそれの意味を教えなさい。そんなにづっと続けるのだから意味があるんでしょ?あなた個人に
それがさっぱりわからんのだよ。「はいはい、バッチファイルもシェルスクリプトだね、誰もそう呼ばないけど」で満足なの?
本質wwあなた個人の意味も言えないのに本質wwwって思ってしまうよ
282:デフォルトの名無しさん
18/08/25 18:56:00.29 0r5h6/lL.net
プリンタに内容がPDLのファイルをリダイレクトすれば
いまでも普通にコマンドプロンプトで印刷もできるからな
コマンドプロンプトでコマンドからなんでもできる
283:デフォルトの名無しさん
18/08/25 18:58:24.61 0Hfq0tYW.net
>>274
>Unixでsh(系=シェル)を使うと
って、言ってるのだけど。ああ...なんだ..MS好きか?単に
shとcmdの違い/使い勝手が天地なのは使えば明らかだと思うけど。shと同等にcmdを使ってるの?もしかしてsh使ってないとかはないよな?w
284:デフォルトの名無しさん
18/08/25 19:01:50.62 TgLfCzAb.net
>>277
だからなんで高機能なものがシェルスクリプトの定義だ
なんて思ってるのさ?
低機能なシェルスクリプトってだけだろ
つーか、なにができないとシェルスクリプトとは認められないって言ってるんだよ
お前の定義言ってみな。矛盾しないような。
285:デフォルトの名無しさん
18/08/25 19:10:24.45 0Hfq0tYW.net
>>278
一般的に、シェルスクリプトと言えばUnixが元のあれやこれや
一般的に、バッチファイルと言えばMS-DOS/Windows/Microsoftのあれやこれや
一般的に、バッチファイルと言えばわかるものをシュエルスクリプトとわざわざ言い換えはしない
シェルはもともとUnixでの言い出したことだし、sh(シェル)/cmd(コマンドプロンプト)でそれぞれ、シェルスクリプト/バッチファイルと呼んでいた
コマンドをインタラクティブで処理するやつをどうであれシェルと呼ぶ見方もあるだろうが、それは一般的ではないな。cmdはやっぱりCommand Promptなとことからも
ってとこ。別にバッチファイルはバッチファイルで何も問題がなく、わざわざシェルスクリプトと言い換える意味がわからん、混同という弊害もあるし
286:デフォルトの名無しさん
18/08/25 19:12:53.54 0r5h6/lL.net
まさにシェルがなにかついて記述されている
URLリンク(en.wikipedia.org)
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 o�
287:� terms. バカの世界では違うらしい
288:デフォルトの名無しさん
18/08/25 19:15:52.35 0Hfq0tYW.net
>>280
よく読んでみ。なんかこれ幸いな単語で喜んでいるだろう?
289:デフォルトの名無しさん
18/08/25 19:31:09.91 TgLfCzAb.net
>>279
一般的にって、全部お前がそうしたいってだけじゃねーかw
290:デフォルトの名無しさん
18/08/25 19:32:11.87 TgLfCzAb.net
>>281
お前のために翻訳してやったぜ
> シェルスクリプトは、あるコンピュータプログラムによって実行されるように設計されたUnixシェル、
> コマンドラインインタプリタ。[1]シェルスクリプトのさまざまな方言は、スクリプト言語と見なされます。
> シェルスクリプトによって実行される一般的な操作には、ファイルの操作、プログラムの実行、
> およびテキストの印刷が含まれます。環境を設定し、プログラムを実行し、必要なクリーンアップやロギングなどをラッパーと呼びます。
>
> この用語は、より一般的には、オペレーティングシステムシェルを実行する自動モードを意味するためにも使用されます。
> 特定のオペレーティングシステムでは、バッチファイル(MSDos-Win95ストリーム、OS / 2)、
> コマンドプロシージャ(VMS)、シェルスクリプト(WindowsNTストリーム、4NTのようなサードパーティ製の派生品)などがあります
291:デフォルトの名無しさん
18/08/25 19:36:03.43 0Hfq0tYW.net
>>282
だーーかーらーー、今までのこのスレでバッチファイルの話をするやつなんていないことから、一般的だってお前にもわかるだろう
>>283
だーーかーらーー、その「一般的」って一般的ではない一般的だよw 他の全文読んでみ。どれだけバッチファイルに言及してる?そこだけだろ?
てかさ、お前の周りでバッチファイルをシェルスクリプトと言っているのそんなにいるの?
292:デフォルトの名無しさん
18/08/25 19:40:24.03 TgLfCzAb.net
>>284
? もともとこのスレはUnix板にあったし?
>>2にsh系前提って書いてあるし?
このスレの一般的じゃなくて、世間一般の
シェルスクリプトの定義の話をしようぜ?
なんならここでバッチファイルの内容を入れても良い
次から>>2の内容を書き換えてあげようか?
293:デフォルトの名無しさん
18/08/25 19:44:09.41 0Hfq0tYW.net
なんだろ。こんだけ世間擦れして、なんかどこぞの辞書的なとかが絶対ってこだわり続けるのは...あれかな??w
>>285
そういう無茶苦茶言えるのは、やっぱりアレだろなと思わざるを得ない
誰もそんなの望んではいないだろうと思われるけど。Unix板にあろうが「シェルスクリプト」でググって飛び込んできても不思議ではないな、あんたの言い分では
てかそのあんたの言っているその時点で暗にあんたもシェルスクリプトとバッチファイルは違うと認めてるようなもんなんだが、わからんだろうな
294:デフォルトの名無しさん
18/08/25 19:51:38.10 9FNycoly.net
はいはいわかった。
次スレは>>2を書き換えたからな
295:デフォルトの名無しさん
18/08/25 19:55:20.14 0Hfq0tYW.net
拗らせるぐらいなら参加しなきゃいいのにw
すげえな今までを全く無視して個人的にそうするという自己中ぶりは
296:デフォルトの名無しさん
18/08/25 19:56:27.99 A3V5N+C6.net
自覚ないみたいだな
俺はシェルスクリプトの正しい定義を言ってるだけ
297:デフォルトの名無しさん
18/08/25 19:57:14.99 0Hfq0tYW.net
誰やねんw
298:デフォルトの名無しさん
18/08/25 20:04:48.84 0Hfq0tYW.net
広義ではバッチファイルをシェルスクリプトと呼べるかもしれないが、一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う�
299:福ェ多い 「一般的に」というのは「広義では」という場合にも使われるのを知っておこう ただ、それだけのことなんだけどねえw
300:デフォルトの名無しさん
18/08/25 20:09:01.30 kfh++Yrt.net
バッチは別スレあるし、棲み分けすればええんとちゃう?
まあアスペのためにもスレタイにUNIXでも付けとく?
詳しくは>>2に入れておいて
あとUNIX板から移動したって事で>>1にはUNIX板の最終スレは残しておくか
301:デフォルトの名無しさん
18/08/25 20:10:14.67 A3V5N+C6.net
これは言い方を逆転させただけ
一般的にバッチファイルをシェルスクリプトとは呼ばないし、そう思っているのは少なく明らかに分けて考えて言う方が多いが、
広義ではバッチファイルをシェルスクリプトと呼べる
302:デフォルトの名無しさん
18/08/25 20:10:31.78 9woB+JG6.net
UNIX、Windows、それぞれの文化の中での言い方なのに
何ムキになってるんだい?
UNIXの文化の中で、シェルスクリプトといえばsh系のスクリプトのことを通常は意味するだろう?
わざわざ、Windowsバッチファイルを「シェルスクリプト」と呼ぶことは、
英語圏の外国人が日本に来て、何故英語が通じないと言ってるようなもので、
UNIX文化圏の人から見たら、「何言ってんだこいつ」ということになる。
このスレがプログラム板に来たからといって、シェルスクリプト自体がUNIX文化であることには疑いなく、
正しいか正しくないかということとはまた別の問題なんだよ。
303:デフォルトの名無しさん
18/08/25 20:11:13.69 A3V5N+C6.net
>>292
sh互換専用のスレ立てたのでどうぞ
【POSIX】 sh系互換 シェルスクリプトスレ
スレリンク(tech板)
304:デフォルトの名無しさん
18/08/25 20:13:03.56 kfh++Yrt.net
>>295
ワッチョイ入れておいた方が良くないか?
>>4の経緯があるし
305:デフォルトの名無しさん
18/08/25 20:13:19.96 0Hfq0tYW.net
拗らせすぎ。なぜそこまで...必死と言わざるを得ないw
306:デフォルトの名無しさん
18/08/25 20:15:34.15 9woB+JG6.net
別スレ立てるなんて、もう嫌がらせでしか無くない?
しかも2つも。
307:デフォルトの名無しさん
18/08/25 20:20:01.41 kfh++Yrt.net
>>298
ほんとそれ
ワッチョイ入れて粘着する奴はNGした方が良さそう
308:デフォルトの名無しさん
18/08/25 20:22:56.85 0r5h6/lL.net
まったくもって酷いことするヤツラがいるもんだ。。。
オレにはこんなことできない。。。
309:デフォルトの名無しさん
18/08/25 20:27:59.09 0r5h6/lL.net
シェルスクリプト総合 その28
スレリンク(unix板)
シェルスクリプト総合 その28
スレリンク(tech板) ← このスレ
シェルスクリプト総合 その29
スレリンク(tech板)
【POSIX】 sh系互換 シェルスクリプトスレ
スレリンク(tech板)
乱立しすぎてなにがなんだか
分からない
310:デフォルトの名無しさん
18/08/25 20:34:30.34 9woB+JG6.net
件の輩、ドザの工作員と考えないと説明がつかないw
ご本人に住み分けを含めて説明してもらわないと
311:デフォルトの名無しさん
18/08/25 20:48:45.32 2/0/KxdV.net
荒れてて草
312:デフォルトの名無しさん
18/08/25 20:50:34.20 tfF8aOe1.net
>>295
二度と来るな屑
313:デフォルトの名無しさん
18/08/25 23:23:09.52 zrQnMjpj.net
まぁこういうことがあるからワッチョイ導入しようってなったんだし
ここにきた選択は間違ってはいなかったな
314:デフォルトの名無しさん
18/08/25 23:44:11.66 9woB+JG6.net
ID:TgLfCzAb 抽出レス数:14
ID:9FNycoly 抽出レス数:1 → シェルスクリプト総合 その29
ID:A3V5N+C6 抽出レス数:3 → 【POSIX】 sh系互換 シェルスクリプトスレ
IDの流れ(ダブりなし)からすると、同一人物のようだね。
アラシは一人だったってことだ。
これは推測にすぎないが、UNIX板の件のスレも同一人物の可能性が高いと思う。
後は件のスレをスルーして沈めておくのが懸命かな。
315:デフォルトの名無しさん
18/08/26 00:23:54.30 +yQLo3Ss.net
>>980
次スレはワッチョイありで頼む
316:デフォルトの名無しさん
18/08/26 11:24:38.43 ylpyaNXE.net
>>251
JCLなつかしー
DD文でFORTRANのWRITE/READ文の装置番号と実際のファイルを対応させる記述すんだよね
だからOPEN/CLOSEなんて使わなかった
パソコンなら簡単なのにメインフレームは一々領域確保やらにゃならんから面倒だなと常々感じてた
317:デフォルトの名無しさん
18/08/26 15:08:48.37 r/93pdu8.net
つまりバッチ=シェルだけどシェルっていう人はすくないってことね
318:デフォルトの名無しさん
18/08/26 15:11:58.53 I24HoXLR.net
鬼才現る
319:デフォルトの名無しさん
18/08/26 15:24:35.78 rDVjwTPV.net
>>309
また荒らそうとしてるのね
320:デフォルトの名無しさん
18/08/26 20:22:58.07 r/93pdu8.net
じゃあパワーシェルはシェルスクリプト?
それともWindowsはシェルとはいわないってこと?
321:デフォルトの名無しさん
18/08/26 20:32:19.44 2bPBOKp2.net
もうお腹いっぱいです
322:デフォルトの名無しさん
18/08/26 20:35:06.42 qkCCtxHG.net
いっぱいすぎてゲロ吐きそう
323:デフォルトの名無しさん
18/08/26 22:12:44.18 93jd27LU.net
>>312
当然シェルスクリプト
cshと同じあつかい
324:デフォルトの名無しさん
18/08/26 23:10:38.66 ylpyaNXE.net
昔は仕事でバッチを沢山作ってきたけど
退職して、数十年、コマンドや、シェル一切忘れてしまった
再びシェルスクリプトやsed.awk,viリファレンス買い込んで復習中
昔はスクリプトといえば、Bshとawkしか知らなかったから、何やるにもawkスクリプトを何十行も書いてた
まあ、新規インストールの必要ないから客先の環境そのままでも動かせるから良かったんだけどね
大型のスーパーコンピュータで数十行のawkスクリプト動かすってのも何かシュールだったな
325:デフォルトの名無しさん
18/08/26 23:11:48.52 SztCjcZc.net
awkが入ってない環境とかある?
326:デフォルトの名無しさん
18/08/26 23:12:11.25 SztCjcZc.net
windows以外で
327:デフォルトの名無しさん
18/08/26 23:23:16.02 XxVIxjiS.net
URLリンク(pubs.opengroup.org)
ここを見るとtput colsおよびtput linesは標準で使えないと読めるのですが
POSIXに準拠した形で端末の幅などを取得するにはどうすればいいんでしょうか
328:デフォルトの名無しさん
18/08/27 00:43:08.11 6cDpYi8T.net
POISXコマンドであるtput使ってればいいんじゃないの
tputの仕様上は、端末(というかTerminalアプリというか端末エミュレータ)までは知らんってことじゃないの
tputの仕様/機能を満たすために後は勝手にやってくれってことじゃないの。で、当然勝手にやってる、というか、それも標準的な方法でやってるだろう(だいたいはtermcap/terminfoとかベースで)
329:デフォルトの名無しさん
18/08/27 00:48:50.05 QAQ5xX6o.net
でもOpenWrtにはtputないしなー
330:デフォルトの名無しさん
18/08/27 01:06:14.94 KUEVzuS1.net
POSIX 準拠かどうか分からんけど、
$ stty size
じゃだめなん?
331:デフォルトの名無しさん
18/08/27 01:12:42.77 QAQ5xX6o.net
sttyもOpenWrtではないなー
332:デフォルトの名無しさん
18/08/27 01:13:44.58 x5JZtbKK.net
URLリンク(pubs.opengroup.org)
URLリンク(www.freebsd.org)
URLリンク(man7.org)
なさげ?
333:デフォルトの名無しさん
18/08/27 01:14:39.85 x5JZtbKK.net
ID:QAQ5xX6o ただの知識自慢?OpenWrtって
334:デフォルトの名無しさん
18/08/27 03:20:49.11 y2YT/eYl.net
>>320
いえ すいません言葉が悪かったです。
POSIX標準としてのtputコマンドはあるのです。
URLリンク(pubs.opengroup.org)
しかし そのオプションとして“cols”や“lines”が記載されていないのです。
335:デフォルトの名無しさん
18/08/27 03:58:36.09 6cDpYi8T.net
直接、端末に問い合わせる
URLリンク(unix.stackexchange.com)
いちおう、POSIXコマンドオプション内ではあるな。まあ、端末種によって判断しのだけど、2つぐらいに集約されてんのかな?
C関数ではPOSIXのがあるので、ちっちゃいコマンドをCで書く
URLリンク(austingroupbugs.net)
らしい。時代を先取りして(?)気にせず >>322 を使う
336:デフォルトの名無しさん
18/08/27 04:54:02.59 6cDpYi8T.net
というか、
COLUMNS LINES でええやん
URLリンク(pubs.opengroup.org)
んなの設定してないっていうしょぼい環境だったら、しょぼいので設定してくださいって、ユーザに固定値でも設定させれば済むんじゃないの
337:デフォルトの名無しさん
18/08/27 05:14:12.97 y2YT/eYl.net
URLリンク(austingroupbugs.net)
↑このサイト初めて知ったわ。
ここで次期のPOSIX標準がだいたい把握できるんだな。
ところでxargsに-0オプションが付くかどうかってどうやって調べればいいですかね
338:デフォルトの名無しさん
18/08/27 06:47:11.21 QAQ5xX6o.net
>>329
実行してみりゃいいだろ。
xargsなんて副作用なく機能判定できる
簡単なコマンドだ
339:デフォルトの名無しさん
18/08/27 07:11:24.04 i3Gxv5eF.net
>>317
組み込み向けでわざとない環境を作ったりすることはあるけど、
普通はあると仮定して問題ないよ。
総ディスク容量10MB以下のベル研UNIX の頃からあるコマンドだから。
340:デフォルトの名無しさん
18/08/27 07:46:41.74 y2YT/eYl.net
>>330
いやそうじゃなくてPOSIX標準に取り込まれるかどうかってことです
findの-print0オプションはこの間採用されたものの
対応するコマンドでナル文字区切りのデータを受け取れて,さらにそれを区切りとして解釈できるものが
awkくらいしかない状況なので
多くの拡張実装(BSDやGNU)で取り入れられているxargsコマンドの-0オプションが
POSIX標準にならないかな というのが知りたいのです。
そしてその情報をどう入手すればいいのか今迄分からなかったんですよ。