シェルスクリプト総合 その31
レス数が1000を超えています。これ以上書き込みはできません。
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その30
https://mevius.5ch.net/test/read.cgi/tech/1561989867/ お約束
・特記なき場合、POSIX 準拠の sh 可換シェルが既定です。(Bourne Shellは既にレガシーです)
つまりシバンは #!/bin/sh です。
特定のシェル(bash, zsh, (m|pd)ksh, (d)ash, yash, posh, fish, (t)csh など)の専用機能に依存する場合は明示しましょう。
macOS (10.14以前), GNU/Linux ユーザー(Debian, Ubuntu 系以外) は /bin/sh の実体が bash なので*特に*注意
自覚なき bashism---シバンが #!/bin/sh なのに bash に依存する構文を使っていませんか?
ただし Debian, Ubuntu などでは /bin/sh の実体は POSIX sh 互換の dash ですのであまり気にしないでも大丈夫です。
FreeBSD ユーザーは /bin/sh の実体が ash なので注意。
Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。
macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。
android ユーザーは /bin/sh の実体が mksh なので注意。
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オプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな 初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりも Per lまたは Python の方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたら man(1) を引きましょう。
・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易に Perl や Python に逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
・例に対して、その例だけ動くコードを書くのはやめましょう。例は例です。本当に実現したいことを文章から読み取りましょう。 参考リンク
Bourne shellの種類とか歴史とかシェルの挙動とかいろいろ詳しい
https://www.in-ulm.de/~mascheck/ テンプレの「Version 7 UNIX の sh(1) に一番近い」ってそんな根拠ある?
むしろ「POSIX shを最もよく実装してる」ほうが適切な表現じゃね? >>7
Heirloom shのことだとして(意図的だろうけど)POSIX shではなく
レガシーなBourne shellに近いから「Version 7 UNIX の sh(1) に一番近い」なんだよ
つまり、Version 7 UNIX の sh(1) は Bourne shell。
具体的には ArithmeticExpression $((1+2)) や
Parameter substitution のうち ${p#foo} や ${p%bar} みたいな
POSIXの仕様を実装してない。 もちろん次点のdashはPOSIX shを実装してる。
「最も」かどうかはしらんけど >>8
いや根拠ある?(公式文書内の発表とかで。無い気がする。)
しつこくてごめんね。小さいことが気になる性格なの。
Most scripts that run in the Heirloom Bourne Shell will run with any Unix shell that is still in use in the twenty-first century.
http://heirloom.sourceforge.net/sh.html >>10
根拠を自分で考えるってことができない性格なんだねw Version 7 UNIX の sh(1)やHeirloom Bourne Shellが
「POSIX shを最もよく実装してる」という根拠はないよね
(公式文書内の発表とかでw) http://heirloom.sourceforge.net/sh.html
> Although the Bourne shell is not POSIX-conforming
意訳 The Heirloom Bourne Shellは POSIXと互換性がありません (あ、これ、いつもの人かな?推論能力が圧倒的に低くて、書いてある内容から
「ゆえにThe Heirloom Bourne Shellは POSIXと互換性がない」を導き出せない) >>14
ワロタw
お前のそれは「推論」じゃなくて「論理の飛躍」だよ かわいそうだから、せめて日本語訳にしてあげるね。
家宝ボーンシェル
家宝のBourneシェルは、伝統的なUnixシェルのポータブル変種です。
OpenSolarisコードから派生している ため、SVR4 / SVID3レベルのシェルを実装しています。
Bourneシェルは
・スクリプトの移植性テスト。
POSIX.2標準は既存のBourneシェルの動作と互換性のないシェルの要件を導入したため、
BourneシェルはPOSIX準拠ではありませんが、すべてのUnixシェルスクリプト言語の父のままです。
Heirloom Bourne Shellで実行されるほとんどのスクリプト は、21世紀にまだ使用されているUnixシェルで実行されます。
POSIX準拠でBourneシェルで使用可能なシェルスクリプトを記述するのは比較的簡単です。
・レガシースクリプトの処理。
いくつかの歴史的なスクリプトは、Bourneシェル独自の言語機能を使用していました。
それらをポータブルシェル言語に変換するのは難しい場合があるため、
Bourneシェルを使用して実行するのが便利な代替手段です。
・一般的なスクリプト処理。
Bourneシェルは、新しいUnixシェルほど多くの機能を提供しませんが、それでも非常に使いやすいスクリプト言語です。
また、Bourneシェルの言語は20年近く安定しており、この実装でも引き続き安定しています。
これにより、プログラマーが慣れ親しんだBourneシェルは驚くことのないスクリプト言語になります。
これは、新しいシェルの多くとは言えません。
・インタラクティブな使用。
Bourneシェルは、jshとして呼び出され 、端末で実行される場合、ジョブ制御を提供します。
もちろん、コマンド履歴、コマンドライン補完などの派手な機能はありません。しかし、これらの機能を使用すると、
ユーザーの注意をそらす傾向があります。慣れの段階の後、Bourneシェルを使用すると、
より均一で集中的な作業スタイルになります。試してみる。真剣に。 でも他人が同じようなことしたらムキーっとなってると言うよねえ >>7,10
derived from OpenSolaris code and thus implements the SVR4/SVID3 level
だから、Version 7 UNIX というのはいきなりっぽい
Version 7 UNIX の sh の重要性がまったくわからんが、SVR4 よりは重要、Version 7 UNIX の正当な流れを汲んだうちでの(ソースレベルで?)一番近いから、Version 7 UNIX としたんじゃないかな、そもそもソコを書いた人は
SVID3 は POSIX以前の時期での標準を作ろうとした規格のようなので、「POSIX shを最もよく実装してる」は無いんじゃないかな。SVID3とPOSIXの差異近似がわからんけど
あんま興味ない(使うことはないから)けどチラっと調べた範囲では。調べてもあんま興味わかないなw いや〜他人を怒らせないようにしてるんだけど
その当の他人がチガイだとどうしようもないなw 「ムキー!ボクの意見と違うことを言うやつなんて嫌いだー!」 >>24
> Version 7 UNIX の sh の重要性がまったくわからんが
それな。
「Version 7 UNIX の sh(1) に一番近いのは〜」を最初に書いた当時は
まだレガシーなシェルスクリプトが存在したのかもね
このスレ元々UNIX板にあったわけだし
Heirloom shも(世間がPOSIX準拠になりつつある中)
レガシーなスクリプトを処理するために作った書かれてるし
日付を見ると2010年の話?
一般に商用UNIXと呼ばれるもの(macOSは含めない)が
閉鎖的で情報が共有されなくて、質問されても誰も確認できないでしょ?
Linuxばかり使われるようになった。だからその文章も時代に合わない。
次からは修正しておくよ。 テンプレで質問
> ・ワイルドカードは正規表現ではありません。
みんなワイルドカードって呼ぶ? MS-DOSではワイルドカードって言ってたけど
なんとなく最近聞かない気がする。かと言ってグロブと呼ぶか?というとそれも詳しい人ぐらいしか
> ・思い通りに動かないときは、まずは sh(1) の -x オプションでトレースしましょう。
-xオプションと似たやつに-vってのがあるんだね。
みんな使ってる? 俺は使ってみるも、たくさん実行がでてきて面倒くさくて結局見なかったことにしちゃうw /bin/shの実体が/bin/bashになってる環境がなかったから時間がかかった。
今作ってやってみたけど、やっぱり、bashだとecho -n helloは
(POSIXにはない)-nを認識するね。
# which sh
/bin/sh
# /bin/sh
sh-3.2# ls -l /bin/sh
lrwxrwxrwx 1 root root 19 Aug 11 09:14 /bin/sh -> /usr/local/bin/bash
sh-3.2# sh --version
GNU bash, version 3.2.57(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
sh-3.2# sh
sh-3.2# echo -n hello
hellosh-3.2# exit
exit
sh-3.2# bash --posix
bash-3.2# echo -n hello
hellobash-3.2#
前スレ>>996はMacかな? (x86_64-apple-darwin18)って書いてるからそうだろうね。
Macの環境はビルドがおかしいのか時折変な動きをする。 ええぇ、自分でMacもって言ってなかったかな?
元レスの人のがが何かはわからないが、その可能性はなくもない、だったらの話だが
エアプで見栄であれもこれもと羅列しただけ?w へー、たしかに、macOS Mojaveのデフォルト(homebrewではない)のbash 3.2.57だと
echo -n hello が -n hello になるねw
これはひどいwww
なんでだろ。ちょっと調べてみるか。
その前に一言。だからPOSIX準拠で作れと言っただろー! それはお前の自説。うっかりだとしたらしょうがないで済む話 てか、自分で確認できるくせにいろいろ妄想吐いていたのどうすんの? >>31
デフォルトはHomebrewのbashに切り替えてるのでね。
まさかbashで同じバージョンなのに、Linuxで-nを改行なしオプションと認識して
macOSだと-nを解釈しないとは思わなかった。
まだぐぐってないけど、これ話題になってるんじゃね? /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ ああ、
>/bin/shの実体が/bin/bashになってる環境がなかったから時間がかかった
って。ああ、ツッコミどころ満載。わくわくしてきだぞw
そんなグダグダのヤツの傲慢な偉そうなご高説、誰が聞くかっw >>31
デフォルトと/bin/shは違うんですけど。/bin/shも書き換えてんのか。OSのアップデートで書き換えられるのに。まあ、ご自由にだから、いちおう信じてあげようw
でも、オマ環を理由にするのは情けないw
結局Appleが悪いにして自分のアホな妄想を否定するのはないんだな。さすがだよ >>39
× >>31
○ >>35
とりあえずあれだな。馬鹿な妄想で馬鹿にした自分が大馬鹿でしたと言いなさいw (macから書き込んでるからID変わってるかも)
まずmacの/bin/shはシンボリックリンクではなく、
またファイルサイズが違っているので /bin/bash と完全に同じものでは無いのがわかる
(おそらくビルドオプションの違いだろう)
$ ls -al /bin/sh /bin/bash
-r-xr-xr-x 1 root wheel 618416 5 4 16:04 /bin/bash
-r-xr-xr-x 1 root wheel 618480 5 4 16:05 /bin/sh
にもかからわず、同じバージョン番号を名乗っている
(ビルドオプションが違うだけだから当然ともいえるが)
$ /bin/sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
そして想像つく通り、echo -n の挙動が違う
$ /bin/sh -c 'echo -n hello'
-n hello
$ /bin/bash -c 'echo -n hello'
hello% だろ?そう言ってたんだけど。なに追試してんの?確認できてどうすんの?
Appleが悪いでうやむやに? >>39
デフォルトっていうのは、OSのデフォルトシェルの話じゃなくて
デフォルトで使ってるシェルって意味だよ。
bash だけで起動するシェル。ログインシェル。 ユーザ作った時のシェルもデフォルトシェルです。てか、そこはいいよ。信じてあげるって言っているんだから
そんなのじゃなくてな、もっと前にお前がレスしたのを始末つけろよ。なんで逃げる?w >>42
お前の理屈は、
1. 前スレ>>975は、Macを使ってるに違いない!
2. だけど実行したら動かないから、実行してないに違いない!
3. だから、うっかり #/bin/sh にしてしまったに違いない!
4. コピペもしてない!
という根拠ない想像に基づくものだろ?
俺の理屈は「普段から Macでecho -n を使ってる人なら
Macでecho -nが動かないのを知らないはずがない」から
普段、echo -n が動く環境を使ってる。というお前とは正反対の前提なんだよ。
だからecho -nの部分に書き間違いはなく
[[ ]] がbash依存であることを知らなかったという結論 いや、その俺の攻撃はいいから、お前のやらかしたのを始末つけなさい やっぱりどこでも動くシェルスクリプトなんて幻想なんだね… まあおかげでPOSIX準拠にするべき理由が一つ増えたじゃないかw
同じbashを使っていても、挙動が違う場合がある
POSIX準拠で書きましょう >>ID:++HFlOfG
なんで逃げる、やらかしたのは明らかだろう。カスなのか?
まあ、想像できるよ、常時偉そうにしたいんだもんな。普通のレス、単純なミスに対してもたかーいところからのいきなりなダメだしとか普通だもんな。そんなお前が自分の過ちを認めたらプライドがズタズタにでもなるんだろう
...カスだなw 宣言
今度から、echo -n を見かけたら、それはPOSIX準拠してないので
printfを使いましょうと書き込むことにする。 >>51
お前、文句言ってるだけじゃんw
やらかしてる部分はどこかを書けば、
やらかしてないという説明をしてあげるよ? >>49
異常だな。自分に強く言われたらすぐ反発するくせに。自分で何をどう言っているのかわかってないのか
てかそういうフリなんだろうな。>>51のままだな >>53
自分のレスを見直しなさい
自分の過ちがわからないのによく高慢に他人の過ちをあげつらえられるなあ
まあ、もうわかった。この繰り返ししかないだろうから、カスだと確定します http://hints.macworld.com/article.php?story=20071106192548833
> This is not a bug. As OS X 10.5 is now certified to follow the Single Unix Specification, its /bin/sh and echo builtin now follow the specification
なるほど。OSX 10.5から仕様変更されたっぽい。
これAppleがオレオレパッチ当ててるのでは?
bash標準ではなさそうな気がする。
流石にAppleのオレオレパッチまではしらんてw な?さっきから俺はシェルスクリプトの話題をしてる。
ID:k+c7cOcw は、俺の話題しかしてない(笑) 逃げるばっか。自分でMacも使ってるそのためにもPOSIXとかのたまってたのに 10.4まではmacOSのbashは-nを改行なしと認識していたそうだ
> In fact, I tried echo -n from bash and sh on my 10.4 system and my Linux system and in all cases,
> the -n was recognised as a switch. On both of those machines, /bin/sh and /bin/bash were identical (in fact, on the Linux box, /bin/sh was a symlink). >>57
俺はとうに終わってるもん。お前もその俺のレスにレスしてんですけど?さすがだな >>58
古いbashはLinuxで検証してるからね。
macでHomebrew使わないってありえんでしょ?
macではbashも古い3.2.57じゃなくて5.0.7を使ってるよ。 >>60
> お前もその俺のレスにレスしてんですけど?さすがだな
誰にレスしてるかではなくてレスの内容な。
お前は俺の話しかしてないけど、
俺は皆に役立つようにシェルの話をしてる。 >>57と言っておいて我慢できなくて>>62なのか?>>58もお前だけの話題だけど?そのレスもオマ環の説明って、お前だけの話題だろうw
オマ環でそういうことをしていても、macOS使ってるなら/bin/shがbashだとわかっているだろうに。なぜ/bin/shをbashにする環境作るのがとかのたまうのかわからん。たいした使ってない=Macももただ並べただけだなという「俺の印象」w
てか、そのオマ環を理由にするのは辞めなさい、いつもの高慢なお前には情けないw >>63
意味わからんwさすがだな。POSIX原理主義者はやっぱり変なヤツと思うことにするぞw ああ、やらかしたのをうやむやにするためにか...なるほど 確認取れた。やっぱり-nを改行なしと認識しないのは、bashの動きではなく
Appleによるパッチみたいだ
http://hints.macworld.com/article.php?story=20071106192548833 の下の方に書いてあるけど
COMMAND_MODE=legacy /bin/sh -c 'echo -n hello'
と書いたら-nを改行なしオプションと認識した(legacy 笑)
この COMMAND_MODE は bashの機能ではなくAppleが用意したもの
https://developer.apple.com/library/archive/releasenotes/Darwin/RN-Unix03Conformance/
macOS特有の動きだから、それを「bashでは」いうのはおかしいね。 >>64
お前が俺にグダグダ言ってる間に答えを見つけたよ。
オマ環じゃなくて、macOS環境
お前は、bashは-nを認識しない(そのまま-nと出力される)と言っていたが、
それが間違いだとわかったよ。
bashは-nを改行なしオプションとして認識するのは正しい。(俺が今までLinuxで検証していたとおり)
ただしAppleがビルドした改変版bashでは、 Single Unix Specificationに準拠するために
POSIXでは規定されてない-nをそのまま出力されるようになってる。
まあこういう違いがあるから、やっぱりPOSIX準拠は大切だね。 >>67
俺のレスをよく読もうな。書いてからお前がイチャモンwつけたんだからな
Macを持ってないとかならまだ許すが、自分で自らそのためにもPOSIXというひとつに挙げておいて、確認もせず、オマ環を自分で作ってそれも忘れ、
いろいろ忘れ、トンチキな妄想を吐いていたにもかかわらず、なかったことに&なにか知らんがwごまかしとしか思えないまったく真摯な態度が皆無なヤツです、いつもの高慢ちきは
と(改めてw)証明wできたので、満足しとくわw >>68
何を言いたいのかわからんが、現象は変わらない。そしてお前の間違いは変わらない
な?こういうやつだな、やっぱり >>64
> macOS使ってるなら/bin/shがbashだとわかっているだろうに。なぜ/bin/shをbashにする環境作るのがとかのたまうのかわからん。
お前、macOSしかbash動く環境知らんのか?
bashはGNUプロジェクトで作られたもので、GNU環境(例 Linux)が一番に確認すべき環境だろ
bashでの動きの話をしてるんだから、Linuxで検証するのが一番手っ取り早い。macOSの話を持ち出したのは「お前が」「あとからだ」
Debinaでは/bin/shの実体はdashなんだから、/bin/shの実体がbashの場合の挙動を確認するには環境を作らなければいけない
もっとも、macOSでは、/bin/shは/bin/bashへのシンボリックリンクではなく
本物のbashでもなく、Appleによる改変版bashだったわけだけど >>71
トンチンカンすぎるな。めちゃくちゃ。最後だぞw安心しろww
/bin/shの実体が/bin/bashになってる環境がなかったから時間がかかった
Macあるやん、macOS使ってお前ほどの自称知っている人なら知ってるハズだろ
だよ。なにをトンチンカンなことを。まあ、わかるよ、ごまかすのに必死なのは。アホらしい 相手は神様なんだから敬ってやれよ
> From: [36] デフォルトの名無しさん <sage>
> Date: 2019/08/11(日) 16:10:55.15 ID:++HFlOfG
>
> 現実世界では私は神なのだ >>69
> 確認もせず、オマ環を自分で作ってそれも忘れ、
前スレ>>975でコードが書かれてから
お前は「macOS環境のbash」とは一言も言わず、
bashの場合としか言っておらず、
>>996で書いた実行ログの中にapple-darwinという文字が含まれていたのを
俺が見つけたっていう事実を忘れてないか?w >>73
なにそれww
オモロイとおもって書いたのかな?マジだったらオモロイんだけど >>72
> /bin/shの実体が/bin/bashになってる環境がなかったから時間がかかった
> Macあるやん、
Macでは/bin/shの実体は/bin/bashではない。バイナリが違ってる。
ってさっき書かなかったか? >>75
それはその数個上のレスを見ればわかるよ。
「現実世界では俺は優れたプログラマ」(といわれても証拠ないしなーw)
とか言ってるやつがいたから、そいつに対するレス。 >>73
そのひとレスなのね。まあ、なんだ...まあ、いや、わからんwww
まあ、いいや この話スレ建てる前に知りたかったなー。
macOS (10.14以前), は /bin/sh の実体が (Apple改変版)bash なので*特に*注意
って書き直したい これはひどいwww
http://moriyoshi.はてなぶろぐ.com/entry/20090208/1234108045
> Leopard の「ターミナル」で、/bin/sh の echo -n がおかしい挙動を示します。
>
> sh-3.2$ echo -n foo
> -n foo
> sh-3.2$
> 分ったこと:
>
> /bin/sh は bash だが、/bin/bash とは違うもの
> which echo すると /bin/echo と言われるが、built-in のようだ
> iTerm から起動すると echo -n はちゃんと動く
> ターミナルで /bin/sh の echo は、iBCS2 コンパチとして動くのでしょうか?
> google しても解決方法は分りませんでした。ご存知の方は教えて下さい。(_ _)
> ...
>
> kzysk: なぜか iTerm は環境変数 COMMAND_MODE=legacy, ターミナルは unix2003 になっていて、
> その違いで sh 上の echo の動きがかわるらしいです。 やっぱりどこでも動くシェルスクリプトなんて妄想なんだねw POSIX準拠を意識してない未熟ものにとってはそうなんだろうな POSIX準拠を意識している者にとっては、-nが使えないとか
想定の範囲内だからね。yashとか使えないわけだし。
だから最初から-nを使うぐらいならprintfを使ってる。
POSIX準拠でコードを書いてる人にとっては何ら問題ないわけ 俺が偉く見えてしまうのは、あんたの主観だから俺にはどうしようもないw >POSIX準拠を意識してない未熟もの
不特定多数が含まれるというのがわからないのね
さすがあれだけアホ晒しても僕偉い人ww すげえよっ、さすがあれだけアホ晒しても僕偉い人ww脳の中身理解不能 なんでスレ進んでたのかと思ったらまたはしゃいでたのか 神様なんだろ。許してやれ
(しかしネットは怖いな。やらかしたことがほぼ一生残る。) 揚げ足というか、単に普通の失敗(理解不足)なんだけどな。
謝らないのが問題だった。
素直に謝罪しておけばよかったものを…。 Mac特有の挙動(UNIXの要求に合わせるためにAppleが独自で変更してる)なのに
それに気づかないで、bashでは-nに対応してないって騒いでたんだっけ? そう。挙句の果てに、Macでテストしてなかった
お前が悪いとか言って荒らし始めた。 自分に都合が悪くなるとすぐ韓国とかよく分からんこと持ちだして話を逸らすあたり,
これは重症っすね……。 これは人が離れて行くのも無理はないな
・自分の誤りを絶対に認めない
・人間関係は上下の主従関係のみで平等の概念がない
どこかで見たことあるような...おや、誰か来たようだ たしか前スレでも、質問してる側が下なんだから
回答する側に対してへりくだれ的なことを言ってたよな これだな。平等の概念がない
609 自分:デフォルトの名無しさん[sage] 投稿日:2019/08/07(水) 12:45:25.69 ID:WK8NJ3/V [18/28]
>>608
回答者のほうが偉いみたいな考え方。
質問者と回答者は対等です。
610 返信:デフォルトの名無しさん[] 投稿日:2019/08/07(水) 13:00:34.72 ID:9POPBXN5 [8/13]
>>609
対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。
君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。 またこいつは朝からシェルスクリプト「ではない」話をしてんのか そうせざるえないほど酷い人がいるからね。
このスレの住人は結構優しいんじゃないかな。
人格欠陥者を罵しったり無視することは簡単だけど,
その欠点を皆で指摘してくれるなんてかなり貴重だと思う。
まあどうせ当の本人は自分に対する攻撃としか捉えず,
都合の悪いことには目を塞ぐ能力をフル活用して目を翥すんだろうが。 bash 依存だけどこんな関数を作って使ってた事もあった
function _join {
local IFS="$1"; shift; echo "$*"
}
bash$ _join , {1..10}
1,2,3,4,5,6,7,8,9,10 いくらID変えても同じ言動なのがいよね
欲を言えばコテを付けてくれれば処分しやすいんだけど ていうか3スレくらい前からワッチョイ導入しようという話がチョイチョイ出てはいる。 >>104
それをbash依存にしないのは簡単だよ
localの代わりにサブシェルを使えばいい
_join {
(IFS=$1; shift; echo "$*")
}
ちなみにlocalはPOSIX準拠じゃないけど、
local もしくは localと同等のことができるtypeset のどちらかが
POSIX準拠シェルのすべてに(おそらく)搭載されてるから
2パターン作ることになるが、サブシェルを使わずに作ることも可能
面倒だからOLDIFSに対比させるのが楽だけどねw _join () (IFS=$1; shift; echo "$*")
でいいんじゃね >>108
その書式、使えないシェルがあるんだよ。 IFSを使う場合はデリミタに1文字しか使えないので
その後はこんな↓ふうに書き直した(けど最近は全く使うことがない)
function _join {
local d="$1"; shift; printf '%s' "$1"; shift;
printf '%s' "${@/#/$d}"; echo;
}
$ _join '->' {{1..4},5,{4..1..-1}}
1->2->3->4->5->4->3->2->1 あ、でも今調べたら相当古いbashだけみたい。ならいいか shellcheck のような書き方を指導する奴で
POSIX準拠の書き方でないところをチェックするツールでもあるのか?
滅茶苦茶詳しすぎる >>110
それをbash依存なくするにはループだろうな
たぶん誰でもわかると思うのでコードは省略w
local変数使わなくても行けるかも
>>112
shellcheck 以外だと使ったことがないけど shfmt
・・・でチェックできるのか知らない。使い方がよくわからないw
shfmtという名前を忘れたのでぐぐったら bash依存チェックするツールがあったよw
https://sourceforge.net/projects/checkbaskisms/
https://github.com/openstack/bashate
俺はもうだいたい覚えたね。POSIX準拠の書き方を調べたと言うよりも
とあるシェルで動かない。なんでや?POSIX準拠じゃないんかい。の繰り返しで。
だからPOSIX準拠だけど、シェルのバグで動かないっていうのも頭に入ってる。 あ、たぶん>>112の疑問に答えてないw
なんで古いbashで動かないのかがわかったかと言うと
古いバージョンのシェルをビルドしたテスト環境を用意していて
単に実行して確認しただけの話。 $ ksh -c 'echo $KSH_VERSION'
Version AJM 93u+ 2012-08-01
これのAJMはなんだろう?と思ってググったけど、
コンパイル時のオプションってことでいいのかな?
https://www.in-ulm.de/~mascheck/various/shells/ksh_versions.html
After "Version" now there is a concatenation of letters indicating compile time options:
A SHOPT_AUDIT /* keyboard logging */
B SHOPT_BASH /* bash compatibility code */
L SHOPT_ACCT /* accounting */
M SHOPT_MULTIBYTE /* multibyte character handling */
Jはこれ?
J SHOPT_COSHELL /* job pools */ 前スレでboshのビルドができないと言っていた人へ
2019-08-13版でビルドできるようになってます。
2019-06-13 OK
2019-07-15 NG
2019-07-22 NG
2019-08-13 OK POSIXで定義されてるbatchとかatとかって使ってる?
俺は可搬性を失なう覚悟でcron使ってるけど pythonで mycron.pyを書いた
python さえ動けば >>117
atは昔使ったことがあるけど、覚えてないレベル
batchは使ったこと無いな。
POSIXなんだよな。なんでかPOSIXの範囲にこんなものを
含めちゃっていいのか?って気がしてるw ん?cronはPOSIXじゃないけど、crontabはPOSIXなのか?
これはコマンドは決まってるけど、それを実現しているものは決まってないってことなのかな? >>120
多分manと同じ感覚なんじゃないかな?
manというコマンドは決まってるけどroffの仕様は決まっていない。 >>119
SCCSまで含めようという動きがあるんだから
ジョブ管理くらいあってもおかしくないw
それがPOSIXにほんとうに定めるべきコマンドなのか
っていう疑念は拭えないけど。 いつまでも完成しそうもない開発系?のツールなんかより
dateとかsortとか基本形のコマンドのオプションを拡張すればいいのに
だからいつまで経ってもMacのコマンドは貧弱でhomebrewでcoreutilsを入れなければいけなくなる
LinuxをバンドルしたWSLは便利になった。 単に拡張すりゃいいってもんじゃない。
どのシステムでも使えることを優先すべき。 >>123
> dateとかsortとか基本形のコマンドのオプションを拡張すればいいのに
それな。 date +%s がPOSIX準拠じゃないとかびっくりやわw
unix timeどうすりゃいいねん。 >>124
拡張っていうか仕様の標準化だな
POSIXScript2020 とかいう仕様を作って
各社に対応を促す。
新POSIXScript2020に準拠していれば
どこでも同じように動く >>126
それに対応することによる各社のメリットとは? ていうか言語仕様の素早い更新・機能追加が好きならPython使えば?
過去互換性も同じくらい重視したいならC#-shell >>127
なんのためにPOSIXが出来て、みんなそれに対応してると思ってるの? >>130
当時と現在の状況の違いが理解できない理想主義の人? 現在ってまだPOSIX改定されてるでしょ?
歩みが遅いことを批判するのは正しいが、
そこにPOSIXはもういらないっていうのは、
POSIXの存在を否定してるよ。 >>132
POSIX要らないって少なくともこのスレでは誰も言ってないけど
いったい誰と戦ってるの? >>127と戦ってるんだけど?
結論としては、POSIXは必要で、POSIXは改定されてる。
新しいPOSIXに対応する各社のメリットがわからないなんてなw /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ 文体がちょっと違うから危うく荒しに構うところだった。
いつものチガイか。 >>134
POSIX要らないとか一言も書いてないのだが
なんか変な妄想にとらわれてる人なの?いつもの >>137
そっちじゃないよw
新しいPOSIXに対応するメリットがわからないんでしょ? シェル単体の交換可能性を担保したところで出来ることはたかが知れてる。
システムとして実用的なレベルまで規格拡張しないと使いものにならない。
現状のPOSIXは最低限のI/F仕様を規格化するだけの中途半端な規格だ。
将来的にネットワーク、ハードウェア管理、セキュリティなどシステムとしての仕様が標準化され、全てのシステムがそれに準拠するまでは、POSIXに固執する必要性は無いと言っていい。
もちろん、可能な範囲で可搬性を追求することは間違いではないと思うぞ。現状では限界があるということだ。 現実として問題になってるのは、半ば当たり前のように書かれる
Linuxで動くコマンドが、macOSで動かないことだよな
ググって、なるほどこれでできるのか、って思ってもmacOSで動かないのは問題 >>139
POSIXはシェルだけを決めてるものじゃないよ。
コマンドとそのオプションも決めてる。 >>141
シェル「だけ」とは言っていない。
ここはシェルスクリプトのスレだから、シェルについて言っている。
POSIXについては>>2を読めば分かる。 >>142
主張がよくわからないんだけど
「シェル単体の交換可能性を担保したところで出来ることはたかが知れてる。」から、
現状のPOSIXは中途半端で、もっといいものにするために新しいPOSIXを
規格化するべきだって言ってるってことあってる? POSIXのような標準はそう簡単には変更できないだろ。バージョンによるになるから
そして、ツールを作るのは大なり小なり思想があってやっているんで、言うようなできる最大のものに合わせるなんてなりっこない
文句なり言うなら、POSIXにではなくBSDに言う方が現実的だし、文句言うくらいな自分で実装してBSDに上げればいいだろう。上げても却下されるとかあるかもだがw
言っているのは単にWebで探した事例がLinuxでBSDだと動かないってのだけだもん >>144
難しく考えすぎでしょ。すでにある実装を採用すればいいだけ
思想なんかは、既に実装されてる時点で問題ないということだし。
POSIXにではなくBSDに言う方が現実的というけどBSDの現状知ってる?
すでにgreadlinkとかgtarとか結局GNU版を実装しちゃってるの。(その逆は聞かない)
そういう二重開発をなくすためにも、今の実装(の一部)をPOSIXにしてしまうべきだと思うね >>145
その採用がだよ。やりとり見てみ。はいそうですねでは進んでないから
それはいらないとかふつうにあるぞ。POSIXに限らず
何言ってるの?単にBSDにGNU coreutilsのパッケージがあって、それが入ることもあるってだけだよ。gって自分で付けて気づかないの?GNU coreutilsが入っているのが嫌という人も居るようだけど >>146
> はいそうですねでは進んでないから
? 思想とかなんとか困難な道を乗り越えて見事、採用されたものを
POSIXにも入れればいいだけって言ってるんだけど 何を言いたいのかさっぱり
BSDも標準では入ってないぞ GNU coreutils は。何かそれを必要としたパッケージがあってそれにともないだろう
パッケージは誰かが作ってそれなりに利用されるのならわりと簡単にだぞ?パッケージだからな。必要な人は入れるというだけの ・POSIXに準拠することにはメリットがある
↑これは俺もそう思うけど(正しいかどうかは別にして)
・今のPOSIXでは不十分なので,規格を拡張して,各社にそれを追従するよう促すべきだ
↑これは違うと思う。POSIXの「不便さ」は「どこでも動く」ことの引き換えであることを忘れてはいけいない(ルポ風) cat >>149 | sed -e 's/いけいない/いけない/' やっぱりどこでも動くシェルスクリプトなんて幻想なんだね。 Write once, Bug anywhere. >>149
でも「今のPOSIXでは不十分なので,規格を拡張して」は
遅いながらも今のPOSIX団体がやってることですよ?
POSIX団体がやってることを批判するんですか? bashで長いシェル書いてるといつもたくさんファイルを生成してしまうんだが上手い具合に生成しなくて済む方法ってある? >>155
どっかからデータをとってくる
raw_file(最初)
user_file
user_and_id_file
format_file(完成形)
めっちゃテキトーに書いたけどこんな感じで4つぐらい作られてしまう
rmで消すのって有りなのかな はぁ? と言われましても、
無駄なら無駄なところをなくせ、必要ならそうするしかないで終わるんだが?
それじゃ全く何もわからないよ >>156
参考になりました。ベストアンサーあげます >>149
おれは、促すまではいいと思うが、こんな所での妄想レベルの機能なんか
促されたからってそうホイホイ実装しないだろうと思うんだな >>160
人の話ちゃんと聞こうぜ?
誰も妄想レベルの機能を言っちゃいない。
既に実装済みの機能をPOSIXで標準化しようって話をしてる。 pasteで処理の結果をくっつける方法ってありますか?
処理A、処理B、処理Cの計3つでファイルを作成せずにくっつけたいです。 Xxx <(Yyy) <(Zzz)
こんな感じのがあったような? >>162
pasteは複数のファイルを受け付ける
pasterは標準入力からも受け付ける
この二つのどちらかまたは両方を使えばでできるでしょ? >>163
BashやZshに依存してもいいならこれ。 pasteは複数の標準入力を受け付けるみたいね
printf '%s\n' a b c d e f g | paste - - -
a b c
d e f
g
だから処理A、処理B、処理Cをそれぞれ1行ずつ
出力できるならくっつけられるね。 あとは処理A、処理B、処理Cの順でデータを出力するなら、
それぞれ変数に入れといて、1行ずつとりだすとか。
まあできなくはない。 >>167
> BashやZshに依存してもいいならこれ。
どこでも動かないのはPOSIXに>>163が入ってないからだね >>154-159
一時ファイルとか、メモリ内ファイルとかは? >>162
あ、nlとsort使えばいけるじゃん。
(
処理Aを出力 | nl -i3 # 1, 4, 7 と行番号をつける
処理Bを出力 | nl -i3 -v2 # 2, 5, 8, と行番号をつける
処理Cを出力 | nl -i3 -v3 # 3, 6, 9, と行番号をつける
) | sort -n | paste - - - | 行番号を削除
これでできないかな?
行番号を消すのは、nlの-sで区切り記号をつけられるから、
cutかsedでやればいいかな? 1行目が1ってわかってるから、
行番号の文字数もわかるので、あとはどうにかw こんな感じかな?
a() { printf '%s\n' a b c d e; }
b() { printf '%s\n' A B C D E; }
c() { printf '%s\n' 1 2 3 4 5; }
{
a | nl -i3 -v1 -s:
b | nl -i3 -v2 -s:
c | nl -i3 -v3 -s:
} | sort -n | cut -d: -f2- | paste - - -
出力
a A 1
b B 2
c C 3
d D 4
e E 5 そのsortって安定だっけ。
じゃなかったら処理結果が入れ替わるおそれない? >>174
安定になる条件と行番号の関係について
考えてみようか? POSIX sortだと-s(=stable sortのs)オプションが提供されてないので
どう足掻いても安定にはならんな。
「たまたま」順番が変化しない場合もあるやもしれんが。 なんで重複しない行番号の順にソートして並びが入れ替わるんだよw シェルスクリプトってテキストファイルこねくり回すくらいしかできないんだよな バイナリファイル扱えるスクリプト言語ってある?
Pythonとか? シェルスクリプトでバイナリを扱いたければ
odを使うしか無いだろう。
zshはNULLを扱えたはずだが、
bashやそれ以外はNULLを扱えない。
例のawkおじさんは、awkスクリプトで頑張ってるようだが
もちろんあれはシェルスクリプトではない >>182
扱えるというのはバイナリファイルの編集ができるってことだよね 無知ですまんがAWKおじさんってだれ?
なんか否定的な書き方だけど悪名高いコテハン? >>187
自称シェルスクリプトで色々頑張ってる人。ググればわかる。
悪名高いコテハンではないが、俺的にはあのセンスが受け入れられない。
色々頑張ってるが、コードを見るとawkスクリプトを
シェルスクリプトで生成して、メインの処理はawkで
実行してるのでダサい odの他にhexdumpとかでもできるがhexdumpはPOSIXじゃない。
あとbase64もPOSIXじゃない。
あとは出来る可能性があるとすれば uuencode だけど
あれを処理するのは難しいだろうな。 >>187
> なんか否定的な書き方だけど
別に否定はしてない。awkもPOSIX準拠だから物自体はいいけど
シェルスクリプトじゃないよねって話 >>189
あぁ、この人のことか。ありがとう。
なんかQiitaかどっかでメチャメチャ喧嘩腰のコメントしてた記憶があるわ。
https://qiita.com/richmikan@github/items/5158eac47467d8a29056
↑ここのコメントとかかな。
言ってることは正しいのかもしれんが、ちょっと品性に欠けるなぁと思った。 >>190
実はBase64はPOSIXの範囲でも(簡単に)実現できる。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
によればuuencode -m /dev/stdoutこれでほぼbase64コマンドと同じ挙動になる。
ていうか/dev/stdoutってPOSIXで規定されてないのにその肝心の公式が仕様書内で
/dev/stdoutを使っちゃっていいのかねw >>193
base64をしたいんじゃなくて、base64コマンドはPOSIXじゃないって意味なんだけど
その文章の読めなさ、相変わらずやなw POSIX、POSIXとか言ってるやつも、AWKおじさん並みのKitty。 Base64を実現したくはないのにbase64コマンドが必要な状況ってどんなのだろう…? 今シェルスクリプトでバイナリを扱う話してたろうが
そういうとこやで ふぅ。アスペに説明しても理解できないかもしれんが(他の人は理解できるだろうから書くけど)
1. シェルスクリプトはテキストを扱えない。という話が発端 (>>180)
2. バイナリを扱うにはどうするか?→バイナリをテキストに変換するコマンドを使えば良い
3. POSIXの範囲ではodが最適。hexdumpやbase64コマンドはPOSIXではない
ここまではまともな流れ。
なぜかBase64を実現したいことだと勘違いする>>193
(バイナリ→テキストを実現するための)base64 "コマンド" の話だというと
なぜかBase64を実現したくないのにとか、斜め上のことを言い出す>>196 こいつ素でやってるのか?w
会話の流れがまともだって言ったら、
今度は主張がまともと言ってるんだと読み間違えやがったw
まあ確かにそのとおりではあるが、
文章はそう読めるはずがないよな >>201
そんでsortの何が安定なのかは分かったの? >>204
あんた最後になにもレスしてないよね?
お前が間違っていましたってことで終わったの?w 176 名前:デフォルトの名無しさん[sage] 投稿日:2019/08/20(火) 08:24:06.78 ID:Gkd3xMH4 [2/10]
POSIX sortだと-s(=stable sortのs)オプションが提供されてないので
どう足掻いても安定にはならんな。
「たまたま」順番が変化しない場合もあるやもしれんが。
177 自分:デフォルトの名無しさん[sage] 投稿日:2019/08/20(火) 08:37:08.94 ID:JOMXhFk+ [2/2]
なんで重複しない行番号の順にソートして並びが入れ替わるんだよw
178 名前:デフォルトの名無しさん[sage] 投稿日:2019/08/20(火) 12:54:26.88 ID:/fB0Ptq3 [1/2]
>>176
「安定」の意味分かって書いてる?
179 名前:デフォルトの名無しさん[] 投稿日:2019/08/20(火) 13:41:04.53 ID:tzbk8R3g
安定の書き込みクオリティ ここで、終わったって自分で言ってるから、
ここで\(^o^)/オワタなんだろうなw お爺ちゃん怒りの3連レス。そんなに熱くならなくてもいいのに。冷房がもったいないw 思ったんだけどbash依存するのってなんの機能を使いたくてbash使うの?
bashだけにある機能の事なら知ってる 別に使いたいわけじゃなくて、ぐぐったらそれがbashスクリプトだったってこと?
じゃあそのbashスクリプトを書いた人はなんでって話になるけど 訂正
× そのbashスクリプトを書いた人はなんでって話になるけど
○ そのbashスクリプトを書いた人はなんの機能を使いたくてbashを使っているの? bashしか使わない人がbash依存して何か問題あるのかね
シェルに限らずLinuxしか使わない人が「Windowsでも動く」プログラムを書く必要はないし
(シェアの低い変なコンピュータ使ってる人はその人だけ苦労すればいい) > bashしか使わない人がbash依存して何か問題あるのかね
問題ないよ。なにを目的にbash依存してるのか聞いてるだけ >>218
>>217って言ってるだろう
bashを使い他を使うこともないから、わざわざ他を意識する調べることがないってことだろ >>219
bashのなにかの機能を使いたくてbashにしているわけじゃないってこと?
配列とかbashにしかないなにかの機能を使いたいからbashを使ってるんじゃないの? 大多数はそんなこと気にしてないだろう
配列使うにしてもシェルスクリプトで配列使えるか調べ、現在使ってるシェル(大多数がbashだろう)で使えればそう使ってるだけだろう なんかそれだとbashにする理由はないのに
bash依存してるって言ってるように見えるなw 逆でもあるだろうに。それで問題ないなら問題ないだろに
てか、>>217って言ってるのをを未だに理解できないの?理解したくないの? 結果的にbash依存になっているが当人はそんな事を意識していない、って感じ >>223
君が質問に答えないからだよ
質問
> 思ったんだけどbash依存するのってなんの機能を使いたくてbash使うの?
結論
特になにかの機能が使いたいわけではないが、動いてしまったからbash依存になっただけ そう>>217が言っているんだがな。なにか文を変えたいだけか?それもいやらしく
いつのもやつか、やっぱり >>224
そうそう。そういう感じの答えが欲しかった。
(便利だから)特定の○○の機能が使いたい
or 理由はない
そういう答えを期待していた。 bashの機能のうち、これは絶対欲しいっていう機能は
あまりないってことなのかな? 最初から「bashの便利な機能」を聞いてるのに、
思いつかないなら無いって言わないから話がこじれるんだろう。 bashの便利な機能ってのが何を聞いてるのか曖昧だからな
kash,zshなどでも同じくあるのではないあくまもでbash独自の機能なのかなんななの曖昧
シェルスクリプトに限らずスクリプトに限らずマルチプラットフォームを意識するかどうかの話にならざるを得ないだろう という話をして欲しいんじゃなくて
(あんたが思う)bashの便利な機能を聞いてるんだよ 思いつかないなら、無いって素直に言えばいいじゃん。言い訳ばっかり ksh,zshなどでも同じくあるのではないあくまもでbash独自の機能なのかなんなのか曖昧
bashの便利な機能もどっちにしろそれが使えないとわかった時に気がつくものだろう。もちろんそんなに便利でもないのもあるだろうけど >>231,232
ksh,zshなどでも同じくあるのではないあくまもでbash独自の機能なの? >>233
POSIXにはなくて、bashにしかない機能。
kshやzshの話は聞いてないので無視して良い
これで質問に答えられるよね? 配列w
readのオプション
他にもあるけど、すぐに思いつかない、便利と意識して使ってるわけではないからな。空気と同じだよ あまり便利だとは思わないけどよく使ってるのは "&>" と連想配列(declare -A) ほんと質問に答えさせるのに何レス消費させるのかw
配列、連想配列、readのオプション、"&>"
これぐらいか? 自称「神様」のきまぐれなお遊びに付き合ってやってるんだ
ありがたく思いやがって下さい >>235といい質問に「答えさせる」といい、なんか見えすぎなんだけどな
どしたの?
あんたの意図がわからんからだよ。何をしたいの?いつもの負けん気だけか?
bashの便利な機能もどっちにしろそれが使えないとわかった時に気がつくものだろう
って言ってるんだけど。だから空気と同じと言っているんだがなあ >>240
俺のことなら違う。俺は>>204だったりするんだがなw >>244
やっぱりsortのおじちゃんじゃんw
安定の意味わかったの?
どうして行番号順にsortしてるのに、
並び順が変わると思ったの?
まだその答え聞いてないよ >244
おお...違う違うwなんて間違いを
俺は>>209だったりするね
>>242
あんたの意図がわからんからだよw 意図がわからないなら、意図がわからないから教えてといえば良い >>245
ノリでそのレスしたのか、嬉々としてそのレスしたのか、嬉々としてならすまんかったw >>247
そこに噛み付いている意味がわからない
会話として楽しんでいるんだからいいんじゃないの?みなさん(?)は
とか言ってみるw 可搬性を求めるならPOSIXで書く。
テキストこねくり回す程度のものなら書ける。
可搬性要らないor自分の環境で動けば良いなら好きに書けば良い。
bash,zsh依存でOK。ちゃんとシバン書いてな やっぱりどこでも動くシェルスクリプトなんて幻想なんだね。 初めて触れたRH8も、Cygwinもbashだったから、
今でもふつうにbash使ってるな。
それにしても、bashはなんでこんなに嫌われてるんだ?w ま、bashがデフォルトシェルじゃないOSもそれなりにあるもんな いつかカーソルキーのないキーボードを使うかも知れないから常にHJKL使えってvimスレの仙人が言ってた >>258
Emacs使いはHJKL使わないってじっちゃんが言ってた >>257
Webサイト向けだが、UbuntuとDebianをあわせて59.7%がbash拡張の無いdashだからね
https://news.mynavi.jp/article/20190701-851849/ >>256
bashがデファクトスタンダード的なもんだからな。採用の多さから
ksh,zshなどと置き換えても同じことだったりしてるからな、単なる象徴的な名称としてだけだろう
あとは/bin/shがbashな場合にイマイチな仕様だったりするとこか あとmacがbashをやめてzshになるらしいので、それなりどころか
過半数以上がbashを使わなくなりそう。
まあmac版のzshはbashと互換性があるように
デフォルトオプションを変更してそうな気がするけど
shwordsplitとか
>>258
bash以外を使うことがないって言いたいんだろうけど、その例えは的外れかな
現に多くの人がbash以外を使ってるわけだから あ、そういやWSLもUbuntuだっけか。他のディストリも使えるけど
そう考えるとdash使ってる人、かなりいるな。 >>261,256
訂正。bashを嫌ってる人はいるみたいだった。理解できんw >>264
bashコードなのに#!/bin/shを名乗るなってことでしょ?
Ubuntu/Debianでdashが採用されたのは
パフォーマンスがいいかららしい。
https://wiki.archlinux.jp/index.php/Dash
> 実行速度が速い。Bash などのシェルに比べて 4倍高速 に動作します。
その際にbash依存しているのに#!/bin/shを使われていたから
変更するのに手間がかかったって言われてるね。
あとセキュリティもbashよりもdashのほうが高そうだし。bashは今も機能加えてるから新たに脆弱性が生まれてくる可能性も高い。
https://ja.wikipedia.org/wiki/2014%E5%B9%B4%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF%E8%84%86%E5%BC%B1%E6%80%A7
> 2014年9月に公表されたBashについての一群の脆弱性(CVE-2014-6271 [1] 等)の発見は、
> 俗にシェルショック(Shellshock)、バッシュドア(bashdoor)と呼ばれている。
> 関連して6つの脆弱性が登録された。 なんかいきなりdash推ししているのがいるが>>257のいうデフォルトシェルがソレを指しているのって疑問
>>256なんぞからはデフォルトシェルはログインシェルのことを言っているのかと思ったけど
ちなみに大好きなPOSIXでググってみたが、デフォルトシェル=ログインシェルだなあ。引っかからなかったなにかがあるかもだが、引っかかったのがpasswd関連んとこだけというのもあり >>266
ログインシェルがbashでも
(UbuntuやDebianでは)#!/bin/shはdashだから >>263
Ubuntu on WSL だと、デフォルトシェルはbashになる。
chshしない限り、WSLではbashのままの人が多いだろうな。 >>268
ここでデフォルトシェルの定義がどうこう言っても無意味だっていう話
https://wiki.ubuntu.com/DashAsBinSh
> Why was this change made?
> The major reason to switch the default shell was efficiency.
デフォルトシステムシェルのことを
デフォルトシェルと呼んでる例なんていくらでもあるんだから >>269
> Ubuntu on WSL だと、デフォルトシェルはbashになる。
話通じてないなw
その人が書くシェルスクリプトの一行目には、どうせ #!/bin/sh って書くでしょ?
デフォルトログインシェルがなんであろうが、
デフォルトシステムシェルは dash になるんだよ。 >>271
ああ、そいういうことね。
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 7月 26 2018 /bin/sh -> dash* 誰かがデフォルトシェルと言えばそのデフォルトシステムシェルのことだと言っていたからなあ
流れ的に同じこと言っているなと。そんな話はしてないんじゃねえのってとことだな >>266
> ちなみに大好きなPOSIXでググってみたが、デフォルトシェル=ログインシェルだなあ。
POSIXが/bin/shについて語ることはあっても、
/bin/bashについて語ることはないと思う
POSIXの世界のシェルには/bin/shしかないのでは? "default shell" というのはあるんだよ。そしてそれを指しているのはログインシェルっていう
なにか問題でも?ログインシェルをデフォルトシェルと言っても何も差し支えがなく間違いでもないってことだな、POSIXでの文章でそうなんだから
そして、ログインシェルの話をしていたって>>269で明らかになりましたってとこで俺は満足してますがw >>274
> POSIXの世界のシェルには/bin/shしかないのでは?
そうなの?
20年くらい前のbashの解説書 "bash Manual & Reference" には、
Bourn Shell(sh/bsh)をPOSIXに準拠させるために書き直したのが
Bourn Again Shell(bash)というふうに書かれていて、
そういうもんだと思ってたわ。 >>275
うん、だからそこでデフォルトログインシェルの話をしたって意味がないでしょう?と言ってるわけ。
重要なのは /bin/sh の話だよ。
#!/bin/bash と書いてbashスクリプトを書くのはいいけど
#!/bin/shと書いていながらbashスクリプトになってるから嫌われているわけで ふーん
食いつき&その後レスからそうとは思えないけど、まあそういうことでいいよw >>276
POSIXの世界にbashが出てくることはない。の反証として
bashの世界にPOSIXが登場したと言っても、それは反証になってないよw bash bash bash
fish and bash >>278
なんでそう、本当は納得してないけど
納得してあげました風の言い方をするかな?w
最初から書いてるんだけど↓
265 自分:デフォルトの名無しさん[sage] 投稿日:2019/08/21(水) 19:45:33.15 ID:/hAWXHxO [4/10]
>>264
bashコードなのに#!/bin/shを名乗るなってことでしょ? >>281
ああ、いつものだなってとこだなw
ログインシェルをデフォルトシェルと言っても何も差し支えがなく間違いでもない
というのがわかった|わかっているようなので、まあいいよってとこだよ
まさしく、その最初からも読み違いとしか思えないけど、まあそれもw >>282
ふーん、まあそういうことでいいよw
↑このレスにムカついた?
それがあんたがやってることだよ。 ムカついたのね。まあムカつくように書いたんだけどwなぜかはひみつww あーあ、とうとう反論はできないから、
ムカつかせるためだけにレスをしたって認めちゃったw
そういうとこやで なんの反論????いきなりすぎて意味わかりません、なんの反論すればいいの?????
ちなみに、>>276は「そういうもんだと思ってた」と言っているように反証でもなんでもなく、困惑しているんじゃないかなあと思ってみたり bashコードなのに#!/bin/shを名乗るなってことでしょ?
ということが最後の話となった ,. '"´ ̄ ̄ ̄ ̄``ヽ、
/::::::::::::::::::::::::::::::::::::::::::::::\
/::::::::::::;.: --─---─-、:::::::::::::ヽ
./::::::::::::/ィC¨ヽ \:::::::::::l
/:::::::::/ └¬'´, ィC¨ヽ';:::::::::!
./::::::::イ / ,. ヽ `¬┘';:::::::!
l::::::::::::l /ハ ハ } ヾ::::j
{::::{⌒l:! / ` ' ヽ V}
. ';:::l ゝリ l ,/ ̄¨ヽ ', }l
ヾヽ__j { {,. -−‐‐ヘ {,l
ヾ::::| i ヽ ヽェェェェェノ {
}:::l ヽ ` ̄¨´ ノ }
ヾ;k \_ __ ,/ }
"|  ̄ ̄ ̄ ノ
_,. -‐"\ フー-、_
'"´ `ヽ、 / ┼ヽ -|r‐、. レ |
d⌒) ./| _ノ __ノ
---------------
制作・著作 NHK >>291
あぁ、反論っていうのは、これに対する反論だよ。 これって言うのは、これね
> bashコードなのに#!/bin/shを名乗るなってことでしょ? >>257
> ま、bashがデフォルトシェルじゃないOSもそれなりにあるもんな
bashがデフォルトシェルじゃないOSってなに?
流石にWindowsのことではないと思うけどw いや、OSもそれなりにあるもんなっていうから
そのOSはそれなりに使われてるんだろうなと思ってね。 誰もそんな話はしてないと思うし、俺は最初ので触れているんだけどな
誰かみたいに「名乗るな」とか言わなけどw
てか、続けんのかよw自分の言ったことを忘れすぎだろう
あら、あら、まあ。いつものだな。終わりますww あぁ、デフォルトシェルっていうのは、
デフォルトシステムシェルってことか
https://wiki.ubuntu.com/DashAsBinSh
> Why was this change made?
> The major reason to switch the default shell was efficiency.
↑この文脈の「the default shell」
それならたしかにたくさんあるわ デフォルトシステムシェルっていうか
システムが使うデフォルトのシェルっていうべきかな? macOS10.15でzshに変更になるって話、/bin/sh は結局何になるんだろう?
zshかな?って思ってたけど、dashの可能性もあるのかな?
ここ読んで知ったけど
https://scriptingosx.com/2019/06/moving-to-zsh/
ログインシェルに /bin/dash を選べるようになってるらしい。
https://support.apple.com/en-us/HT208050
(homebrewの話ではないよ) やっぱりどこでも動くシェルスクリプトなんて幻影なんだね >>301
その
https://support.apple.com/en-us/HT208050
How to test your shell scripts
If you change /var/select/sh to a shell other than bash, be aware that scripts that make use of bashisms may not work properly.
からはbashっぽいかなあ。変わった直後でもあるmacOS10.15では >>305
行番号が付いてるから、安定以前に並ぶ順番が入れ替わることはない。
> POSIX sortだと-s(=stable sortのs)オプションが提供されてないので
とか言ってるやつが間抜けでした。
(いつもの誤読ばっかりしてるやつだろう)
で終わりじゃない? だよなw
あと、sortはヤツじゃないだろう。もしかして俺?俺でもないぞw bashrc zshrc みたいなところに alias 書くと
シェルスクリプトで bash,zsh依存の書くとaliasまで読まれてしまう
\Xxx のようなバックスラッシュを全部に付けるのは読みにくい
alias 全部切る宣言ないか? >>312
なんかおかしいぞ
aliasはシェルスクリプトには伝搬しない。
現在のシェルにのみ反映する。
例えば、zshでログインして#!/bin/shのシェルスクリプトを起動することを
想像すればなんとなくわかると思うが、別のプロセスになるんだから
zshと(zshではないかもしれない)別のプロセスとaliasが共通になるわけがない。
. (source)でカレントプロセスに読み込むならaliasが働くけど
それはシェルで使うaliasまで全部初期化するってことになるぞ(それでいいんだろうけど)
なんか勘違いか変なことをしてる気がする。 たまたま関連することをやっていたので気づいたが
zshって設定なしでも以下のaliasを作ってるな
run-help=man
which-command=whence
これを何に使ってるのか知らないけどunalias -aをするとそれが消えてしまう あんまりbashと関係ないけど
直前のmacのターミナルのログってどっかに自動保存されてたりするもんなのかね >>318
vscodeでよくない?
そこに書いてあるの、全部できるでしょ? あ、そうなの?
使ったことないから知らなかったよ。 vimでもvscodeでも自分が好きなの使えばええがな VSCodeは「沢山の機能から自分の欲しいものを選びたい人」向けで
Vim含めUnixツールは「少数の機能から自分の欲しいものを作りたい人」向け。
どっちも利点欠点があるけど,俺は後者かなぁ。 > Vim含めUnixツールは「少数の機能から自分の欲しいものを作りたい人」向け。
vimを使う人は、vimの機能を作るのが目的の人ってこと?
本末転倒って言葉知ってる? Vimは基本的にファイラーとかないから、シェルに移ってコマンド操作しつつ開発するのが普通
なんで、TmuxとかScreenとか併用する
ソースコードのフォーマッターだとかリントみたいなのも直接、間接で外部コマンド叩いて使う 聞いたことないで?
「unix 本末転倒 誉め言葉 」
検索結果 約 5 件 (0.35 秒) >>327
atomはMSの息がかかってないから使っていた人が多い。
githubをMSが買収してしまったので、あえてatomを使う理由もなくなった。
vscodeの方が洗練されてるよ。 あー俺はvimmerだからw
vscode悪くないけどviキーバインドがイマイチ
exコマンド使えんのがストレスで里帰りしたわ テキストなら、vim
Ruby, Julia なら、VScode で、
グラフなら、Jupyter Notebook UNIX哲学こそ正義(GNUのlsやsystemdから目を背けながら) ていうかGNU lsもsystemdも「Unix環境で使える」というだけで「Unix哲学に基づいてる」とは標榜してないしねぇ。
ま,俺は別にUnix哲学が絶対的正義とは思ってないけど。
ただ自分で作るツールはUnix哲学とユーザビリティを両立させるべく努力してるけど。 単機能のコマンド
標準入出力という共通インターフェース
それらを組み合わせて処理する
この思想を最初に知った時は感動したな
Small is beautiful. パイプが強烈なので他の言語のときもできるだけフィルターで機能するように書いている
Xxx の言語で書くと import use require ... ができるのは Xxx の言語でかかれたコード
しかし、パイプを開いて | ./Yyy arg1 arg2 ... とすれば
Yyyは任意の言語で大丈夫
シェルスクリプトが背景にあるのは間違いない 何にせよ「ベンダ形式に依存しない」というのが遥か昔に実現できていただけでも評価できる。
今だとテキスト形式より表現能力の高いJSON,更に高いXML with NS & XSDがあるのものの
それらが無い時代によくも思い付いたなと。 パイプとJSON, XMLを比較するとはね。
ヘリコプターと日本語を比べて云々するようなものだ。 パイプとJSON, XMLを比較するとはね。
チンコとペニシリンを比べて云々するようなものだ。 単にデータフォーマットの話でしょ?
昔は行指向が普通だったからCSVが良く使われたな。
今でも使うけど。Cはcharacterね。
それからXML,JSON,YAML,TOMLと規格が増えていった。
PowerShellはオブジェクトをパイプに流せるんだよな。 行指向はデータ処理がすぐに行えるって利点があるんだよな
XMLは全体を<xml>でくくるという仕様だからデータが全部揃って
タグが終了するまで処理できない。大きなデータをストリーミングで
受け取りながら処理していくということに向いていない。
ドキュメント専用と考えたほうがいい。
同じ問題はJSONにもある。ただしJSONLならJSONを使いつつも
行指向になってるからJSONを使いながらも行指向的なデータ処理が行える。 >>345
そうそう。
PowerShellは「パイプ」という概念はそのままに,
流すアイテムをテキスト形式からオブジェクト形式に変更したんだよね。
もっとも,PowerShellはインターネットでググってるだけじゃあまり情報は出てこないし,
>>342 みたいに「パイプ」と(パイプに流す)「テキスト形式」を混用してしまうのも無理はないけどね。 混用してるのは>>341
>>340-341を再掲。
340 デフォルトの名無しさん sage 2019/08/23(金) 20:24:40.67 ID:GCcQKmFF
パイプが強烈なので他の言語のときもできるだけフィルターで機能するように書いている
Xxx の言語で書くと import use require ... ができるのは Xxx の言語でかかれたコード
しかし、パイプを開いて | ./Yyy arg1 arg2 ... とすれば
Yyyは任意の言語で大丈夫
シェルスクリプトが背景にあるのは間違いない
341 デフォルトの名無しさん sage 2019/08/24(土) 00:25:49.01 ID:AZIGFNIF
何にせよ「ベンダ形式に依存しない」というのが遥か昔に実現できていただけでも評価できる。
今だとテキスト形式より表現能力の高いJSON,更に高いXML with NS & XSDがあるのものの
それらが無い時代によくも思い付いたなと。 >>346
そうだね。
XMLとかマークアップ系はタグ閉じるまで処理できないからストリーミングには向かない。
パーサーに食わせて必要な要素取り出すのが常道だね。 ベンダ形式に依存しない?
psコマンドのオプションと出力フォーマットを見てから言え nodejs使いならawkwardというシェルが面白い
コマンド出力をオブジェクト配列に変換してforEachで回せる >>351
なんの為のPOSIXだと思ってるんだw そりゃおめーを笑わす目的じゃなくて俺が笑う目的で書き込んだんだからなw
つまらないのは当然 https://www.weblio.jp/content/%E3%81%A4%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84
B とりあげるだけの価値がない。取るに足りない。下らない。 「 − ・ないものを買ってしまった」 「 − ・ないうわさ」 〔「つまらないものですが」などの形で,相手に贈る品物を謙遜していう場合にも用いられる。「−・ないものですが,召し上がって下さい」〕 >>355
自分が笑われる目的で?
なんとも自虐的な奴だなw 再掲してやろうw
> From: [36] デフォルトの名無しさん <sage>
> Date: 2019/08/11(日) 16:10:55.15 ID:++HFlOfG
>
> 現実世界では私は神なのだ
さっさとsortコマンドの話に答えろよw >>361
答えたで? >>173にコード書いてあるやろ? >>361
なんで、>>75のレスって書かないの?
そしてほんとうの意味を書かないの?
>>75
それはその数個上のレスを見ればわかるよ。
「現実世界では俺は優れたプログラマ」(といわれても証拠ないしなーw)
とか言ってるやつがいたから、そいつに対するレス。 簡単なシェルスクリプトならコピペせず書けるようになったけど他にも言語覚えた方がいいのかしら
sedにgrepにawkならかなり世話になってるけどpythonやrubyとは無縁なんだわ
シェルはbashに篭ってても困らんしな いいからシェルスクリプトの話をしてくださいよ
じゃまですよ 仕事で使ったことがある言語縛りで言えば、
Ruby、JavaScript、Java、C、C++、Python、C#、Perl、PHP、VB6
これぐらいかなぁ? >>368
perl5は相性が良い ワンライナーで簡潔だし
sed awk より強い正規表現が使える >>373
授業でVB、html、C、java、javascriptを齧っただけですハイ
表計算の方がまだガッツリ書けるわ sedは使うが、awkまでは使いこなせない。
代わりにperlのワンライナーで賄っちゃう。 PerlはWebサーバーも作れるスクリプト言語だからな。 やっぱりシェルスクリプトの利点は
Linux/Unix系ならどんな環境でも最初から入ってるという点と
普段プロンプトから入力しているものと同じコマンドで動くという点だと思う
そのメリットが、メリットにならないような場面では他の言語がいい 短かく書けるプログラミング言語なんて
ジョークではなく実用的なのでさえごまんとあるんだから
あんまりシェルスクリプトの特筆すべき魅力とは言えんだろう >>378
「何をやりたいのか」の方が重要だな
それによって言語が決まる perlは便利っていうが専ら正規表現専用機になってる
ほぼsedとして使えるんでつい perlで使える正規表現文字クラスは、
POSIXの正規表現文字クラスより簡単に書けるから、
sedより楽といえば楽だよね。 GNU sed だとコンパイルオプションを追加すれば PCRE が
使える(-R オプション)らしいな perlの存在を知る前から\dや\wは使ってたからこれが使えねぇって言われた時は焦ったわ
正規表現入門では当然のようにperl版を使うけど正規表現の種類までは解説しないからな
基本だの拡張だの方言があるって知ったのはvimやgrepで悩んだ時だし sed は n で次の行に簡単に飛ばせるのが使いやすかった
もっとも多くの行送りは読みにくいので過信できないが perlでは[\s\S]でほぼ同じことができるけどね C言語とシェルスクリプトの対比・協調について
「シェルスクリプトは文字列処理がある程度得意で
キャラクタによるユーザーインターフェースを作るのに向いている。
一方C言語は↑このような操作は不得手であるが
素早い数値計算やシステムAPI呼出しは向いている。
だからインターフェースはシェルスクリプトで書いて
シェルスクリプトで適切に処理した引数(例えばヌル文字を削除したり数値だけにしたり)
をC言語をコンパイルしたプログラムに渡すようにすれば
「早くて堅牢、かつ使いやすい」システムができる」
こういうのってどの程度正しい? 言語なんて色々有るし、C言語と対比しないほうがいいのでは? >>397
どこから突っ込んでいいか分からないくらいピンぼけな文章 20年前からタイムスリップしてきたんだ。許してくれ 可読性が高く、CUI が作りやすい言語は、Ruby。
テキスト処理・コマンド作り・1-liner も得意
ただし、Rubyは遅いから、
ベクトル演算などを速く処理したいなら、C言語で作った、NArray ライブラリを呼び出す
その速さは、数値計算専門言語のOctave にも匹敵する! スクリプトの中で起動速度が一番速いのがシェルスクリプト。次がPerl。
その次はPythonとPHPが同着ぐらい。
Rubyはひときわ遅くて、シェルスクリプトの50倍。Python、PHPの3倍遅い TwitterはRuby on Railsで書かれていたがScalaで書き直した
それは大量のトラフィックを捌き切れなくなったからだ
パフォーマンスの問題を解決しない限りは
死んだと言われても仕方がないな もう10年以上前だけど、Twitterの開発者が何かのインタビューでScala移行した理由としてRubyは自前で型チェックを大量に記述しないといけないから、JavaやScalaみたいに型を指定するほうがいいって気づいたみたいなこと言ってた
海外のプログラミングサイトみたいなやつで、当時少し話題になったけど、探せばまだ見つかるかも すごいわかる
動的型付け言語使ってユニットテストで型チェック書くのギャグかよってぐらい馬鹿げてる 静的型付け言語の時代になったな
Scala,Rust,Swift,TypeScript...
パフォーマンスチューニングに労力使いたくないよな ちょっとperlを覚える気になったけどなんで書きやすいやすくて読みにくいのか分かったわ
記号で変数の使い分ける時点でダメだった
正規表現さえ出来ればいいんだけどPerl6の展望ってどうなんですかね Rails 6 では、DHH のいるBasecamp 社から、GitHub へ移籍した、Eileen Uchitelle が、
複数データベース接続(read replica)と、ブラウザによるE2E の並列テストを実装した
最近のRailsは、大規模用
Basecamp, GitHub, Shopify 社などが中心。
日本では、Cookpad, マネーフォワード、Ruby開発とか
初めてのJavaScript 第3版 ――ES2015以降の最新ウェブ開発、オライリー、2017
この本は、10年以上やってないと、難しすぎて読めない。
だから、サーバー側をNode.js に変えることは難しい
同様に、Go も難しいから、現時点では、Ruby になる! シェルスクリプトと同じぐらいの速度とブログで読んで
perl6の処理系が高速化するまでは導入延期予定
速度さえなんとかなれば併用するつもり 新型の正規表現クール
---
perl5 の正規表現は
(?{perl-code})
(??{perl-code})
などがあるから使えると便利 まあ考え方次第なんだけどね
$や@を使うことでスカラー変数と配列変数と連想配列変数を厳密に区別できて、違う型の変数に代入できなくするっていう
Perl6は更に進んで、静的な型指定をできるようにしようって、2000年代前半の時点で今のPHPとかJSがやろうとして方向に進んでたんだけど 定期的にruby布教しては信者を得られず帰っていく
逆効果だと思うんだけどなw >>416
末期の日本軍みたいよな。
日本生まれのRubyがその生みの親と同じ末路を辿るとはあまりに悲しい皮肉よ 日本軍は現場を知らない奴が出世して参謀とかになってるからおかしいことになった
自分は死ぬ気が無いのに他人に市ねと命令するクズ
rubyの人は現場で手を動かしてる分、かなりマシ その肝心要の現場でRubyが動いてないって話をしてんだよなぁ… ム版でここまでヘイトを集められるのはある意味ユニークスキル 貴様ら!大日本帝国陸海軍を愚弄するか!
Ruby如きの比喩に使うな馬鹿者が! ここ以外にプログラミングについて活発に議論してるとこってある?
QiitaとかTwitterみたいなとこじゃなくて匿名でかしこまってないのがええ >>421
今の日本では馬鹿の象徴だよ?帝国陸海軍 大失敗の象徴としてだろけど、Rubyと絡めるのは意味不明
なんであれどういうものであれ批判するヤツ、アンチはことさら大げさに言うのが定番のだろう やれやれ、じゃあまた俺がシェルスクリプトのお題でも出してやろうかね? じゃあいつもとは趣向を変える
Bourne ShellとPOSIXシェルの違いを教えて下さい。 Bourne ShellとPOSIXシェルの違い、教えてくださらぬか? 日英両対応のクリップボードへのコピーとペーストの部分どうしてる?
cygwin Linux mac などを
uname | grep "CYGWIN" > /dev/null && do-something
のようなかんじの分岐を copy_to_clipboard paste_from_clipboard で考えている
そして コピーのときに
cygwin だと > /dev/clipboard
linux や mac だと別の何かになる
本当は perlモジュールの Clipboard が OS の差異を吸収してくれる予定だったが
日本語だけはうまく処理してくれないから半分車輪の最発明ののようなことになった そんなことやろうと思ったこともないんだが、
どうやってSSH越しにクリップボードに入れられるんだ?
それシェルの機能なのか?端末の機能では? SSH 超しじゃなく、ポータブルなコードが欲しかった
環境によってクリップボードのアクセス違うから
Xxx | copy_to_clipboad
paste_from_clipboard | Yyy
のように書けたら楽じゃないか? macはpbpaste/pbcopy
linuxはxselかxclip コピペしたいとか思わないからなぁ。
コピーはともかくペーストしたいわけでバイナリのペーストもなくはないけど
通常は出力したテキストのペーストでしょ?
ファイルに書き出せばいいじゃんって思っちゃう。
まあ別にコピペを否定したいわけじゃなくて、やろうと思わないなって話。 Cygwinならclip.exeを呼び出せばいいんじゃない >>438
clip.exeはペーストできない
cygwinは/dev/clipboard クリップボードみたいなGUIに強く依存した(例えば画像や装飾のある文章を切り貼りできる)機能は
なかなかOS間・ベンダー間で協調したり標準化したりするのが難しそう。
素人考えだが。 httpみたいにMIMEを流用すればいいんじゃないの?
扱えないタイプはぺっすればいいんだし 一個人がアレコレ妄想するぶんには訳ないけど、各々のベンダーが顧客の体験を変えることなく(つまりインターフェース面での過去互換性を最小限にして)
「ぼくのかんがえたさいきょう」のクリップボード仕様を採用してくれるとは到底思えんがね。 クリップボードってそのままのデータをやり取りするIPCだろ IPCというならだよ。プロセス間通信という感じではない、言うような共有メモリだな
どのプロセスが書いたのか知らん知ってるフォーマットのデータを読むだけだし IPCは共有メモリ、セマフォ、パイプなどのプロセス間通信の総称なんだが 共有メモリは広義にはIPCに含まれるだろうが、通信ではないし、クリップボードはプロセス間通信ではないな
共有メモリを使ったプロセス間通信はあるだろうけど、クリップボードがプロセス間通信かと言えば違うだろう。パイプはもろにプロセス間通信という
クリップボードってそのままのデータをやり取りする共有メモリだろ
でまさしくだし、それでいいんじゃね 共有メモリは広義にも狭義にもプロセス間通信なんだが
プロセス間でデータをやり取りするための機構だ プロセス間でデータのやりとりさえできれば、通信するプロセス間の関係性即時性一時性なんて全く関係ないのもプロセス間通信と思えるならそうだろな
そもそもプロセス間通信をするために用意したのが共有メモリだと思うよ。共有メモリを使うから=プロセス間通信ではないだろうとは俺は思うけど。ファイルシステムもIPCになる感じになるな、そのままのデータをやり取りするなら コピペは重要な機能なのに、標準化されなかったから
vimからemacsへのコピペすら出来ない IPCの意味調べてこいよ
オレオレ定義を語られても困るんだけど 自分でも共有メモリと言っているのに、IPCに拘る方がわからんわ
クリップボードがIPCと言われると違和感しかないな。ファイルシステムもになるからw言っている意味がわからんのならIPCとはなんのためになんぞやを調べた方がいいよ 調べてきたぞ。そのうえで意見は何も変わらん。
なにか言いたいなら、自分の口で言いたまえ
つーか俺が不利になることを俺が調べると思ってんの?w 言われるまでもなく知ってるよというのを匂わせていたんだけどww
プロセスがどのプロセスが(読むか読まれるか知らんけど)書く、どこぞのプロセスが誰が書いたのか知らんのを読む
対象が共有メモリだからIPCとでも言っているようだけど?だからIPCとはなんのためになんぞやを調べた方がいいと言っているのだが 共有メモリに関数(プロシージャー)をおいて
呼び出すのがI(インターネット)P(プロシージャ)C(コール)なわけだが? ちょっと訂正
プロセスが(どのプロセスが読むか読まれんか知らんけど)書く、どこぞのプロセスが誰が書いたのか知らんのを読む
クリップボードってそのままのデータをやり取りする共有メモリだろ
でいいだろうに、なんでIPCのこだわっているのかさっぱりわからんな 馬鹿二匹
馬鹿1「俺のほうが知ってる。お前調べてこい。そして俺に教えろ。」
馬鹿2「俺のほうが知ってる。お前調べてこい。そして俺に教えろ。」 割り込んで良い?
Bourne ShellとPOSIXシェルの違いを教えて下さい。 うーーんメーカー規格と標準規格で中身はおんなじとか まーーーた始まった。
しかも今度はシェルの話題ですらないw >>466
知らんけど
いわゆるBourneシェルはUnix V7あたりの「古き良き」シェルを指す?
でPOSIXはそのBシェルと前後して登場していた種々のシェルの微妙な非互換性を埋めるべく
Unix V7が全盛だった頃よりもっと後になって登場した「実装のない」シェル?
だからPOSIXシェルというのは正確にはPOSIX準拠シェルで
POSIX準拠シェルにはBシェルで使えない機能もある。具体的には set -o <機能の長い名称> とかかな?。
Bシェルが動いてる環境にPOSIXに準じた書き方をした筈の(つまり「現時点での」最大限の互換性がある筈の)
シェルを持っていっても,動かない場合がある。
POSIXはBシェルを大いに参考にはしたかも知れないが,Bシェルでも動くようにとか,
ましてBシェルと過去互換であるようになんてことは念頭に置いてない。
どうっすか先生。 >>467 >>469
あー、なりたちとかそういうのじゃなくて
何が出来て何が出来ないとか機能的な話です。 Bourne Shellの仕様がないと比べようがないんだが? >>473
ソース公開されてるから自分で読みなよ
何甘えてんだよ やっぱりだれもBourne Shellの仕様を知らないのかな? だって「いつの」「どのOSに搭載された」「どんなベンダーが配布していた」Bシェルか一切指定されてないからね。
候補は幾つかあるものの出しようがない。 まさかと思うがBourne Shellが絶対不可侵,永久不滅の存在だなんて思ってないよな。
円周率じゃないんだから,単に「Bourne Shellの仕様」と言っただけで特定できる訳がない。
「Windows XPの仕様」←これがどれだけ曖昧な言明か,ちょっとでも真面目に
プログラミングとその文書化に取り組んだなら分かる筈。 「Solaris 10の仕様」「Unix V7の仕様」←「Windowsのことなんてシラネーシ」みたいな反論を先に封じておくために
Windowsでない例を挙げておこう。 POSIXって右と左で中身がガバガバだから作られた最低限の共通仕様じゃないのか
無人島じゃ家電は役立たずでもアーミーナイフならどこでも使える的な >>478
言い訳してるようにしか見えんが、
特定できないというのなら、一例としてお前のよく知る
○○と仮定して答えりゃいいやん >>480
POSIX準拠シェルの説明としては間違ってないが、
Bourne Shellとの比較であれば、POSIX準拠シェルの方が機能が多い
POSIX準拠シェルを「最低限の共通仕様」というのなら
Bourne Shellは最低限の仕様すら満たしてない使えない実装 最低限の共通仕様と言ってるだろ、最低限の仕様じゃないよ >>478
複数の機能の複合体のWindowsXPと、もう誰もいじってないBourne Shellを
同列に並べるあたり、必死に言い訳をしてるようにしか見えんなあ >>483
だからBourne Shellは「最低限の共通仕様」を
満たしてないんだってば Bourne ShellをベースにBourne Shellの機能を満たすように作るだろ、最低限でも
Bourne Shellの機能に飽き足らず拡張した部分の最低限の共通仕様だろ
最低限の仕様といえばBourne Shellの仕様だろ Bourne ShellはPOSIX準拠じゃないから「最低限の共通仕様」を満たしてないんだってば POSIXが出る前POSIXを作るときの話だよ。Bourne ShellはPOSIX準拠じゃないってズレすぎ
Bourne Shellに機能拡張した部分の最低限の共通仕様だろって言ってるだろに
そもそもだな、つっこみどころが違う、「(右と左で中身がガバガバだから作られた)共通仕様」なのか?と思うけどw 「最低限の共通仕様」ってPOSIXのことじゃないの? Bourne Shellに機能拡張した部分の最低限の共通仕様=POSIX
「Bourne Shellに」「機能拡張した部分の」「最低限の共通仕様」だって言ってるだろに
Bourne Shellありき
どこのぞのバージョンが、それに a b c etc... な機能を追加
どこのぞのバージョンが、それに b c d etc... な機能を追加
Bourne Shell + b + c = POSIX
という意味だろう>>480のいう最低限の共通仕様は >>487なんて変なこと言い出さずに、それを言えよw だからBourne ShellはPOSIX準拠じゃないよね
でいいんでしょ なにをそんなに食い下がっているのか意味わからん。なんの意味があるのそれに?
(そんなこと言い出すのはアホか?としか思えんぞw、常識的にPOSIXなんて存在する前のにPOSIX準拠もなにもないだろう) なんでPOSIXが存在する前の話になってるのか分からんけどねw 「POSIXって」「右と左で中身がガバガバ」「だから」「[作られた]」
って書いてあるだろう
わざとなのかわざとじゃないのかわからんが、人のレスを読む努力はした方がいいぞ
そうしたら変なこと言い出さずに変なこと言ったことを誤魔化すような醜態はさらさないだろうw そのレスは読めないなw
俺のレスが読めなくてのとしか思えん ごめんなさいって言えば良いのになんで突っ張るかねぇ >>488
> Bourne Shellに機能拡張した部分の最低限の共通仕様
それ日本語になってないだろ?w
自分が言った言葉を無理やり辻褄が合う(?)ように改変したから
そういう意味不明な言葉になってるんだぞ >>491
> POSIXはkshをベースに作った仕様だけどね
Bourne Shellではなくkshをベースに作られたんだな ん?
Bourne Shellに機能拡張した部分の最低限の共通仕様
Bourne Shellありき
どこのぞのバージョンが、それに a b c etc... な機能を追加
どこのぞのバージョンが、それに b c d etc... な機能を追加
Bourne Shell + b + c = POSIX
という意味だろう>>480のいう最低限の共通仕様は
どう、日本語になってないの? >>477
> 候補は幾つかあるものの出しようがない。
候補が有るなら出せるのでは?w
後方がいくつか有るというのなら、その候補を言ってみなよ。
その中で最後に作られたもの(or 一番機能が多いと思われるもの)に
すればいいだけだからさ >>502
Bourne Shellに機能拡張した「部分」
の部分とはどこの部分?
その「部分」の「最低限の」「共通仕様」がPOSIXなんでしょ? >>505
書いてないから言ってる
「部分」=○○
という形で言えばいいだけ
はいどうぞ b と c があって、その部分の
最低限の共通仕様がPOSIXなわけね つまり、Bourne ShellはPOSIXには含まれないと ああ、違う、違う読み方してんのか??
どこのぞのバージョンが、それに a b c etc... な機能を追加
どこのぞのバージョンが、それに b c d etc... な機能を追加
なんぞの共通の最低限の共通仕様だからね >>510
ん?
Bourne Shell + b + c = POSIX
って書いてるんだけど? > なんぞの共通の最低限の共通仕様だからね
お前「部分」って言ったよね?
Bourne Shellに機能拡張した部分(b+c)の最低限の共通仕様 それに a b c etc... な機能を追加
a b c etc... なんぞは部分だわな > b と c だよ
言質とりましたーw
Bourne Shellに機能拡張した部分(b+c)
(b+c)の最低限の共通仕様がPOSIXだって言いましたー なにを喜んでいるのか意味わからんな。どこになんの言質?? Bourne Shellに機能拡張した「部分」が(b+c)だって言質とりましたーw /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ まさか、POSIXとは (b+c)のことだって言ったと言っているわけじゃないだろうね?
Bourne Shell + b + c = POSIX
って書いてあるだろう。POSIXとはこれのことだと言っているのだろうとは俺は言っているけど。それも俺の主張ではなくて>>840の言いたいことはだがなw >>521
× >>840の言いたいことは
○ >>480の言いたいことは
いい加減長いw >>521
だから
「Bourne Shelに」に「機能拡張した部分(b+c)」の「最低限の共通仕様」=POSIXだろ >>523
長くてもいいよ。
見てて面白いからもっとやれ。
どうせこんな場末のスレなんてチガイ同士の喧嘩かスクリプトくらいでしか活気付かないんだから。 >>526
で、って最初から言ってる。
日本語になってないと。 >>527
だから、どうなってないのかと聞いているんだが? >>529
Bourne Shellに機能拡張した部分(b+c)の最低限の共通仕様 がPOSIX
↑日本語になっていない
↓正しい日本語
Bourne Shellを機能拡張したシェルの共通仕様がPOSIX
まあ↑は日本語としては正しいが、言ってることは間違いだけどな
正解
Bourne Shellを機能拡張したkshのサブセットがPOSIX その俺のからはその添削後の意味は取れないのね?ふーん
まあ、それならすまんかった。(なんかそうとは思えんけどw) まさにこれw
499 名前:デフォルトの名無しさん[sage] 投稿日:2019/09/01(日) 04:22:29.76 ID:5y1tL0M+ [2/2]
ごめんなさいって言えば良いのになんで突っ張るかねぇ いや、言ってるけど
そこまで読めないのか?というのは拭えないというだけで で、話を戻そうか?
>>477
> 候補は幾つかあるものの出しようがない。
候補が有るなら出せるのでは?w
後方がいくつか有るというのなら、その候補を言ってみなよ。
その中で最後に作られたもの(or 一番機能が多いと思われるもの)に
すればいいだけだからさ 忘れているかもしれないけど、
Bourne ShellとPOSIXシェルの機能の違いはなにか?
という話です。 やっぱりどこでも動くシェルスクリプトなんて幻想なんだねw 昨日神保町の本屋でこんな本みつけた。ペラペラの薄い本で妙に安い(300円+税)。内容は初心者向け。
シェルスクリプト入門の入門
http://ankokudan.org/d/d.htm?detail230-detailread-m.html UNIXの分裂とかも、こんな不毛な言い争いから始まったんだよなw こんな場末の記事でしか偉ぶれないなんて,かわいそう。 こんな場末のスレで煽りしか入れられないなんて,かわいそう。 >>546
自分を可哀想だと言い始めたら、人生終わりだよ もしかして >>546 って >>545 に「言い返した」つもりなのかね。
ヤベーなw Bourne ShellとPOSIXシェルの機能の違いはなにか?
という話はどうなりましたか? Bourne ShellとkshだったらBourne Shellの方が有名だろ?
何を持って適切と言ってるのか知らんけど 有名だから聞きたいんだよw
UbuntuとDebianの違いはよく書きれても
UbuntuとLinuxfxの違いなんて気にしないでしょ?
言われて初めて、へー、そんなのあったんだーレベルだから >>553
$ bash -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
10
$ ksh -c 'unset a b;echo 10|read a;let b=a+10;echo $b'
20
$
どっちがPOSIX的に正しいの? ほぅ…
$ bash -c 'unset a b;echo 10| { read a;let b=a+10;echo $b; }'
20 パイプの右側がサブシェルになるのかどうかはPOSIXで規定されてない
どちらも間違いじゃないが、bashの動きのほうが多い bash --posixでもうっかり配列は動く悲しみ >>562
多いとは?
POSIXshellはksh派生なのに動きが違うのがなんとも >>564
bash, dash, mksh, yash, posh が同じ動き
ksh, zsh が同じ動き >>564
POSIXシェルという実装は存在しない
だからkshの動きはPOSIXシェルの仕様通りと言える
bashはPOSIXシェルそのものではない。 >>566
「kshの動きはPOSIXシェルの仕様通り」
正確には
「kshの動きをPOSIXがシェルの仕様として採用した」
だな。 >>566,567のこと?>>567の下は上と同じこと言っているとしか見えないが
だったらマジじゃないだろう POSIXは他の環境でも動く共通規約
GNUのソフトは高機能だがそれ自体が方言ということ
組み込みは機能を削ぎ落とすため色々知恵が必要
一般人はbashだけ使ってればおk
こんな認識で問題ない? やっぱりどこでも動くシェルスクリプトなんて幻想なんだね… >>570
Linuxユーザーという前提?
POSIXに準拠していれば、多くの環境で動かすことが出来る
GNUはPOSIX準拠+高機能な拡張(標準語+方言)
GNU以外でも多かれ少なかれ拡張されてる
組み込みも完璧ではないが、多くの場合POSIX準拠に近い
一般人はWindowsだけ使ってればおk
dashで動かす必要があるなら、bashの拡張は使えない >>571
/\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ winでwsl使えるようになったし、bashが正義じゃないの?
macは知らないw だからその、WSLのUbuntuの
/bin/sh は dash だっていってんの aptitude install bash
#!/usr/bin/bash >>572
Mint使ってるけどdashってどんな時に必要なの
軽さが求められるってラズパイやドローン辺り?
MacはBSDだからLinuxのコマンドオプションが使えないってのは面倒そうね
だからってそっちにcoreutils入れるのもアレだが >>577
そんなもん、こんなの重いbash使うまでもないですよねってときに使うに決まってるじゃん
/bin/bzdiff:#!/bin/sh
/bin/bzexe:#!/bin/sh
/bin/bzgrep:#!/bin/sh
/bin/bzmore:#!/bin/sh
/bin/egrep:#!/bin/sh
/bin/fgrep:#!/bin/sh
/bin/fsck.btrfs:#!/bin/sh -f
/bin/gunzip:#!/bin/sh
/bin/gzexe:#!/bin/sh
/bin/gzexe:#!/bin/sh
/bin/lesspipe:#!/bin/sh
/bin/setupcon:#!/bin/sh
/bin/uncompress:#!/bin/sh
/bin/unicode_start:#!/bin/sh
/bin/zcat:#!/bin/sh
/bin/zcmp:#!/bin/sh
/bin/zdiff:#!/bin/sh
/bin/zegrep:#!/bin/sh
/bin/zfgrep:#!/bin/sh
/bin/zforce:#!/bin/sh
/bin/zgrep:#!/bin/sh
/bin/zless:#!/bin/sh
/bin/zmore:#!/bin/sh
/bin/znew:#!/bin/sh bashが使えない環境のほうが特殊だよなぁ
素直に #!/bin/bash で書いときゃいいんじゃね
ところで、#!/usr/bin/env bash って使えるのか? 特殊だろうがbashが使えない環境は現実として存在してるわけで 普通にPCでLinux(とWindows)使ってるだけならbashだけでなんにも困らないよなあ
これはLinuxに限らずちゃんとしたUnixを使う場合もそうだけど、客先で使ったり客に何かを提供する場合は気を遣うべきだが
自分で自由にできるAIXやHP-UXならbashインストールすりゃいいんだし オープンソース開発者「そら、お前がお前のためだけのツール作るなら、それでいいだろな。責任もなんにもないし」 MITとかの主要なOSSライセンス読んでみろ。
ソフトの使用でどんな損害被っても作者は責任持ちません。
それに同意しないと使えませんて書いてあるだろ。
オープンソース開発者こそ責任もなんもない。そのためのライセンスだから当たり前だが。
何を勘違いしてんのかねこいつはw >>574
macOSもzshがデフォだから実質Bashの機能が使える。 JavaだとJREまるごとついてくるソフトも珍しくなかったし、
今だとコンテナでlibcからなにまで添付。
ストレージの容量に気を使わなくてよくなってるんだから時代に合わせて
開発するのが良いんじゃないかね。 まーーーたいつもの自称神のPOSIXキチが暴れてんのか。 >>587
問題はシバンをどうするかだよ。
zshを使うには#!/usr/bin/zshとしないといけない
bashなら#!/bin/bashだ
だがzshとbashをうまく使い分けてくれるわけじゃない
シバンは#!/bin/shとするしかない
そうするとUbuntuではdashになる #!/usr/bin/zsh にすればいいだろう、そういう話でもあるのに特定のヤツだけがなぜか拘っているだけだろに
そいつもたいしたもん作ってないくせに >>587はzshがbashの代替になるという話じゃないの
bashとの違いはあるだろうけど、些細なちょっと直せばいいというのを含んでの
そもそも一般人は=特定の環境で動けばいいだけの人はの話でしょう 「一般人」をオレオレ定義して語るのはやめましょう
複数の環境を使う一般人もいるわけです zshスクリプト書くならzsh必須
bashスクリプト書くならbash必須
当たり前の話だ >>594
大多数でもなんでもいいけど、そういう意味だろう。それでも読めなさそうだが 一般人を勝手に定義すんなって言ってるのに、
そういう意味だろとか、わかってなさすぎw
一般人にそういう意味はありません >>599
お前が「いつもの」だって言うのはわかってるぞ /\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ 自分でできないのにww
ないすボケと言って欲しいのかw >>601から全て自分自身に対して言っているのね?なるほど納得 ここまで言われてなおシェルスクリプトと無関係な煽りを書き込めるって相当だぞ exec 2> >(tee -a stderr.log >&2)
後ろの>&2ってどんな意味なんです? bashが必要になるようなものはそもそも選択する言語が間違ってると思う >>608
stderrのをだから(サブシェル内の)stderrに出力、それが無ければstdoutに出力
あんまそれほど意味はなさげのような気がするけど インタラクティブ、もしくは、それ以下のスクリプトでサブシェルのstderrの先を変えようにも変えようがないし、やるならその前でしかなと、意味はなさげと思ったが、
それが入っているスクリプト起動時にリダイレクトする場合には意味があるか。(コンソールへの)stderrいらないから捨てるとか
hoge.sh
#!/bin/bash
exec 2> >(tee -a stderr.log >&2)
...
./hoge.sh 2> /dev/null
>&2があるので、(コンソールへの)stderrはうまく捨てれる bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する
https://sechiro.haten blog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9
そのスクリプトの出処はここだな
出力のプロレス置換ってこう使うのか
入力のプロセス置換はよく使ってるけどそっちはどうもな grepは自身で上書きすると中身空になるけど回避方法ある?要はspongeなんだけども data=$(grep 〜); echo "$data" > 〜 >>612
こんなのが出たので見るのを止めた。
この接続ではプライバシーが保護されません
sechiro.hatenblog.com では、悪意のあるユーザーによって、パスワード、メッセージ、クレジット カードなどの情報が盗まれる可能性があります。詳細
NET::ERR_CERT_COMMON_NAME_INVALID >>618
お前のパソコンなんかおかしくなってるぞw 5ch では、はてなブログのURL を貼ってはいけない!
書き込み禁止画面が出ずに、いきなり吸い込まれて、
アクセス禁止になるようにしてあるから、超危険!
同様に、twitter の長いURL にも、吸い込まれるものがあるらしい
そこだけ、全角などに変換した方がよい。
hatenblog >>612
のURL は、証明書エラー!
HTTPS の証明書が切れてる! >>612
hatenblog
そもそも、上ははてなブログじゃない!w
a が無い
はてなブログは、
hatenablog >>612
hatenblog に、a を追加したら、ちゃんと見れた!
はてなブログは、
hatenablog https://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9 >>619
スマホのChromeなんだけどね。おかしいのかね?よくわからんが。 >>621
あ、そういうことか。
たしかに無事開いてしまったら何か違う世界を見てしまいそうで怖いアドレスだなw 16進数(最大二桁 0xFF)から8進数に変換したいんですが
bcを使う以外にsedなどを使った方法とかありますかね…?
$ printf 'obase=8;ibase=16;%s\n' 'FA' | bc
もしあれば,bcは16進数のアルファベットが大文字じゃないといけないし,
POSIX標準とはいえUbuntuとかには既定で導入されてないしで,
あまり使いたいくないんです(わがままですいません) 8進数にパーミッション以外の使いみちなんてあったのか… >>630
hex=fa
oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) ))
# oct=$((0x$hex >> 6))$((0x$hex >> 3 & 0x7))$((0x$hex & 0x7)) 3桁固定版
echo "$oct"
出力が必須でない場合(変数に入れて処理する場合)は
oct=$(printf '%o\n' 0xfa) よりも速いはず 他にも case を使って書けるはず
最大0xFFなら
case $value in
01) 〜
02) 〜
:
[fF][eE])
[fF][fF])
esac
とかねw
たかだか256+α行。頑張ればFF の一桁ずつ処理すれば行は減らせるだろう。 >>633訂正
× oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) ))
○ oct=$(( (0x$hex >> 6) * 100 + (0x$hex >> 3 & 0x7) * 10 + (0x$hex & 0x7) )) >>632
posixの範囲ではprintfで16進数から文字に変換することが出来ない
printf '\101' # => A
printf '\x41' # bashは変換できるが、dashでは変換できない
バイナリデータの処理など、文字コードを使って処理する必要がある場合は
8進数を使うほうが良い 8進数よりも16進数の方が使い勝手が良いのにパーミッションが8進数なのは、
当時はまだ16進数が発明されてなかったからだったりするのかな?
シェルスクリプトもそうだけど、なんか古い時代は8進数しかなかった感じがする
それとも単なるビット数を節約しただけなんだろうか? rwxで3ビットしか使ってない必要ないと思ったからだろう >>637
>当時はまだ16進数が発明されてなかったからだったりするのかな?
どこでなにが「発明」を指して居るのかわからんが、コンピュータ業界コンピュータサイエンス(?)としては当時でも普通に16進数があっただろう。スイッチをパチパチしてマシン語を打ち込む当時のコンピュータでは打ち込むプログラムは16進数で書いてたようだから
Unix version 1 は 18ビットマシンの PDP-7 でから始まり、すぐに PDP-11 に移行したがその名残だろう、K&R C の文字リテラルでは8進数表現しかできないのとかは、また、K&R C の影響じゃね
PDP-7 は 18ビット= 3 3 3 3 3 3 で表した方書いた方がきりがいいからそれが普通のような感じだったんじゃね、今でもパーミッションは3ビットに収まっているので3ビット区切りで表した方が書いた方がわかりやすいのと同じように 昔はなぜか 12bit 15bit 18bit 24bit 36bit あたりのマシンが多い そうなの。見物したスイッチをパチパチしてマシン語を打ち込む当時のコンピュータは16bitだったから、PDP-7(というかPDP-11の前までのDEC)が異端かと思ったw 16進数から8進数への変換って↓
$ hex=fa; printf '%o' $((0x$hex))
↑こういうのだとPOSIX違反? POSIXは知らんが、 古いzsh? は $((0x$hex)) が使えなくて $((16#$hex)) だった気がする
もしくは $((011)) が zshでは8進数にならなくて $((8#11)) と書かないといけない
という問題だったかもしれない。まあ忘れたw ふむ。ということは今であればほぼ問題ないという訳か。
thx >>644
基本的にメインフレームってカテゴリのコンピュータはCPUも自社設計だったので
8bit単位じゃなく自分たちの使いやすいbit数だった
ザイログとかモトローラのCPUを使っていると基本的に8bitの整数倍になる symlnkのフォルダからファイルをmvすると実体パスの方で移動するけどmvの仕様? 移動なら実体を移動しなきゃ移動しないだろう、ファイルシステム的に 例えば/a/b/cがあって、/x/yが/a/bを指すとする。
cd /x/y; mv c ..したときにcが/x/cじゃなくて/a/cになるという話なら仕様。
実際はcd /x/yの時点でカーネル的には既に/a/bに移っている。
pwdして/x/yと表示されたり、プロンプトに/x/yと出たりすることがあるのは、シェルがそう見せているだけ。
外部コマンドを呼んだ時点で/x/yにいるという情報は伝わらない。 シェルによっては今いるディレクトリをシンボリックリンクのままPWD環境変数に出力するから、外部コマンドでも>>651の場合に/a/bではなく/x/yにいると分かることもある
だからmvでもやろうと思えば環境変数によって動作をかえて/x/cに移すこともー応可能ではある
ただ普通はそういう危なっかしい動きはしない なるほど
~/dir/foo.txtがあって、dirのリンクを~/Desktop/dir_linkに作ったんだ
んでdir_linkからmv foo.txt ../したらDesktopになくてあれってね
シンボリックリンクはあくまで別名だって念頭に置かないといつかやらかしそうだなぁ シンボリックリンク自体はカーネルっていうかファイルシステムの機能であって
シェルの機能じゃないよね?
シンボリックリンクされたディレクトリへの移動やその表示が、シェルの機能? シンボリックリンクはただのファイルで、APIが機能を提供してるだけだろう
ハードリンクはファイルシステムの機能だろうが シンボリックリンクはPOSIXで決まっているが、
シェルスクリプトとは関係ない。
シェルとも関係ない。すれ違いだ。
シェルスクリプトの話をしろ。 シンボリックリンクもハードリンクもファイルシステムの機能だ >>657
どこまでをファイルシステムかと言うのかだが、論理矛盾とかリンク切れとかあってもなんも関係ないのだから低レベル=どのファイルシステムでフォーマットする?というファイルシステムのファイルシステムではないな
そのレベルではファイルとフラグを提供しているにすぎない
APIも含めたOSがアプリケーションに対しての提供するファイルシステムといえばファイルシステムだろうが シンボリックリンクやハードリンクはOSの機能
ファイルシステムはそれを実装するだけ
(FATのように実装してないものもある) 俺が定期的にお題を出してやらないとすぐクソスレ化するなw Oh, I like Japan.
Japanese are crazy. Ha ha ha.
Japanese are pigs, pigs, you know.
Moneys and they have small cocks you know short legs yellow monkeys.
Do you understand? POSIXの話するから荒れて盛り上がるから誰かしてよ POSIXの話すると荒れて盛り上がるから誰かしてよ POSIX準拠で固定小数点ライブラリほしいな
小数使うことは稀だけど、たまに無いとめんどくさい
exprは外部コマンドで遅いので却下w bashって便利だけど計算部分だけマジでダサいな
1+1が
$((1+1))ってなんなんだよ どの言語にも言えることだけど、
ダサい部分ってのは互換性のためだよ
シェルスクリプトは外部コマンドを関数として呼び出せて、
そして外部コマンドに使える文字は、ファイルに使える文字と同じ
だから例えば@とか%とかいう文字でさえ、コマンド名として使える
だから、安易に記号を追加するわけにもいかないし予約語も増やせない。
$に関してはシェルスクリプト当初から特殊記号だったから
新たに特殊記号や予約語を増やすのではなく$を拡張するという方法を採用したのだろう
互換性は一番大事だからね 補足
例えば「1 + 1」は、"1"コマンドを、+と1という引数で呼び出すという意味になるし
「1+1」だと"1+1"コマンドになる。
選択肢が限られるんだよね $ awk 'BEGIN {print 0.1+0.2}'
0.3
bcより使いやすい悲しみ POSIXの仕様書,
算術展開での(浮動)小数点演算は今度の2020年度改訂で一部解禁されるらしい。
ちなみに時を同じくして$'\n'←みたいな書式も解禁。
やったぜ。 もしもし、先生!もしもし!
だけどもねー、実はあのー、子供つくらないようにしてるんですよね、わたくしも本当に辛くてですね、子供には遺伝しないでしょうか? 無理にシェルスクリプトだけで小数対応しなくても、
perl -e "print 0.2*0.3"
とか、いろいろやりようはあるからあまり必要性を感じない。 >>690
大量に計算をするとプロセス呼び出しになるから遅いんだよ
$ time ksh -c 'for i in $(seq 1000); do n=$(echo "0.2*0.3" | bc -l); done'
real 0m1.921s
user 0m1.762s
sys 0m0.715s
$ time ksh -c 'for i in $(seq 1000); do n=$((0.2*0.3)); done'
real 0m0.009s
user 0m0.009s
sys 0m0.000s
たったの1000回でここまで差が出るからね 意図と違うと思うが、
time perl -e '$j=0; for($i=0;$i<1000;$i+=1) { $j+=0.2*0.3; }; print $j'
とか、別にシェルスクリプトだけに頼らんでもなんとかなってしまうというか・・・・ だから出来るできないの話はして無くて
遅いって話をしてる perlは入ってない環境も有るのでその点でも駄目だしね そんな事する必要がないなら縛りって言ってもいいけど、
perlが入ってない環境は実際に存在するからね 「可搬性が高い」を「POSIX縛り」と取り違えてるおバカさんがいますね… POSIXで縛るだけではPOSIX未満のbusyboxで動かなかったりするからね
可搬性を高くするにはPOSIXで規定されたコマンドであっても
なるべく使わないほうが良い ここはシェルスクリプトのスレ
つまり可搬性とはシェルスクリプトの話をしてる。
シェルスクリプトではよく外部コマンドを呼び出す
しかし外部コマンドはOSによって違う。
特に基本的なコマンドは、各OSでバラバラに作っていたり
独自の修正を入れており複数の実装があり微妙に動きが異なっている。
例えば、LinuxのsedとMacのsedでは使える命令が違う。
POSIX準拠のコマンド(もちろんオプションなども含む)で規定されてるものだけを
使っていれば可搬性はそれなりにあるが、それでも完璧じゃない。
例えば組み込みで使われるbusyboxはPOSIX準拠コマンドのサブセットが実装されてる。
だから本気で可搬性を高くしようと思えばPOSIX縛りでも不十分。
POSIX準拠のコマンドが信じれない。という前提にたてば
思い切って外部コマンドすら呼び出さない、完全にシェルスクリプトだけで
実装するのがもっとも可搬性が高い。
もちろん限界は有るので実際には出来る限りシェルスクリプトで作って、
外部コマンドは必要最小限、必要に応じて互換性を吸収するようにラッパー関数を作る。
ということになる。 可搬性に異常に拘っているのは一人か二人しかいないけどな
可搬性に拘ってないというレスにも可搬性を押し付ける 認めろよ。
シェルスクリプトに可搬性などない。
どこでも動くシェルスクリプトなど幻想。 hoge () {
echo "Hello"
}
for i in $(seq 1000); do
hoge
a=$(hoge)
done
myfunc と a=$(myfunc) の実行時間の差はなんなん?標準出力を横取りするためだけにしてはコストが高いかな
簡単に思いつくのは横取りするためパイプでで別プロセスにしなきゃとかかな? それBashでやってない?
試しにKshでやってみて。(俺環かもしれんから,速度比較は晒さない) perlが入ってない環境ってそれは入れる必要ないんだろ
一から構築していくならそれでいいけど なるほど。ksh(だけが?)がなんか賢いかな。zsh他も差がある perlが無い環境があるからどうのこうの言うけど
kshが無い環境があるからは言わないんだなw >>712
zsh他も差があるは、>>709で体感できる差があるが正しいか
kshでも差があるね。ループ数増やせば体感できるほどの差となるね >>709
forkだよ。$( ) の部分がサブシェルになってて
多くのシェルではサブシェル = 別プロセス生成で実装されてる。
そのおかげでサブシェルの中でcdを実行したり変数を使ったりしても
呼び出し元は汚染されたりしない
kshはサブシェルの実装が最適化されていて
全てではないが、サブシェルの部分を同一プロセスで実行する。
独自で状態の保存と復帰を実装してるのだろう。
https://codeday.me/jp/qa/20190810/1425430.html
kshは速いと言っちゃ速いんだが、その(複雑な?)仕組みのせいで
バグのもとになってたりする。ということを書いてあるページが
有ったんだがどこか忘れた。 遅い原因の本質は標準出力のキャプチャじゃないから
この二つでも違いがでる
hoge () {
:
}
for i in $(seq 1000); do
hoge
(hoge)
done
>>715
> kshでも差があるね。ループ数増やせば体感できるほどの差となるね
そうなんだよね。サブシェルのコストは以外と大きい。
だから変数に入れて使うことが目的とした関数は以下のように
グローバル変数を使って返したほうがずっと速いわけさ
hoge () {
RET=Hello
}
for i in $(seq 1000); do
hoge
a=$RET
done >>716
内部関数なのにってとこがね&普通の他の言語とはやはり違うな(まあ当然だが)という(内部汚染とかこれの本題ではないっすよ)
zshはkshを習ってだけど、ちょこちょこ習えてないなあ。kshの否定面のレスだけど、kshは人に優しいとこもあるとも思うw
a=0
ls | while read line; do
[ "$line" = 'hoge' ] && a=1
done
[ a -eq 1 ] && ...
っていう見た目他の言語的では当たり前のがちゃんと動くというwまあ、異端だけど
とりあえず、どうしようもないそういうものということでいいのね。どうも >>717
せっかくですが、ちょい本題とは違うかな。そりゃ () は...
なんで内部関数なのにサブシェルになんのかねん、他の言語的感覚ではという
まあ、内部関数だろうと、() と同じで $() もサブシェルになるということをおっしゃっりたいのでしょうけど
どうも >>719
> なんで内部関数なのにサブシェルになんのかねん、
考え方が違う。
コマンド置換$( ) は「サブシェルを使用して実行する」という"仕様"なんだよ
なんでサブシェルになるのか?ではなく仕様でサブシェルにすると決まってる。
ただし別プロセスにするとは決まっていない。だから子プロセスとかいう既存の
名前ではなく、新たにサブシェルという用語を作った。
サブシェルの仕様としては、「サブシェル内で行った変数などの変更は呼び出し元には伝わらない。」
などがあるが、それを実現してるなら別の別プロセスでなくてもよい。
だけど別プロセスにするほうが実装が簡単だから多くのシェルではサブシェル=別プロセスになってる。 >>720
その続きなどを読んでよ。言われていることはすでに書いてあるんですけど
どうしようもないという結論が得られたのでw、
結局、こんなことにもそれなりの差があるんだから「常時それも無条件で」実行時間の差があるなんて気にするなんて無意味だなと
なにかそれが問題になったときに気にする対応すればいいだけだなという。のをそもそも言いたかったw >>718
> 内部関数なのにってとこがね
他の言語の場合、(基本的に)関数内の変数の変更は呼び出し元に反映されない。
つまりローカル変数になってるだろ?
それと同じなんだよ。POSIXの範囲ではlocalもtypesetもないから
シェルスクリプトにはローカル変数がない
ように思えるが、実はサブシェルを使うからローカル変数は必要ない。とも言える。
ローカル変数を実現するためのサブシェルと言える。
サブシェルの仕様としてローカル変数は必須の機能だが、別プロセスにするのは必須ではない。
サブシェル(別プロセス)と捉えるから仰々しくなってるが、
変数のローカル化と考えれば、内部関数内の変数をローカル化するってだけだから
「内部関数なのに」とは思わないだろ? >>722
なにを教えてくれてるのか教えたいのかわからないです
内部変数?内部変数環境のことは言ってないです。他の言語でもの(内部)関数を呼ぶその返り値を使うって話なんですけど
内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか?内部関数という言葉が悪かったならすまんすですけど >>718
そのコードに関しては
ls | {
a=0
while read line; do
[ "$line" = 'hoge' ] && a=1
done
[ a -eq 1 ] && ...
}
こう書けばいいって事がわかってから悩むことはなくなったなw
上記をさらに発展して、関数化すれば以下のようになる。
hoge() {
a=0
while read line; do
[ "$line" = 'hoge' ] && a=1
done
[ a -eq 1 ] && ...
}
ls | hoge
そうするとa変数は実質ローカル変数として扱ってるんだから
スコープ的にはこっちのほうが適切だと気づくだろう >>723
> 内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか?
使い分けるんだよ。
ローカル変数化したいならサブシェルを使う。
そうでないならサブシェルを使わないって。 >>725
なんか教えたがりのようですけど、ちょっと無理があるかなと
あくまでも「他の言語的感覚では」が前提、それとは違うというのの確認でしかないんですけど
使い分けるとかそもそも内部変数の話はしてないんですよ >>726
他の言語感覚って言うけど、
じゃあお前いくつ言語しってんの?って話だよ。
狭い言語の知識=言語の全てって思ってるだけさ そもそものそもそもは、bcの毎回起動するのに時間がかかるというので、せっっかくの標準で暗黙的にもマルチプロセスなのでサーバ&クラアント的に起動しとけばいいんじゃねと
trap 'exec 8>&-; exec 7>&-; rm -f from-server to-server' EXIT
mkfifo from-server
mkfifo to-server
exec 8<> to-server
exec 7<> from-server
< to-server bc -l > from-server &
calc () {
echo "$*" > to-server
read result < from-server
echo $result
}
てのを書いたのよ、単なる興味的にどれだけのコスト削減できるのかを試し確認するために。で、この一連の(他の言語的には)思ってもいなかったとこでコストがあるなと。その確認だけだよ。で、やっぱり>>721のようなことだなとw >>728
どの言語でも、その言語を知らなければ、その言語特有の所でコストがかかるってだけだ
だからちゃんとその言語を知らなければいけない。 はいはい。知っていることを延々と言われても。それも聞いてもいないのに >>726
つうか、お前の感覚の話なんか誰にもわからんだろ。
だから、馬鹿だと言う前提で説明してるだけじゃん?
それすら理解できないってことはやはり馬鹿なんだなぁと思うばかり。 ろくにシェルスクリプトのことを知らないから聞いてみた。
親切に教えてくれる人がいた。
……何が不満なんだ? よくわからないが、他の言語で
func()
と
a = func()
で、こんな差があるのなんて、他にどの言語あるの?俺は知らない少々他の言語を知っているが
てか、そういうのは普通は「使えない」からそうならないようにするし、そもそもシングルプロセスを前提のが多いだろうから、他の一般的な言語でシェルスクリプトのようなのはちょっと思いつきません
func がまあ普通の速さなので、a = func もなんか他の方法があるのかなと。無いという確認はとれてお礼も言っているのになあ>>718で
関係ない(知っていることを)ことを延々とでいい加減してくれというのはあったけどw すべての言語はそれぞれ違っているんだが、
同じ言語がほしいのか? >>736
相変わらずだね。何を言いたいのかさっぱり
返り値を使う(関数)使わない(サブルーチン)でコストがこんなにあるって話なのに そうだ、ksh(zsh)ならreadでと思ったら、逆に遅くなるのね
hoge | read a
サブシェルになるのはhoge。kshはパイプでもパイプを使わずになんちゃらを使ってなんとかかんとかwとかあったからちょっと期待したのに
あれだな、そもそもシェルスクリプトの関数の返り値はreturnでの実行ステータスしかない、それ以外の形態(テキスト)は考えていませんからこんな感じにしかなりませんってとこか for ループは、while よりも遅いだろ。
bash も、dash よりも遅いだろ
ループでは、for, bashを使わない方が速い returnが返り値ってw
あれはエラー情報だろ
例外と同じ。 パイプで処理をつなげていくシェルスクリプトにおいて
返り値=出力なんだよ
出力を読み取って、処理して出力する
そういう基本がわかってないだけ return
なんすけど。returnの意味知ってる?とかいう。いや、しつれい
エラー情報でもない、単なる終了ステータス。exit ではないのは、まあ、関数だからと、exit と区別がつかないからかなw function name () { }
が、POSIXではないのは(これからも採用されないかも?採用するの?)というのは、関数じゃねえー、所詮コマンドだなというとこかなと思ったりしてみたり、今回w
>>742そのレベルで馬鹿にできるのはあなたがそのレベルと言っているようなもんかなとw
てか、return なのにそれを返り値と見るのを頭から否定するのは、いままでの同一人物としか思えないんだけど。シェルスクリプトは知っているがシェルスクリプトしか知らないシェルスクリプトにだけ拘るw >>743
returnの意味は「帰る」
何かを戻すという意味はない マジで言ってるの?もっと勉強しよう、他人にアタるならw アセンブラでもreturn(RET)がある。
これも戻るという意味なだけ
呼び出し元に何かを戻すという意味はない アセンブラでもマクロアセンブラはあったりするけどな
戻り値をどういう形態で(どのレジスタにとか)という決まりであれば
>呼び出し元に何かを戻すという意味はない
マジで言っているの?アホらしい >>748
「マジでいってんの」しか言ってないよなw
returnを翻訳してみろ。戻るという意味しかない 言うならアセンブラでなくて機械語だな。ほんとにしょうもない知識自慢
>>749
>returnを翻訳してみろ。戻るという意味しかない
マジで言ってるのとしか言えんやん。「return なんとか」とか普通にあるぞ?
>>743 にreturnしか書いてないからか?なんかしょうもないなああwなんかしょうもないけど、だったらなんかすまんな
>>750
関数として見たらだよ。すでにそういうことは>>743,744で言っているんだけど
所詮コマンドだなで終わってるよ >>735
よく分からないで批判する癖は辞めた方が良い >>751
機械語にreturnに類する語は出てこないぞ? 「よくわからない」が何を指しているのか「よくわからない」だろう?
また単なる「語」に食いつくwいつものかとしか思えません >>753
イミフ。機械語は01だからな。そんな話はしてない
やっぱりいつものかw 同一人物かどうか知らんが、>>742から同じ人物としてしまう、もうw
同じ「レベルw」でしかも同じ姿勢としか思えないので。もう十二分にそのレベルwを自ら率先して晒してしまったので>>744の後半で正解だったなと
あとはもう「教えてww」やんない いつもの妄言を喚いて自分の敵は一人だと思い込んでる痛い奴だったか 敵www
そういう姿勢だったのね。そうだよね、あなたはw IDが変わっても判別しやすいのはいいこと
ぼんやりしてて助かる >>758
いやおまえ、オレと関係ない人を同一人物扱いしてんじゃん >>760
>>756をよーく読もうな。読めない?
>>753は何を言いたいの?
機械語は01だからreturnに対する語はないと言いたいの?ととって、ああまたかというw>>756なんだよ(よく読んでねw)
>機械語にreturnに類する語は出てこないぞ?
って、どういう意味?俺の理解とは別でならすまんかったちょっと続ける? >>762
なにを言いたいのかさっぱりなんですが、具体的に自分のお言葉でお願い
まさか、RETはあるがReturnは無いではないだろうし、さっぱりわからん
(そしてなんで同じやねん、その姿勢w) 同じだだろ。何いってんの?
略だから違うんだって言いたいの? シェルスクリプトのreturnは終了ステータスを返すもので
これは他の言語の返り値ではないのは一目瞭然なんだがね
だからこそ $_ という変数(外部コマンドを呼び出した時の終了ステータス)で
アクセスできるわけだし
しらないならシェルスクリプトを勉強してくださいって言うしか無いな
なんならbashのドキュメント引用しようか?
return [n]
指定した返り値 n で関数を終了させます。 n を省略すると、返却ステータスは 関数内で最後に実行したコマン
ドの返却ステータスになります。 関数の外側で使われているが、 . (source) コマンドによるスクリプトの実行
中である場合、 シェルはそのスクリプトの実行を止め、 n またはスクリプト内で最後に実行されたコマンドの
終了ステータスを スクリプトの終了ステータスとして返します。 関数の外側で . によるスクリプトの実行中以
外に使われた場合、 返却ステータスは偽となります。 関数やスクリプトから実行が戻る前に、 RETURN トラッ
プ に設定されたコマンドが実行されます。 >>765
その違いは今、重要なのか?w
returnの意味なんて言語によって違うって話をしてるんだが >>764
マジか
残念ながらが同一人物に見えるとやはりなお思ってしまうよw
マジか。そんなんで偉ぶるwなんの意味があるのだかさっぱり
そもそもマシン語ではない、アセンブリ=ニーモニックだし。ニーモニック命令は3文字にという昔の風習なだけだろうに
豆知識
そもそも、そんなRETでもいいけどReturnすらないCPUもある。POPしてジャンプという
なんだかなあ あら。なんかすまん、別人なのね
>>766
んー、なんで「知らない」前提なのかさっぱりわからん。一般的な関数の形態としての話だし、その言っていることは>>743,744で書いているのだけど(もちろんそんなことは前々から知っていての)
あくまでも関数の形態としてのreturn文ね。わからないかなあ
なにか俺は知らないを前提に書いているようだけど、なんで?? ん??
ID:DWeKr+Az が頓珍漢に横入りしたのかwwなにをのたまっているのかだかな。もうあんたはいいよw同じこと繰り返してるし
>>768,769はID:o4tQ0hzeかと思って書いた
>>761はID:o4tQ0hze にご理解いただけたということでよろしいのですかね?? シェルスクリプトはシェルスクリプトだっていってんのに
俺は他の言語しか知らん。シェルスクリプトは他の言語じゃない!
といわれても、
うんじゃあ、シェルスクリプトを使えるように、シェルスクリプトの勉強をしましょうか?
としか言えんわなw >>771
どう読んで、そう思っているのか??
俺は他の言語しか知らん。シェルスクリプトは他の言語じゃない!なんてこれっぽっちも言ってないけど
他の言語の関数とはやっぱ違う他の言語の関数と同じようにはできないねというだけだが?端的には>>735と所詮コマンドということ
POSIXとしてもfunctionと名乗ってるけど、一般的=他の多くの言語のfunctionとは違うfunction、functionというよりコマンドだなやっぱちう
それがシェルスクリプトのfunctionで他の言語のfunctionとは違うって強く俺に言いたいんですかね?
いいよ、めんどくさいから読まなくても。レスするのもめんどくさいからw
>>772
まあ、そういう意味じゃないんだけどね(どういう意味のレスなのかイマイチだがw)
マクロアセンブラがあるようにアセンブラはどのようにもできる、やろうと思えば。縛りはそこじゃなくて、機械語だなという
また、機械語になんて関数なんて概念ないからねって話にも膨らむのになというw 俺はたぬきしか知らないなんて言ってない!
みかんはたぬきとは違う! めんどくせえなあ。とんちんかんな変すぎるレスいらんw
知らなかったのはサブルーチンとして使うのと関数として使うのにコストの差が思った以上にあったというだけだな。functionなんだからそんなに差が無いようになんかあるだろうと思い込みによる
それだけだよ
別にだから関数のように使わないとも言わんし、いままでも使ってるし変わらずに使うけど >>775
無いよ。機械語を駆使して関数を作ってるっていう
機械語レベルの関数って?まあ、そんなCPUがもしかしたらあるのかもだが、知らんんなあ 機械語にはサブルーチンはある。なきゃ困る(主にどこのアドレスに返ってくるのかのため)。単なるサブルーチンコール、引数の概念とかも無いw
引数も返り値(サブルーチン+返り値=関数)も、単なるmoveとかpushとかで「適当」なとこに入れての(主に高級言語(ほぼCだが)の仕様にあわせての)で、機械語の概念では存在しない
おしまい この板にもあるだろうと思ったらあったし、
「関数」で検索したらアセンブリで関数というのを説明しているようなレスもあるやん
調べろよそのぐらいw ああ、すまん。勇み足だった。よく読んだらあんま詳しくはないかな
ある程度知っていての注意点ぐらいだった お詫びに探してきた
https://nw.tsuda.ac.jp/lec/i486/
興味があるなら、読もう。アセンブリの部分をも だいたいシェルスクリプトと機械語なんて超相性悪いから
シェルスクリプトの概念を例える別の言語として機械語(含むアセンブリ言語)は最悪の選択ではw
シェルスクリプトの標準・仕様書であるPOSIXも機械語には全く言及してないってか
適用範囲の節で明言してるし。
(つーかこの喧嘩って俺がkshの速度を持ち出したことが発端なんだな…
良かれと思って余計なこと言わなけりゃよかった) >>784
>シェルスクリプトの概念を例える別の言語として機械語
じゃないよ、そもそも言いだしたのは。俺じゃないけど。単にreturnという「語」のに絡みついてだけの>>747
まあ、機械語(=1対一でしかないアセンブラ)では当たり前なんだが、上記の通りに
てか、めんどくさいから読まないでしょ?レスするのめんどくさいよw >>784
>シェルスクリプトの標準・仕様書であるPOSIXも機械語には全く言及してないってか
>適用範囲の節で明言してるし
CPUによって全然違うし(CPUメーカーが作るもんでしょう)なあ。標準化なんてする範疇じゃないんじゃないかな
>kshの速度を持ち出したことが発端なんだな…
いや、違うよ。kshの件は早々に終わっているといえば終わってる。そんなのが全く関係ないとこでながながとなってるだけだな
その前の俺の思惑wからだな、長々としている原因は。強いて言えば >>718 , >>719 が既に頭悪そうなんだよ。その辺りから見直したらいいんじゃないかな。 ファイル名に()が入ってるやつをリネームしようとしたら
Syntax error: "(" unexpected
と言われる・・
ファイル名から()取り除いたらうまくいきました
どうすればよいでしょうか touch "foo()bar" で作れたからそれかな
あるいは 正規表現のできるrenameツールに任せちゃう
https://paiza.io/projects/GgkMgqOqyzwwgbmu-Fn-Vg
https://pastebin.com/pYBipcQt
~/bin/rename.pl dry s/foo../foo/ foo\(\)bar
foo()bar => foobar
~/bin/rename.pl run s/foo../foo/ foo\(\)bar >>789
file="aaa (bbb) ccc"
mv "$file" "aaa"
シェルスクリプトでは引数の変数は""でくくるもんだ
常識だからな
shellcheckでチェックしろ >>789
ファイル名をシングルクォートまたはダブルクォートで括る。またはそのようにシェルが特別な解釈をしてしまう文字の直前に \ を入れる。 空白絡みで便乗質問です。
スクリプトがあるディレクトリを変数に入れるために、よく、
BASEDIR=$(cd $(dirname $0); pwd)
みたいなの書くと思うんですけど、
スクリプトを呼び出す際の相対パスや絶対パスに空白があっても大丈夫な場合はどう""をつければいいんでしょうか。
いつも試行錯誤するんですけどうまくいかなくて空白禁止にしちゃってます。 >>793
BASEDIR=$(cd "$(dirname "$0")"; pwd)
BASEDIR="$(cd "$(dirname "$0")"; pwd)"
↑これは不要
"引数"として渡す場合に必要。
変数への代入は引数ではないので不要 >>790
ありがとうございます
今のところThunarに標準昨日の一括リネームでなんとかなりました
>>791,792
ls: 'aaa (bbb) ccc.jpg'にアクセスできません:
みたいな感じになりましたね 小数の計算がPOSIXで標準化されるって本当?
これどうにかしてほしいんだが
$ zsh -c 'echo $((0.1+0.2))'
0.30000000000000004
固定小数点をサポートしてくれよ。 言語というよりはどういうライブラリ使っているかの問題だと思うが きちんと0.3返す言語は
分子と分母の2つ記録するから速度は遅くなる
遅いシェルスクリプトの選択した方法は正しい いや、誰が浮動小数点数的な答えを求めてるのよ?
誰も数学的に間違った答えなんか求めてないでしょ? 固定小数点なんて採用することはないな
提案してみろ、まずはStandard C Libraryとして >>801
ライブラリというより、内部での浮動小数点の形(float,double,long doubleのどれか。いまどきfloatは無いか)、および、いつ丸めてるかだけじゃね
>>800のも大体は結局はCでの結果でしかないだろう。デフォのdoubleの結果がほとんどだろう
例えば、awkは問題ないように見えるが。2.3 / 0.1 = 23 だが、int(2.3/0.1) = 22 になるのも >>805
いや、だからライブラリだろ。
同じ言語でも内部表現に関する決まりのない言語なら例えばBCDで保持するようにしてそれ用のライブラリで計算や10進文字列変換したって構わないんだからな。 そういうある意味特殊なことをしようとする意志のがあればな
結局はCなんだよどういう言語でもああいう部分は。そしてCがそうだからただそうなだけ。わざわざ言うようなことをするのは極めて少ないだろ
浮動小数点がIEEEで決められてる正規なものだし。特殊なプログラムを使えということだよ=シェルとかに求めるのは現在のコンピュータ界隈では無理筋だな perl か何かに任せておけ
#!/usr/bin/env perl
use bigrat;
my ( $ss, $F, $ISO ) = (@ARGV);
unless ( defined $ISO ) { $ISO = 100 }
my %shutter_speed = (
30 => -5,
25 => -14/3,
20 => -13/3,
......
);
printf "%s\n", 0/1 + $shutter_speed{$ss} + $F_number{$F} - $ISO_number{$ISO};
ただし perl bigrat だと
0/1 +
を抜くと型が整数処理されるというわけのわからん挙動するケースがあったから
別の言語がいいけど >>807
浮動小数点とIEEE754は同じ意味じゃないから語弊が生まれるよ。
文字コードとUTF-8ぐらいの関係だろう。
そして大抵の小数を扱えるプログラムがCでIEEE754に準拠した浮動小数点による取り扱いをしてるって意見は、全然同意できないな。 1. 数学的には正しくない。
2. 速度のために正確さを犠牲にしている。
3. 誰も間違った答えは望んでいない
仕様だから〜とかいう話じゃないんだよね。
本当はみんな正しい答えが欲しい。
シェルスクリプトに速度は重要じゃないんだから
正しい答えのほうが便利だろ ほとんど近似値でたりるし必要なら自分でつくるなりすればとしか思わないよ >>809
浮動小数点とIEEE754は同じ意味じゃないって?何を言いたいのかわからん
IEEE準拠じゃない独自のがあると?今時はFPUでやってるもんだし、速度なんぞを犠牲にしてまでもそういうのを「わざわざ」をやっている=それがウリになるからすぐに探せるんじゃないかなあ?
>>810
コンピュータサイエンス的にはそんなのはない=シェルスクリプト作る人も、そんな目新しいことをわざわざしないだろうとしか思えんな、いくらそう言っても >>811
0.1+0.2が0.3にならなくてもいいよっていう業界を教えてくれ 少数なんて大体でしかないなんて常識だと思ってたのにな。少数使わないでも結局できたりするので、また、固定少数でも結局工夫が必要なのには変わりないので
なんでそんなに少数の正しさに拘っているのだか、どういう業界でそういうのをしかもスクリプトオンリーで書かなきゃならないって想像できないな 気が付いたら少数を使うことがほとんどなくなった
利子の計算ぐらいだが、これは何桁で計算を打ち切るか
あらかじめ決めておく。安易に double とか使わない 簡単なシェルスクリプトしか書けんが何が覚えとけって言語ある?
s以外のsedの機能をようやく覚えたけどコマンドは文字列操作系で手一杯だわ
やっぱりperlの呪文覚えるしかないか パイプが強烈だから文字列処理に強い perl でしょ
オブジェクト指向はいらない >>817
それな。何桁で計算を打ち切るだと、どこで誤差が出るか想定しやすいが
doubleとかだと、桁数小さくても誤差が出るから、想定しづらいんだよね。
シェルスクリプトは型が文字列しか無いんだから、
内部の都合である数値型には影響されてほしくないな >>812
文字コードってのは文字に番号を割り振って取り扱いますよ、という概念。
浮動小数点も一緒で、有限の長さの小数を、小数点の位置を自由にすること
(仮数部と基数部で表現する)ことで表しますよって概念。
各ベンダーが独自に実装したら不便極まりないから文字コードにおけるUnicode(とかUTF-8)と同様IEEE754という標準がある。
浮動小数点演算、と言ったときにそれは一概にIEEE754内部表現を用いた演算とはならない。
https://ja.wikipedia.org/wiki/任意精度演算 の方式の中にはIEEE754でない浮動小数点表現を取り扱ってるものだってあるだろう。
BCDで小数が扱えるライブラリだってそう言うのが多いと思うよ。
IEEE754の仕様の浮動小数点演算で十分な場合は、CPUに便利命令が用意されてて1桁ずつ計算とかしなくても
一発で計算が求まるからIEEE754の浮動小数点は使われている、というだけでしょ。
浮動小数点っていう大きい概念がどういったものかってのと、IEEE754はその概念を実現するための一例でしかないってのを、
Wikipediaなり読み込んで理解したほうが良いと思うよ。
ほんと、文字コードとUTF-8は同じものだ、って言ってるぐらいトンチンカンだから >>818
1-liner、パイプ、CSV・テキスト処理、クローラーなら、可読性が高い、Ruby !
Perl のような謎のような記号は少ない >>822
他のが無いというのではなく、実際に使われている多くはというのだよ
実際に使われているのはどれだけあるの?わざわざ使ってるのならそれは意味があるのだから、そうナニか書いてあってすぐにわかるだろうという。例えばbcのように
https://ja.wikipedia.org/wiki/IEEE_754
多くのプロセッサなどの〜 から書いてある通り。Javaがそうでないように書いてあるが、
https://www.ibm.com/developerworks/jp/java/library/j-jtp0114/index.html
同様に、java.math.BigDecimal が提供する任意精度の10進数もアプリケーションで使用されることは少ないため、開発者に無視されているケースがほとんどです
しかし整数を中心としたプログラムに、突如、整数以外の表現が出てくることがあります。たとえば、JDBCではSQLDECIMAL 列の優先変換形式としてBigDecimal が使用されます
なんてある意味それを表しすぎなくらい(まあ、ここは作る側ではなく使う側を言ってるけど)
CPUに便利命令ってFPUに対するのこと?一発で計算が決まるからという簡単だからとかじゃなくて、FPUがあるのはハードで支援用意しないとそもそも浮動小数点は重い演算だからなんだけど
>文字コードとUTF-8は同じものだ、って言ってるぐらい
いや、言ってないけど、なにか思い込みが激しいね。IEEEが利用されないのも普通という考え方もそうだが >>825
>Javaがそうでないように書いてあるが
ああ、違ったしつれい。IEEE 754 を必須か
使ってないってどれだ?どういう理由でという思いがあって、おおと思ったんだけど もうさ、ハードで固定小数点数演算できるようにしたほうが良いんじゃね?
時代的にさ BCDはCPUで支援してた(そういう命令があったが)ようだが、無くなったっぽいという
BCDは速度的に有利な側面があるからわざわざそれ専用に用意しなくてもで無くなったかもしれない >>827
お前さんがこだわるほど他の人は必要だと思ってない。あったら便利なケースもあるかも知れんがコストなどに見合わないから誰もやらない。 固定小数点演算なんて整数演算と同等だからわざわざハードで実装しなくても問題ない >>818
そのままPerl覚えれば良い。
というのは、昔からあってあちこちで使われており、だいたいの Linux distribution はデフォルトでインストールされるような言語であるため。
インストールや環境整備で悩まなくて済む。後からモジュールを追加するとしても最初からrpmファイルがあったり、なくてもCPANを利用して簡単にインストールできる。
歴史が長く昔から使われて来たのでモジュールも沢山あり、またそれを解説しているサイトも多い。 >>824
知らない言語を見ればどれも謎の記号だらけに見えるとは思うけどね。
まあでもPerlは確かに多いかな。なるべく使わないようにも書けるが。 alpine linuxでperllインストールされてないんだが? >>831
そうそう。整数計算後に割って桁合わせすれば良い。 そりゃお前の趣味だからな
perlを使いたいならインストールする
当たり前の話だよな Perl, Python2・3 は最初から、入っているけど、
Ruby も、apt で、簡単にインストールできる
ただし、Ruby 2.3 〜 2.6 で、プログラマーが、新しめの書き方をしていた場合に、
古いバージョンで動かないことがあるかも perlなんて普通に入ってるからな
Solaris、AIX、HP-UX、FreeBSD、Ubuntu、Centos、Redhat、Fedora
俺が触ってきたシステムではデフォルトで入ってたな
入ってない方が少数派だろ 所属する研究室のMFにも入ってねーな。
Bシェルとかは(もちろん)入ってるけど
そういう点で言えばPOSIX準拠のシェルがあるようなシステムにはPerlも入っていて
PerlもないようなシステムにはPOSIX準拠シェルもないのかも知れんw だからAlpine linuxにはPOSIX準拠のシェルは入っているが
Perlは入ってないんだって。
いい加減Perl依存やめようぜw >>847
じゃあ言い出しっぺのあなたから、POSIXが含まれてる
LinuxやBSDやUnixやMacやWindowsを使うのをやめてください 相変わらずPOSIX原理主義者が張り付いてるんだな
日本は信教の自由はあるが強要するのは犯罪だ
他人を巻き込まないで1人でやってろよ だからPOSIX原理主義じゃないってw
Alpineはbusybox使ってるからPOSIX未満なんだよ お前はperl使いたくないんだろ?
お前の自由だし好きにすればいい
それを他人に押し付けるなと言っている
俺は普通にperlを使う
俺の自由だし好きにする
以上 ∧∧ ミ _ ドスッ
( ,,)┌─┴┴─┐
/ つ. 終 了 │
〜′ /´ └─┬┬─┘
∪ ∪ ││ _ε3
゛゛'゛'゛ 誰もPerl使うなって言ってないだろ。
Perlが入ってない環境があるという
事実を言ってるんだが 容量削減のためにPerlだけ抜くのも変だしそれ目的なら他のも入ってないのでは? まぁないものどうこう言っても始まらない
ただwin のiE6とかのようにubuntu以外は淘汰されていくだろうから
最終的には問題ないんじゃない? Linuxはdistributionごとに色々目的が違うからPerl入ってないのがあっても特に不思議はない。
AndroidのベースのLinuxにも入ってないし、普通はそこでは必要とされない。 AndroidをLinuxとして使ってるのはどれだけいるのかと それ向けの端末エミュレータとかシェルスクリプト編集実行とかは結構種類あるけどね
割合は少ないだろうね そういう人はperlも必要なら入れるな。perlに限らず >>818 Python やっとけ。 perl は成仏させろ PerlはCの如くしぶとく残ってしまうと思うなあ。 sedやawkを忘れたんで代わりにperlを使うことが結構ある perl -peをsed代わりに使ってるだけでperl自体には興味ないや
正規表現しか出番ないし使う機会がないんだよね
awkとかgrepとかどうせ他のコマンドも覚えなきゃならんし >>865 残ることは残るだろうけど、誰からも見捨てられてる状態で生き延びていても学ぶ価値はない。
プログラミング言語人気トップ8、過去15年間で安定 - 例外はPython
2019/10/07 14:16 後藤大地
https://news.mynavi.jp/article/20191007-905781/
TIOBE Softwareから、2019年10月のTIOBE Programming Community Index (PCI)が公開された。
TIOBE PCIは、複数の検索エンジンの検索結果から、対象となるプログラミング言語がどれだけ話題に
なっているかをインデックス化したもの。(中略)
TIOBE Softwareは発表の中で、毎年新たなプログラミング言語が登場しているものの、TIOBE
Programming Community Indexのトップ8は過去15年間でほとんど変化していないと説明した。
Perlが消えてPythonに入れ替わったことや、Objective-Cが消えてSwiftに替わったというのが大きな
例外で、それ以外に大きな変動はないと指摘している。
ただし、プログラミング言語の分野に関してはいくつかの傾向があるとして、その例としてPHPやPerlから
Pythonへ移っていること、新しいプログラミング言語としてDart、Scala、Lua、Rust、Kotlin、TypeScript
などが人気上昇の渦中にあることなどを説明している。
10月TIOBE Programming Community Index / 円グラフ
https://news.mynavi.jp/article/20191007-905781/images/001.jpg Perlはsedやawkと同じ位置で見ないとだめだよ
シェルスクリプトを書くときにsedやawkのように使う道具のひとつ
もちろんシェルスクリプトをまるごとPerlのスクリプトに置き換えてもいいけどそれは別の話
Perlを排除するのは武器を一つ捨てるようなもので損してるよ 汎用言語としてはpython の時代に移ったかもしれないが
文字処理言語としてはいまだ現役 >>869
と言ってもお前、sedやawkが使えないから
perlを使ってるだけやん。
お前の問題であって、perlである必要ないやん 俺当然sedもawkも使えるんだけど?
awkで複雑になる処理をPerlで可読性高く楽に書いてるってだけ
あんたも使える道具をうまく選べばいいんでPerlを知らなくても気にするな 「Perlの方が楽に書ける」なんていうのは個人の嗜好に依存してて,ほとんど無根拠に近い。
もしPerlの「素晴しさ」とやらを報しめたいのなら,もっと客観的な事実――導入率・実績云々――を提示したほうがいいよ。
尤も,俺に言わせればAWKのほうが〜Perlのほうが〜なんていう議論とも呼べない喧嘩それ自体くだらねぇけどな >>872 sed もawk も使えるならPython を使えばいいじゃん。
お前がPythonを使えないだけだろ。 python使ってわざわざ長いコード書いてどうするの?
sed -e 's/ABC/XYZ/' file1.txt
python -c 'import sys,re; [print(re.sub("ABC","XYZ",l,1),end="") for l in sys.stdin]' pythonはワンラインにはあまり向かんのは同意。
フリーフォーマットじゃないんで当たり前といえば当たり前か。 宗教戦争は自分の信じるものが正しく、それ以外は認めないという非寛容が原因で始まる python ワンライナーに挑戦 〜 初心者のお勉強 m(_ _)m - Qiita
https://qiita.com/wyamamo/items/667c79db7edbaa9a46a7
闇Pythonista入門(Pythonワンライナーのテクニック集) - Qiita
https://qiita.com/cocuh/items/37bfdc0f24750127e7d3
杓子定規にするからこうなる
知恵比べはまた別の課題だろうに case $value in
*-*=*-*)
esac
こんなふうに、*が複数ある場合の動きとかちゃんと仕様化されてるの
どのシェルでも同じように動く? 「されてるの?」
なのか
「されてるの(だ)」
なのか。 >>883
意味がわからん
abbb 、という文字に対して、a*b はマッチするのが正しいの?
aに続く残りのbは*で全部消費されるんじゃないの?
$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c) echo ok; esac'
$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c*b*c) echo ok; esac'
$ sh -c 'case "a-b-c-b-c-b-c" in (a*b*c*b*c*b*c) echo ok; esac'
すべてokってでる
どういうアルゴリズムなのかわからない はー、すげー。yashの実装に感動した
getopts "ab" OPT -ab
echo "$OPT $OPTIND" # => a 1:2
getopts "ab" OPT -ab
echo "$OPT $OPTIND" # => b 1:3
getopts "ab" OPT -ab # exit status = 1
echo "$OPT $OPTIND" # => ? 2 if ls "*.txt" > /dev/null 2>&1
then
echo "OK"
else
echo "NG"
fi
まったくうまくいかない
なぜ単なるファイルの存在確認だけにこんな苦労するのか # # ls *txt && echo ok || echo bad
ls: '*txt' にアクセスできません: No such file or directory
bad
# # touch foo.txt
# # ls *txt && echo ok || echo bad
foo.txt
ok
こんな要領か? あ、ディレクトリに *.txt があるかどうかってことか? >>893
ところがワイルドカード使うと途端に何も引っかからなくなる getopts vs getopt だけどさ、
BSDにおいてgetoptのメリットって何?
BSD版のgetoptはロングオプションに対応してないし、
引数にスペースが入ったらうまく行かないし
使い勝手悪いと思うんだが。
もしかして最初に作られたのがgetoptで
それを改良してgetoptsがシェルビルトインとして作られた。
(その後GNU版getoptが改良され、getoptsよりも便利になった)
という流れだったりするの? 普通のプログラミング言語と違って
シェルスクリプトはブーリアンの分岐は可能なら
if else 使うよりも && || が見やすく良いと思う >>894,899
いけた
分岐後の処理も大したことしないしこれでやってみようと思うd >>896
アスタリスクを使うと、シェルが解釈して、
例えば、 ls * だと、 ls file1 file2 file3 file4 って実行したのと同じことになるんだぞ。
lsコマンドの中からはアスタリスクが使われてるかどうかなんてわからない。
そしてダブルクォートで括ると、lsコマンドの中から引数は "*" という文字列が渡されたようになるんだよ。 >>899
それだめ。 shellcheck使ってみ、エラーになる。
shellcheck において && || みたいな三項演算子風な使い方は
func && VALUE=ok || VALUE=ng
という書き方(変数代入)のみ認められる。
func && foo || bar
は認められない。
なぜかと言うと、
1. func が 正常終了して
2. foo が 異常終了すると
3. bar が 実行されるから
変数代入に限れば必ずVALUE=okは正常終了するから、
この書き方に限って許されてる。
だから、一応fooが必ず正常終了するものであれば、使えなくはないけど
静的解析ではそれを知ることが不可能なので、shellcheckはエラーになる。
あともう一つ、barが異常終了したとき、&& || だと $?はエラーになるが、
ifで書けばfi終了後、$? は正常終了になってるという違いもある。
だからset -eでの挙動が変わる。 もちろん、&& 単独、もしくは || 単独で 使うならば問題ない。
func && foo とか func || bar ならOK 今度は ls "$dir/tmp/*.txt"
みたいなことしたらアクセスできませんみたいなことを言われた
>>901
なるほど
>>902
多分"*.txt"ファイルにアクセスしようとしてできないって言われたことが原因?
でもなぜかls *.txtみたいに、ファイル直だとイケる あー、やっぱりそうなんや
https://en.wikipedia.org/wiki/Getopt
https://en.wikipedia.org/wiki/Getopts
getoptは1980年頃つくられた。初期のgetoptは低機能
その改良として getopts が1986年にBourne shellに実装されたらしい。
その後、getopts (Solaris) と getopt (GNU) それぞれ違うコマンドで
ロングオプションがサポートされ
どちらでもないBSD(macOS含む)では、従来どおり
低機能な getopt と それを少し改良した getopts があるが
どちらもロングオプションはサポートしてないと >>905
だからダブルクォートで括るからいかんのや
ls "$dir/tmp/" * ".txt"
これが正解(スペースは目立たせるために入れただけ)
この書き方ダサいよなw
ちなみに古いシェル(poshだっけ?)でこれがうまく行かない
バグがあるのだが、まあ誰も気にしないわなw getopts (Solaris) でロングオプションがサポートされたってシェルなんだ?って思ったら、
Solarisでは/usr/bin/getoptsが存在するのか・・・
紛らわしいな
https://docs.oracle.com/cd/E26924_01/html/E29112/getopts-1.html あ、いや /usr/bin/getopts もあるにはあるが、libcのgetopt()実装が拡張されたから
それを使ってるBourne Shellでも使えるようになったのか
> getopts (Solaris enhanced)
> As a result, this new feature was also available in the built-in command getopts of the Bourne Shell. >>907
うおおできた!
ls "$dir/tmp/"*".txt" && echo "ok" || echo "ng"
みたいな感じにした
(txtファイルがひとつもないときエラー出るけど!無視)
d TeXで書かれた人工知能みて,「バッドノウハウ」って言ってるみたいw GLOB展開と""内での文字列展開は別物で""内での文字列展開にGLOBは含まれないというだけだけどな マニュアルにかっちり書いてあるんだけどな
読み解くのは確かに能力が必要だが >>892-897
find . -type f -name "*.txt" | wc -l
-type f は、ファイルのみ。
wc -l は、行数を数える。無ければ、0 $ mkdir tmp && cd tmp
$ touch $'a\nb.txt'
$ find . -type f -name '*.txt' | wc -l
2 相対パスなら、-path で、カレントディレクトリからの相対パスで指定する
find . -type f -path "./test/*.rb" | wc -l なるほろ
bash によるオプション解析 - Qiita
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
bashのワイルドカード展開は該当するファイルが無いと*が展開されずに残る - Qiita
https://qiita.com/anqooqie/items/a2b607fe984ec982fa21
manはマニュアルだがman自体に取説が必要な皮肉
man manを読む時点で骨が折れるからしゃーない Ruby では、これでカレントディレクトリの該当ファイル数がわかる。
無ければ、0
ruby -e 'puts Dir.glob( "*.txt" ).length' /bin/ls -1d *.txt 2> /dev/null | wc -l find使うのは有りだと思うがmaxdepthとquitをつけたほうが良い
if test -n "$(find . -maxdepth 1 -name "*.txt" -print -quit)"; then
echo "OK"
else
echo "NG"
fi やっぱりどこでも動くシェルスクリプトなんて幻想なんだね… >>918
暇なときに man と bash の man をちゃんと読み込むことをお勧めする
全部理解するのは確かに大変だが、こんな機能があるということだけ
覚えておいて、現実の問題に直面した時に詳細を再検索するのが
実用的。bash だけの問題ではないが。 日本語版がメンテナンスされてない(もしくは遅い)だけだよ 日本語版の記述が少なくて英語版の方だけびっしりとか実にマニュアルらしい 近頃は無料で web 上で使える翻訳ソフトの質も上がっているし
頑張って読んでくれ。 ウホッ
じゃなくて
なんだ
infoとかそっちしかハッテンしてないとかあるじゃん まあ、確かに sed の s コマンドのオプションは man にも入れてほしかった。
オプション使えなくなったのかと思ったじゃないか… まあ裏を返せばそれだけ国際標準から離れていないってことよね。
ar.localeとか酷い…… あるユーザー(Aとする)が、他のユーザー(Bとする)にのみWrite権限があるファイルを削除するような作業を自動化したいです。
当然そのままでは削除できないので、AからRootに切り替わり、ファイルを削除した後、Rootを抜けてAに戻るというBashスクリプトを作成しようとしています。
AはSudoが実行できない環境で、Expectコマンドもありません。Rootのパスワードはわかっており、平文でシェルスクリプト内に書き込んでも構いません(使用者が数人で、かつ外部に接続できないため。なのでセキュリティの問題は今回は無視)。
このような状態で、どうにか目的を果たすスクリプトはかけますでしょうか。
OSはFedora10、新たにプログラムパッケージ等はインストールできません。
よろしくおねがいします。 >>934
そもそもAがファイルを消せるようにパーミッションが初めから設定されるようには出来ないの? >>934
ファイルを削除するだけの実行ファイルを作ってsetuidビット立てて所有者をBにするとかすればできないかな? 追記。シェルスクリプト自体にはsetuidは使えない。 Fedora10って10年前のかっ
su: must be run from a terminal
にならんのだったらsuでいいんじゃないの。パスワード流すのは exec ででも ディレクトリにwが付いてればファイルは消せるけどなあ >>936
パーミッションは変えない方針でいきたいですね
>>937
setuidという単語を初めて見たので、のちほど調べてみます。
>>939
su - <<EOF
password
EOF
は試しましたが、ttyを経由しろ的なメッセージで怒られました
調べたところttyなしを許可する設定がsudorsにあるらしいですが、sudoは設定したくないため、できなそうです >>941
# mkdir /dir
# chown userA:groupA /dir
# chmod 700 /dir
# cp /bin/rm /dir/rmB
# chown userB:groupB /dir/rmB
# chmod 6755 /dir/rmB
userA $ /dir/rmB /home/userB/file こんな文字列野中に含まれる数字を
ゼロパディングしたいと思います
"何とかって講義 第5回 何とか特集.mp3"
まずは2桁でそろえてやりたいのですが
grep "第[1-9]回"
で一桁のものを引っ掛けて
前後をsedで除いて
sed "s/.*第//g
sed "s/回.*//g"
ゼロ埋めはprintfで実現しようと思うのですが
printf %02d $times
もっとシンプルな方法は無いでしょうか? なお最終的な文字列の組み立てなおしは
数字の前後も抽出して3つを連結するつもりです perl5 が使えるなら
echo "何とかって講義 第2345回 何とか特集.mp3" | perl -pe 's/第(\d+)回/ sprintf "第%06d回", $1/exm'
何とかって講義 第002345回 何とか特集.mp3 $ echo "何とかって講義 第2345回 何とか特集.mp3" | sed -E 's/第([0-9]+)回/第000000\1回/; s/0*([0-9]{6})/\1/'
6桁揃えにしたければ最初に6個0を足して次に6桁のみ残す
$ rename -n 's/\d+/sprintf("%06d",$&)/e' *.mp3
rename utilityが使えるならsprintfが使える >>945-946
ありがとうございます
perlは入っており期待通りに動作しました
perlの方が高機能なのですが
環境を移したときにperlがあるか保証できないため
sedでやろうと思います FLAG=true or false ?
FLAG=1 or 0 ?
FLAG=1 or unset ?
FLAG=1 or "" ?
それ以外? alias FLAG true/alias FLAG false
if FLAG; then >>952
面白いけど、サブシェルの中で変えられないから
alias FLAG=true
(
alias FLAG=false
if FLAG; then
echo true
fi
)
出力
true TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)
FLAG=$TRUE or $FALSE サイトによってrenameの構文が違うけどコマンド自体が違うのな
perl付属のprenameとutil-linux付属のrename.ulがあるとか
alternativesで書き換えられてるんだからそら気付かんわ >>954
それってTRUE=0とするのと何が違うの? >>956
サブシェルは関係ない。俺もちゃんと仕様読んだわけじゃないけど、
aliasは実行時じゃなくて、1単位ごとに → パース → 実行 の
パース時に変換してる感じ
そして1単位というのは、
alias FLAG=true
alias FLAG=false; FLAG && echo true
↑これは一行で一単位、だからtrueと表示されてしまうし
関数とか、プロンプトから、func() { 改行 とかやると
} 改行 するまで、ずっと行頭に > って表示されるだろ?
あれが1単位。だから↓みたいなものもtrueって表示されてしまうんだよ
alias FLAG=true
func() {
alias FLAG=false
if FLAG; then
echo true
fi
}
func >>795-797
時間が経ってしまいましたが、ありがとうございました
"$()"の中の"はエスケープする必要があるのかどうか、とか、変数代入への挙動とか、そういう細かいところがよくわかってなかったです。 >>958
あー。
aliasってたしか一つの構文解析のかなり初期段階で展開される筈だから,
その一つの解析対象の内部で定義されているaliasは(当然)それ自身の解析結果には反映されんな。
このへんだろうか??
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10 >>957
真は0、偽は0以外という値を意識する必要が無い
(Cの真偽値は逆で紛らわしい)
true/falseコマンドが使えない環境でも使える >>962
true/falseがビルトインじゃないシェルは存在しない
また、[ の結果はtrueなら0、falseなら1と決まっている >>963
> true/falseがビルトインじゃないシェルは存在しない
今ならそう言えるだろうが、かつては存在した
外部コマンドのtrue/falseがその名残りだ
> また、[ の結果はtrueなら0、falseなら1と決まっている
0は数値の0であってtrueではない
trueを表現するのに0を使っているだけだ
まあ真偽値を扱うならtrue/falseを使えってことだな trueを表現するのに0を使っているというより、真偽に成功不成功をそのまま使ってるというだけだろ >>964
> 今ならそう言えるだろうが、かつては存在した
かつてとはいつで、どこの実装であるのか答えなさい
また、現存しない物の話をしても意味はない
そもそも [ が存在しない環境では使えない
外部コマンドの [ がその名残りだ 成功/不成功は終了ステータスであって真偽値ではない え、まさか、
hoge && FLAG=$TRUE || FLAG=$FALSE
:
:
if [ "$FLAG" -eq "$TRUE" ] then ・・・
if [ "$FLAG" -eq "$FALSE" ] then ・・・
とか書くつもり・・・? >>968
終了ステータスを真偽値で判断するのか
珍しいやつだなw >>969
変数に真偽値を入れるって話で
終了ステータスを入れる馬鹿を皮肉ってるだけだろw while true
do
や、
FLAG=true
or
FLAG=false
if $FLAG; then
真偽に成功不成功をそのままは、なんて書きたかっただけだろ、そうの方が見た目がいいしな
なんでそんなに拘っているんだか つーか、いいかげんにしろよ。
真偽値の値を何にするかって話だろ
誰も真偽値をどうやって生成するかの話なんかしてねーよ いつものやつ言っとくわ
>>971
/\___/\
/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたはじまった
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\ FLAG=true or false
FLAG=1 or 0
etc
なんでも好きにすればいいだろ
true/falseコマンドを使った方が見た目簡潔じゃないかと思うがな、個人的に。使わんけど
お前がいいかげんにしろよw 質問が出てる時点で、意図がわからないコードってことなんだがw
957 名前:デフォルトの名無しさん[sage] 投稿日:2019/10/24(木) 17:49:17.77 ID:mthfJT/n [2/3]
>>954
それってTRUE=0とするのと何が違うの?
それに>>954ののコードは、set -eで正しく動かない
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)
意図が不明確なコードを書いて、バグを入れるのは
アホでしか無いよ 俺は他alias使ったのやのその話題は、なにをわざわざ凝ったことしようとしてるのか意図不明で趣味なんだろなとしか思ってない やっぱりどこでも動くシェルスクリプトなんて幻想なんだね… >>976
趣味(実用的ではないネタコード)に、正当っぽい理由をつけるなって話だ ただの雑談だろ
あれを強制するなりしているわけでもないのに、なにをそう否定してんだか
そんなヤツがリアルで一緒に仕事するなら思いっきりくそ叩くがなw あとC言語の世界しか知らんようだから言っておくと、rubyは0も1もtrueな
シェルスクリプトは反対で0がtrueで1がfalseなんだ、それ以外の回答はない!ってのは
ちょっと考えが浅いんじゃないですかねぇw
http://osishow3.hateblo.jp/entry/2017/04/20/235500
nil is false
false is false
0 is true
1 is true 何をひとりで妄想に走っているんだか
だれか「いいかげんにしろ」とか言ってなかったか?w 俺に突っかかってきてないで、シェルスクリプトの話題をしたら? そりゃいうだろ、いきなりシェルスクリプトと関係ない
「俺」の話を始めるんだからw 言ったことに対してはそりゃ言うだろう。お前がわざわざ言ったんだから
そんなのが無くてもいいのに。お前だった元々のやつを「アホ」呼ばわりしてるじゃん >>975
set +e
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)
set -e
動かんと言ってる方がアホだと思う set -eで正しく動かない
↓
set +eと書いて動くと主張。赤っ恥w しかも、最初の状態が set +e だったら
set -e に状態が変わってしまうというクソコード
汎用性がない true / false を使えばいいのに、[ が入ってない環境を考慮せずに、
true / false が入ってないかもしれないから [ を使ったと言う無能ぶりw 最初にset -eするとルール化するだけ
いちゃもんつけるの得意だな TRUEの反対だからfalseというが、
FALSEの反対もfalseになってると気づいてなくて
そもそもシェルスクリプトの仕様をわかってないw
[ 0 = 0 ]; echo $? # => 0
[ ! 0 ]; echo $? # => 1
[ ! 1 ]; echo $? # => 1 >>992
上の方で /bin/true, /bin/false コマンドがあるんだから
true, false が使えないシェルがあるはずだって主張していたぞw
その理屈で言えば [ コマンドもあるんだから、 [ が使えないシェルもあるってことになるんだがなw 更に言うなら
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)
これにサブシェルを使うのもアホらしいw >>994
cshのbuiltin調べてこい
分かったらすいませんって言えよw >>1みろ
csh/tcshでのシェルスクリプトは*まったく推奨しません*。 あーいつものマウントとらないと死ぬ病気のやつか
おだいじに >>1じゃなくて>>2だったな
> ・特記なき場合、POSIX 準拠の sh 可換シェルが既定です。(Bourne Shellは既にレガシーです) このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 76日 17時間 12分 59秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。