[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 04/11 08:58 / Filesize : 268 KB / Number-of Response : 1033
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:07:26.41 .net]
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
echo.2ch.net/test/read.cgi/unix/1439563321/

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 14:01:21.67 .net]
for使ってfindっぽいものを自作したとして
それをパイプで別コマンドに流そうとした時に
またファイル名に改行が含まれていた時問題が発生するんだよな

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:15:24.81 .net]
for で書くのなら、その結果のファイル名をわざわざ
他のプロセスにパイプで渡すなんてことはせずに、
そのシェル自身で処理するか、
あるいは他のプロセスに渡すなら引数を使え
ってだけの話だな。

>>764 が既に書いてる話なのに、なんでそこから
35コメも無駄に費やされてるんだか。

811 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:18:45.25 .net]
ちなみに for で書く以外のやりかたもあるけど、
これも >>764 が既に最後の文で書いてる。

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:30:33.97 .net]
posixの範囲じゃ改行が含まれたファイル名を
パイプでつなげられないってことかな

813 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 15:56:18.36 .net]
>>792
「POSIXの範囲内じゃ」は誤解を招く表現で、正確には
「POSIX Shell & Utilities の範囲内じゃ」だな。
「POSIX System Interfaces」を使えば問題なくできるからな。
まあシェルのスレなわけで「POSIXの範囲内じゃ」でも間違いとまでは言えないが。

あと、find -print0 が POSIX で規定されたってのは間違いだった。
そういう拡張もあることも言及はされてるが、規定には追加されていない。
でもって POSIX 的には「find -print0 | xargs -0」じゃなくて、
「find -exec コマンド {} +」を使えってことになってる。

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 16:20:44.05 .net]
でも、find -exec じゃシェル関数に渡せないからなぁ
findは諦めろってことかな

815 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 16:44:16.87 .net]
find を諦めるんじゃくて、シェル関数の方をあきらめて、独立したシェルスクリプトにしろってことだよ。
find -exec コマンド {} \;
だとコマンドの起動回数が多いからシェルスクリプトにすると遅いのが問題になるけど、
find -exec コマンド {} +
ならコマンド起動回数は相当に減るから、独立したシェルスクリプトにしても特に問題はない。

816 名前:名無しさん@お腹いっぱい。 [2018/03/29(木) 21:07:16.05 .net]
AWKの区切り記号をヌル文字にすればいいんでは。

817 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/29(木) 23:50:16.88 .net]
ぬるぽ?



818 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 00:19:50.52 .net]
>>796
試してみたけどね。RSに\0入れられなくてね
もう全滅w

819 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 02:47:00.90 .net]
>>798
俺の所では通ったけど、もしかしてOS依存なのかな。
@Debian GNU/Linux

820 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 03:18:23.09 .net]
OSっていうかGNU系かどうかだね
GNU系はだいたい\0に対応している
BSD系とかは対応してない。だからMacとかつらい

私的なスクリプトならMacのコマンドをGNU化するやつ
入れて済ませても良いんだが

821 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 12:29:37.47 .net]
>>795
バカwww

822 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 12:30:43.62 .net]
このスレでこんなに草を見るとは思わなかった

823 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 13:42:54.12 .net]
シェル関数にこだわる理由が思いつかん。

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 15:22:07.88 .net]
そこにシェルスクリプトがあるから、的な何かかな?

825 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 15:47:33.25 .net]
コンパイルせずに実行できる(実質)唯一の共通規格言語だからじゃないの?
PythonとかはPOSIXの範囲外だからどこでも動くとは限らないし。
え? UNIX™なのにPOSIXと齟齬ありまくりの実装のAIXちゃん? 知らない子ですねぇ……。

826 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 16:25:04.06 .net]
localみたいにPOSIXじゃないけどだいたい
使えるってもの他にあったら教えて📡

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 16:38:24.19 .net]
AIXはマジでどうにかして欲しい
seqすらないの本当に面倒臭い



828 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:03:19.85 .net]
AIX案件なんてあるの?

829 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:23:17.72 .net]
俺が行ってる現場だと1年くらい前までは現役でPowerでAIXを使ってたよ。
今はRedHatにリプレースされちゃったけど……そんなに嫌いではなかった。

>>807
jotも無かったっけ?

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 17:29:23.50 .net]
うちは親会社モニョモニョだから結構AIXが多くて嫌になる

>>809
手元のやつだとないな。AIX7.1だけど

831 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:26:28.33 .net]
>>804 >>805
それならシェル関数ではなく普通のシェルスクリプトでもいいだろう。
>>794 は単なるシェルスクリプトではなくシェル関数の利用にこだわってて謎。

832 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:31:30.33 .net]
シェル函数って
somefunc() {
echo "This is somefunc."
}
っていうやつでしょ?
>>794はそういう意味で使ったんじゃない可能性が出てきたな。
単に「パイプに渡せない」というような趣旨の要望を言いたかったのかもしれん。

833 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:47:44.46 .net]
>>812
たぶん find の -exec のとこに書けないって意味で書いてるだろうから、
シェルスクリプトじゃなくてシェル関数だと思う。

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 20:54:31.32 .net]
たとえパイプ経由でファイル名を渡せないって意味だったとしても、
find -exec でそれと同一機能が実現できるならそ別にいいじゃん。
>>794が find -exec の何を気に入らないのかやっぱり分からんな。

835 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:02:32.72 .net]
まぁでも「気に入らない」ってのは十分不採用の理由にはなるよな

836 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:09:13.58 .net]
趣味なら理由になるかもなあ。

でも仕事じゃ理由にならん。
要件を満たしてるってのは仕事じゃ最低限度の基準だからな。

POSIXに適合するシェルスクリプトにしたいっていう要件が最初に出てるのに、
趣味に合わないから採用しない、仕方ないから実装を諦めるなんて奴がいたら、
仕事なら無能扱いだよ。

837 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:13:23.18 .net]
そりゃ仕事と趣味は別だろ
何を当たり前の話をしてるんだ



838 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/30(金) 21:31:21.92 .net]
いや、あの謎のこだわりに合理的な理由があるのか、
それともホントに完全に趣味だけの話なのかが気になってたんだよ。
合理的理由ナシ、完全に個人の趣味ってことでFAなら、それでいいんだスマン。

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 00:46:42.95 .net]
合理的じゃないけど合理主義だよね

840 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 01:12:03.45 .net]
aliasって面白いなー。これでなんか面白いことできそう

#!/bin/sh

alias foo="foo() { echo before; foo_; echo after; }; foo_"
foo() {
echo foo
}
unalias foo

foo
# ↓
# before
# foo
# after

841 名前:817 mailto:sage [2018/03/31(土) 01:41:51.42 .net]
やべぇ、このaliasの使い方、
めちゃくちゃ強力じゃないか?
文法の拡張が可能かもしれない
こんな所でネタにするレベルじゃないわ

842 名前:817 mailto:sage [2018/03/31(土) 02:06 ]
[ここ壊れてます]

843 名前::02.61 .net mailto: 黒魔術置いときますね

#!/bin/sh

def() {
alias begin="$1() { echo before; $1_ "\$@"; echo after; }; $1_() { $3=\$1"
alias end="}; unalias begin end"
}

def foo [ i ]
begin
echo foo $i
end

def bar [ j ]
begin
echo bar $j
end

foo 123
bar 456
[]
[ここ壊れてます]

844 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:30:40.57 .net]
そもそもaliasってシェルスクリプトの中で使えたっけ。
俺の環境では使えたけども

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:48:01.26 .net]
>>823
bashとかだとデフォルトでは無効
expand_aliasesを使えば有効にできる

ただ>>820の挙動が全てのシェルで同じなのかは調べてない
aliasの挙動をちゃんと把握してはないけど
どうやら行単位で実行前に、単純な文字列置換が行われてる感じだね

だからevalでもできないスクリプトの自己書き換えみたいなことができちゃう

参考(ちゃんと読んではいないw)
magicant.txt-nifty.com/main/2017/10/yash-2-285-b4d8.html

846 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 02:57:08.73 .net]
AIXの人はseqってどうやって代用してる?

847 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 09:20:43.88 .net]
awkでチョチョイでは?



848 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 22:32:30.06 .net]
みんな、変わった(?)の使ってるな。
Linux、BSD、Solarisなどのメジャーなもの以外で何がよく使われてるの?

849 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/03/31(土) 22:52:09.24 .net]
Mac

850 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/01(日) 01:13:29.58 .net]
MacはBSD系ってことでまとめましょうw

851 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 07:41:52.65 .net]
$ man basename > man_basenam
でできるファイルを
emacsとテキストエディットで開いたものが次のものです。
https://imgur.com/a/8ggUs?
これはそういう仕様なのでしょうか?文字化けというか不思議な
コードになっています。できれば教えていただけないでしょうか

852 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 08:19:02.96 .net]
surf.ml.seikei.ac.jp/~nakano/JMwww/html/man/man1/man.1.html

バックスペースとアンダースコアがない プレーンテキスト版の man ページを得るには、コマンド


# man foo | col -b > foo.mantxt

を実行すること。

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 08:25:59.92 .net]
>>830
man エスケープシークエンス
で検索。

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 10:28:43.52 .net]
man manすればいい
TIPSに載ってる

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 14:17:49.92 .net]
あと、emacs に限って言うと
M-x man
(ESC x man リターン)
と叩いて、man のエントリー名を入れれば、
きっちり整形した結果を表示してくれるから、
col -b を使う必要はあまりない。

856 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 18:03:58.27 .net]
>>825
ググってみたらこんな方法があったよ。

yes '' | cat -n | head -100 | sed 's/ //g'

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 18:24:12.37 .net]
yesはなんか処理間違えると止まらなくなりそうで怖いんだよな



858 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:00:30.14 .net]
>>835
POSIX catには-nオプションがない[*1]のでnlコマンドを使う方法を提案する。
 $ yes '' | nl -b a -n ln | head -n 10 | sed -e 's/[ \t]*//g' | tr '\n' ' '

*1: pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html

859 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:07:04.97 .net]
 $ yes '' | nl -b a | head -n 10 | tr -d ' \t' | tr '\n' ' '
修正。もっと簡単にできるわww

860 名前:834 mailto:sage [2018/04/02(月) 21:28:17.87 .net]
これもしかしたらheadコマンドとnlコマンドの順番入れ替えると速度違う?
んなことないと思ってたけどビミョーに差があるかもしれん。
詳しい人検証してくれ……。
$ time

861 名前: for a in $(seq 10000); do seq 10000 > /dev/null; done
real 0m14.601s
user 0m0.452s
sys 0m3.736s
$ time for a in $(seq 10000); do yes '' | nl -b a | head -n 10000 | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 1m2.693s
user 0m5.672s
sys 0m21.032s
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 0m47.944s
user 0m1.472s
sys 0m17.820s
[]
[ここ壊れてます]

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 21:41:13.89 .net]
並行して動くか、出力の完了を待ってから動くかの違いだろ

863 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/02(月) 23:47:22.15 .net]
パイプで繋いでプロセス4つも5つも上げるくらいなら、
素直にawk 1プロセスですませた方が軽くないか?

864 名前:836 mailto:sage [2018/04/02(月) 23:56:24.81 .net]
>>841
俺awkできないんだわ。恥かしいことにw
そのうち勉強しようしようと思っていて今にいたる。

awkでやるとどんな感じになる?

865 名前:836 mailto:sage [2018/04/03(火) 00:14:31.67 .net]
ていうかseqの既定の出力を勘違いしてた
 $ yes '' | head -n 10 | nl -b a | tr -c -d '\n[:digit:]'
こんなもんかな?
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -c -d '\n[:digit:]' > /dev/null ; done

real 0m42.358s
user 0m0.544s
sys 0m14.452s

866 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 00:40:30.08 .net]
awk 'BEGIN {for(i=10;i<=20;i++) printf "%d\n",i}'

867 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 01:08:09.19 .net]
yes '' | sed -n '=;10q'



868 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 14:22:10.27 .net]
sedでやるとは

869 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 18:22:16.97 .net]
何かゴルフっぽくなってきてるw

>>845
これ凄いね!

870 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 18:57:15.26 .net]
sedって計算完備なんだっけ。
やろうと思えばsed単体でseq作れるよね

871 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 19:03:30.37 .net]
sedでlispを作った人はいる

872 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 19:33:57.64 .net]
どうかしてるぜ

873 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 22:20:55.54 .net]
>>845
使うことないだろうけど感動した

874 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/03(火) 23:45:32.30 .net]
そんなことより野球やろうぜ

875 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/04(水) 07:05:11.03 .net]
>>848
> sedって計算完備なんだっけ。
www.catonmat.net/blog/proof-that-sed-is-turing-complete/

876 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 00:02:39.79 .net]
家具家電彼女完備の家に住みたい

877 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 02:42:14.79 .net]
sinyabin.shの中でradiru.shを実行しています。
sinyabin.shの中の変数をradiru.shに引き継ぎたいんですが、どう書けばいいんでしょうか?



878 名前:852 mailto:sage [2018/04/05(木) 03:31:27.11 .net]
radiru.shには、
pushbulettに録音開始の通知
ffmpegを使ってaacのダウンロード
l-smashを使ってaacをm4aに詰め替え
aacの削除
dropboxへm4aのアップロード
ローカルのm4aの削除
pushbulettに録音終了の通知をするコマンドを記入

radiru.shは
$ sinyabin.sh チャンネル 録音時間 ファイル名
で録音出来るようになっているので、

録画したい番組毎にsinyabin.sh等を作りその中に、
$ sinyabin.sh チャンネル 録音時間 ファイル名
を記入しています。

radiru.shの中のl-smashでaacをm4aにする際に番組名やアーティスト名などのタグ付けも一緒にやりたいので、sinyabin.sh側であらかじめl-smashで指定するタグのオプションを記入出来ればと思いました。

879 名前:852 mailto:sage [2018/04/05(木) 03:41:17.05 .net]
radiru.shはaacのダウンロードだけにして、
Pushbulettへの通知、l-smash、Dropboxなどはsinyabin.shの方に書いたほうがいいんでしょうか?
そうすれば、ちょっと録音したいと思ったときいちいち番組毎のスクリプトをつくりその中にIDタグなど細かく書かなくてもすむから楽かなと。
でもそれだと、番組毎のスクリプトに「Pushbulettへの通知、l-smash、Dropbox」といったコマンドを書かないといけないので無駄かなあとも思いました。
どういうフローがいいと思いますか?

880 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:10:37.31 .net]
export すりゃいいんじゃない

881 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:22:06.60 .net]
こう質問の仕方が下手だと答える気失せるな
変数外に出せばいい

882 名前:セけ []
[ここ壊れてます]

883 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:59:32.39 .net]
852だけで良かったのにね

884 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 13:53:42.01 .net]
プログラミング素人っぽいし、加減がわかってないだろうから、
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。

885 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 18:12:51.21 .net]
>>856
radiru.sh に引数でタグ情報を渡せばいいと思いますが。

886 名前:名無しさん@お腹いっぱい。 [2018/04/12(木) 09:36:41.69 .net]
bashだと$LINENOでファイルの中での現在の行数が取得できるのですが、
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?

887 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:02:57.86 .net]
zshよくしらんけど、関数定義の手前の行番号を
変数にでも取っといて足し算すりゃいいんじゃね?



888 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:07:33.88 .net]
まぁやりようは如何様にでもあるんだろうが、
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん

889 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:14:56.99 .net]
$LINENOってどういう使い方を想定して作ったんだろうね

890 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:51:23.99 .net]
どこを見ればPOSIXシェルスクリプトの確かな仕様に出会えるのか知らないけど、
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

891 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 23:40:07.60 .net]
実装オプションにつけてあるIDコードの一つみたいだな。
コードの一覧は
ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html
にある。

オプション機能なので、実装されてるとは限らない。

892 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 00:40:09.23 .net]
LINENOが仕様どおりに実装されてないのは
この際見なかったことにして、現在使われてる
POSIX準拠シェルで完全に実装されてないものなんて有るの?

そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう
bash、ash、dash、zsh、ksh、mksh、yash、posh
他に知ってる?

893 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 16:31:32.55 .net]
$LINENO使って何をしたいんだろ

894 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:01:06.26 .net]
デバッグログ以外になにかあんの?
だからこそデバッグログとして使えない
$LINENOを何のために作ったのか理解できない

895 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:14:03.26 .net]
${(%):-%I}

896 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 20:10:19.92 .net]
$ ${(%):-%I}
-bash: ${(%):-%I}: 誤った代入です

897 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/17(火) 22:14:01.26 .net]
https://ja.wikipedia.org/wiki/IOCCC

> ^ Bourne Shellのソースコード( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は
> マクロ( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した
> 「ALGOLのような見た目のC」で書かれていることで悪名高い



898 名前:名無しさん@お腹いっぱい。 [2018/04/18(水) 10:39:06.43 .net]
自己解凍するファイルって便利だな
シェルスクリプトで解凍とインストール手順を記述して
それをバイナリと結合するだけでmsiみたいなことができる

899 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:04:27.31 .net]
>>875
それはちなみに sh アーカイブ形式って呼び名がついてる。
sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。

なお、ウイルスやマルウェアの温床だということで廃れた模様。

900 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:22:26.44 .net]
sharはそれでインストールまでするというより、tar.gz などのバイナリファイルを
テキストにしてメールやニュースで送るために使うことが多かった

901 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 16:21:07.45 .net]
>>877
へー、uuencodeしか知らんかった

902 名前:872 mailto:sage [2018/04/18(水) 21:50:42.61 .net]
あーわりと昔からある手法なのね……
VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで
画期的なアイデアに思えたんだわ……

903 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:47:33.56 .net]
echo "1 + 2" | bc > /tmp/a
とすると/tmp/aには2バイト、16進数で
33 0a のデータが入っています。

a=$(echo "1 + 2" | bc)
printf "$a" > /tmp/a
しかしこうすると$aには1バイトしか入ってないようです。

また [ "$(printf '1')" = "$(printf "1\n\n\n\n\n")" ]
これは一致した文字とみなされるようです

こういった挙動はどこを見れば理解できるでしょうか?

904 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:55:18.86 .net]
a="$(printf '1\n\n\n')"
とやってもaには1しか入っていない

a="$(printf '1\n\n\n2')"
しかしこうすると5バイト入ってる

その状態から a=${a%?} を末尾の2を削除すると
a には4バイト、1\n\n\n が入っている

うーん?

905 名前:名無しさん@お腹いっぱい。 [2018/04/19(木) 00:06:08.07 .net]
>>880
コマンド置換 $(...) の仕様

pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of
> the substitution. Embedded <newline> characters before the end of
> the output shall not be removed; however, they may be treated as
> field delimiters and eliminated during field splitting, depending on
> the value of IFS and quoting that is in effect. If the output
> contains any null bytes, the behavior is unspecified.

bashのマニュアルにも同様の記述がある

linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。

906 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:06:21.64 .net]
かといってこうやると4バイトでてるんだよなー

printf '1\n\n\n' | hexdump.exe -C

907 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:19:37.42 .net]
コマンド置換の仕様かぁ

普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー

ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ



908 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:24:31.94 .net]
あたりまえやろw

909 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:54:10.53 .net]
よくこんな単純なルールで辻褄取れてるよなー
思いつきで考えたとしか思えないルールなのにw






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef