19/10/25 00:09:51.40 6btPTvif.net
・特記なき場合、POSIX準拠シェルが既定です
POSIX準拠シェルとBourneシェルの区別はついていますか?BourneシェルはUNIXで過去広く使われたシェルで
多くの亜種が存在します。Bourneシェルの後継で標準化されたものがPOSIX準拠シェルです
参考 URLリンク(unix.stackexchange.com)
POSIX準拠シェルは(d)ash, bash, zsh, (m)ksh, yash, posh, (p)boshです
特定のシェル(特にPOSIX準拠シェルではないfish, (t)csh等)の専用機能に依存する場合は明示しましょう
・デフォルトシェルのシバンはBourneシェル時代からの伝統で#!/bin/shを使用します。ただしその実体はOSによって様々です
Debian,Ubuntu … dash
CentOS … bash
FreeBSD … ash
Solaris,OpenBSD … ksh
macOS … 改変版bash
android … mksh
自覚なきbashism、シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?#!/bin/shを使うならシェル依存は厳禁です
macOSのbashはSingle UNIX Specificationに準拠するために改変されており一部動作が異なるので注意しましょう
・Bourneシェルは既にレガシーです
歴史
3:的資料 https://www.in-ulm.de/~mascheck/ Bourneシェル≒Version 7 UNIXのshに一番近いのはOpenSolaris由来のHeirloom Bourne Shell、次点でSchily Bourne Shellのoboshです Heirloom Bourne Shell: sh http://heirloom.sourceforge.net/sh.html Schily Bourne Shell: obosh http://schilytools.sourceforge.net/bosh.html ・POSIXに準拠しましょう 有用なリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています 最新の仕様はこちら http://pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」から) ・csh/tcshでのシェルスクリプトは*まったく推奨しません* 参考 http://www.speech-lab.org/~hiroki/csh-whynot.euc ・Linux/UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。Manページや各種リンクを見ましょう aproposやman -kでそれらしい単語による簡単な検索もできます ・ワイルドカードは正規表現ではありません 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな
4:デフォルトの名無しさん
19/10/25 00:10:25.47 6btPTvif.net
関連スレ
【Bash】Windows Subsystem for Linux【WSL】6
スレリンク(linux板)
Bashでプログラミング [転載禁止](c)2ch.net
スレリンク(linux板)
シェルスクリプト総合 その28
スレリンク(unix板)
zsh その7
スレリンク(unix板)
【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
スレリンク(unix板)
5:デフォルトの名無しさん
19/10/25 00:31:55.29 pN2Np6rx.net
隣で仕事してる他社のチームが、新人にコマンドプロンプトのことをMS-DOSって教えてて笑える
6:デフォルトの名無しさん
19/10/25 02:33:05.14 IsBuDbrd.net
業界内で技術用語を正確に把握している人が果たして何人いるんだろうか?
7:デフォルトの名無しさん
19/10/25 15:16:28.60 L9QL6FGO.net
コマンドプロンプトのことをなんと教えるか?
× MS-DOSのようなもの
○ ハドソンのゲーム、バニーガール殺人事件のようなもの
URLリンク(middle-edge.jp)
8:デフォルトの名無しさん
19/10/25 18:14:14.63 ggZuLyhL.net
Win9xまではコマンドプロンプトのアイコンがMSDOSだったんだぜ
9:デフォルトの名無しさん
19/10/25 19:44:43.63 f89Z34lq.net
あれって MS-DOS プロンプトって名前じゃなかった?
Windows NT の方はコマンドプロンプト。
10:デフォルトの名無しさん
19/10/25 21:05:38.68 AWtm0G4L.net
先輩がコマプロとか言っててキモかったな(´・ω・`)
11:デフォルトの名無しさん
19/10/25 21:16:19.65 Qd2+OiXZ.net
そういう誰も効かない変な略し方ってどうやって生まれるんだろうね?
俺の知り合いは、AMDをアーマーデーとか言ってた。なんで伸ばすん?
12:デフォルトの名無しさん
19/10/25 23:38:51.04 9ZGj0mXw.net
ドイツ語読みだとしてもマーがおかC
13:デフォルトの名無しさん
19/10/25 23:59:50.22 6xV0MpQs.net
そういえばもうDOSプロンプトって言い方しなくなったな
14:デフォルトの名無しさん
19/10/26 00:00:29.42 hrL9FWKp.net
XP以降しか使ったことがないって人も増えたからね
15:デフォルトの名無しさん
19/10/26 16:02:34.81 5U6kcXeJ.net
MS-DOS の話をしても現在の Windows で再現できないという理由で嘘つき呼ばわりされる。
16:デフォルトの名無しさん
19/10/26 16:33:49.92 +M+pJ73c.net
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)
FLAG=$TRUE or $FALSE
↑クソコード
理由
true / false を使えばいい
true / false がない環境があるかもという理屈なら、 [ がない環境もあるかもと考えろ
set -e のときに動かない
[ ! $FALSE ]; echo $? が 1($FALSEと同じ値)を返すことに気づいていない
サブシェルを使うのもアホらしい
たったこれだけのコードに、こんだけのツッコミができるとはw
17:デフォルトの名無しさん
19/10/26 16:35:45.72 +M+pJ73c.net
TRUE=0
FALSE=1
と書いたほうが遥かにマシだが、
これでも、[ $TRUE ] も [ $FALSE ] も共に 0(成功)を返すので
なんだかなーって感じw
18:デフォルトの名無しさん
19/10/26 16:38:37.76 +M+pJ73c.net
>>15は [ ! $TRUE ] ← こういうコードを書いてますが、
つまりこういうことですよ
FLAG=$FALSE
if [ $FLAG ]; then
echo ここが実行されるwww
fi
19:デフォルトの名無しさん
19/10/26 16:49:43.23 +M+pJ73c.net
変数($FLAG)に、0 or 1 を入れてる人は、
こういう書き方をしたいかんのやで
if [ $FLAG ]; then
if [ ! $FLAG ]; then
if [ $FLAG -eq $TRUE ]; then とか
if [ $FLAG -ne $TRUE ]; then って書かないといかん
20:デフォルトの名無しさん
19/10/26 17:19:51.21 swDBEFOl.net
if $FLAG ; then
書き方も知らんらしいw
21:デフォルトの名無しさん
19/10/26 20:30:57.76 +M+pJ73c.net
0: コマンドが見つかりません
www
22:デフォルトの名無しさん
19/10/26 21:19:29.63 axNoNf0W.net
URLリンク(stackoverflow.com)
23:デフォルトの名無しさん
19/10/26 21:55:28.23 NL9ts++5.net
>>21
Mikuの回答とやらで混乱しすぎててわろたw
ま、普通考えて、変数の内容を実行するのは危険だわな
24:デフォルトの名無しさん
19/10/26 23:37:13.88 9r5pzvRl.net
いつものとっちゃんが来てたのか
25:デフォルトの名無しさん
19/10/26 23:42:04.85 Mu/CRk1W.net
0: コマンドが見つかりません
を確かめようと、WSLで実行したらエラー無く実行されたw
/mnt/c/WINDOWS/system32/0
というファイルが有る。
サイズゼロだから問題ないが、なんだこれw
ちなみに1はないのでエラーになる
26:デフォルトの名無しさん
19/10/27 12:52:55.51 HgLbCoih.net
>>9
DECのVAX上で動くシェルスクリプトのようなものでコマプロってあったな
先輩からはコマンドプロシジャーの略って聞いたけど
今調べると「DCL および MCR コマンド言語インタプリタ」って言うのっぽい
適当にぐぐって出てきたPDFに載ってるそれらしい用語だけどさ
20年以上前の話だ、なつかしい・・・
27:デフォルトの名無しさん
19/10/27 23:45:43 seZQk3at.net
質問スレでこっちでやれってレスもらったのできました。
そのまま同じ書き込みします。
↓
リモートで最新の1つを残してログを削除したいです。
$ s
28:sh host 'rm -f `ls -1t /home/app/201910/*.log | tail -n+2`' これを複数のディレクトリで実行しようとしたのが、 var1=201909 var2=201910 array=($var1 $var2) for var in ${array[@]} do ssh host rm -f $(tail -n+2 $(ls -1t /home/app/${var}/*.log)) done なのですが、ls -1t /home/app/${var}/*.logがローカルで実行されてしまい ます。(ls: /home/app/201909/*.log: No such file or directory) うまくいくようにアドバイスなどいただけるとうれしいです。
29:デフォルトの名無しさん
19/10/28 00:08:46 +rzOrIi/.net
rm以降をクウォートしてないからじゃないの?
30:デフォルトの名無しさん
19/10/28 00:11:36 UoBv9hmi.net
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'
とか
31:デフォルトの名無しさん
19/10/28 00:25:54 IRy7CIwD.net
クォートと中なら、平気、なの
32:デフォルトの名無しさん
19/10/28 00:28:19 XocDEeOH.net
この程度でいちいちbash依存しないでほしい
set -- 201909 201910
for var in $@
33:デフォルトの名無しさん
19/10/28 00:34:13 UoBv9hmi.net
for loop の場合、デフォルトでは "$@" が対象になるので
for var;do ... ;done
と書ける
34:デフォルトの名無しさん
19/10/28 00:48:08 h0m+PRW8.net
>>27
クォートしても同じでした。
ls: /home/app/201909/*.log: No such file or directory
>>28
リモート側が
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
を返してきました。
>>30
ハゲろ!
35:デフォルトの名無しさん
19/10/28 00:49:49 +rzOrIi/.net
>>26
ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'
ってやればいいと思うけど
>>28の人が書いたようにパイプ使ったほうが読みやすい
36:デフォルトの名無しさん
19/10/28 00:50:45 UoBv9hmi.net
$HOME/.ssh/config に RequestTTY とか書いてない?
37:デフォルトの名無しさん
19/10/28 01:18:31 h0m+PRW8.net
考えてくれて、レスをくれてありがとうございます。
>>28>>31
for var;do ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f' ;done
hoge.sh: 行 38: 予期しないトークン `done' 周辺に構文エラーがあります
をリモート側が返しました。
>>33
+ ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'
bash: 警告: command substitution: ignored null byte in input
bash: /bin/rm: 引数リストが長すぎます
>>34
リモートには~/.ssh/configは無くて、ローカルはUser、HostName、Port、
IdentityFile、ServerAliveIntervalを書いてます。
取り急ぎ報告します。エラーについては調べてみます。
38:デフォルトの名無しさん
19/10/28 01:42:31.88 h0m+PRW8.net
bash: /bin/rm: 引数リストが長すぎます
についてはしかたないので>>28さんのパイプを使うことにしました。
/dev/tty を読み込むために開けませんでした
についてはsshにtオプションをつけました。
`done' 周辺に構文エラーはこれから調べます。
とりあえず当初の目的は達成できました。
みんな親切にありがとうございます。
39:デフォルトの名無しさん
19/10/28 13:32:08.60 S2HNyEoD.net
curl ja.wttr.in/tokyo
curl cheat.sh/ls
これ以外に端末で使える便利サイトってある?
40:デフォルトの名無しさん
19/10/28 13:35:16.78 tEsfLTI+.net
宣伝おつ
41:デフォルトの名無しさん
19/10/29 09:50:33 zCzSjgo7.net
sshを複数回動かすよりも一回で全部やらせちゃった方が効率良いような気がするんだ
42:デフォルトの名無しさん
19/10/29 11:14:16.19 2AEjd6SF.net
なにそれ、よさそう。
でもわたしの頭ではどうしたらよいものやら。。
43:デフォルトの名無しさん
19/10/29 12:20:30.44 zCzSjgo7.net
forのループごとsshで引き渡せばいいじゃん�
44:B1行の長いシェルスクリプトってことね。
45:デフォルトの名無しさん
19/10/29 13:55:53.48 2AEjd6SF.net
まだ帰宅していないので考えただけですが、
ls | tail | rm したいディレクトリが11個あって、
ディレクトリのpwdは/home/'"$var"'/'"$i"'/ みたいに2箇所変数にしてます。
それをssh1行でループを送れるバエた方法があるますか?
46:デフォルトの名無しさん
19/10/29 13:59:15.42 2AEjd6SF.net
たしかにsshのループの時にいちいち
Connection to xxx.xxx.xxx.xxx closed
が出てうざかったんですよね。
47:デフォルトの名無しさん
19/10/29 14:00:01.92 gns1i7FP.net
ヒアドキュメントにすればいいんじゃない
#!/bin/sh
cat <<'EOS' | ssh host sh
var1=201909
var2=201910
set -- "${var1}" "${var2}"
for var
do
ls -1t /home/app/"${var}"/*.log | tail -n +2 | xargs rm -f
done
EOS
48:デフォルトの名無しさん
19/10/29 14:19:01.08 gns1i7FP.net
と思ったけど、リモートホストのどこかにスクリプトファイルを置いて
ssh host /path/to/script
とかやればいいんじゃないかな
> たしかにsshのループの時にいちいち
> Connection to xxx.xxx.xxx.xxx closed
> が出てうざかったんですよね。
なんでこのメッセージが表示されるんだろう…やっぱり pseudo tty を
使ってるよね
49:デフォルトの名無しさん
19/10/29 14:32:50.27 CowX2GWO.net
CI/CD で使う、Task Runner みたいな方が良いかも
Ruby なら、Rake を使った、Capistrano とか、
Thor とか
50:デフォルトの名無しさん
19/10/29 14:37:21.30 g8zM1lJr.net
rubyはけっこうです
51:デフォルトの名無しさん
19/10/29 15:00:21.96 2AEjd6SF.net
> ヒアドキュメント
> リモートホストのどこかにスクリプト
なるほど!それならわたしでも理解できます!
> Connection to xxx.xxx.xxx.xxx closed
これは、
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'
としたときに、
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
と言われてしまったので、sshに-tをつけてから出るようになりました。
サーバーのアプリが集めた写真をscpでダウンロード→
→ダウンロードした写真を削除→アプリのログを削除
って流れのスクリプトなのでやたらとConnection to xxx.xxx.xxx.xxx closedが出ます。
52:デフォルトの名無しさん
19/10/29 15:57:57.38 zCzSjgo7.net
sshで接続する先のサーバに予めシェルスクリプト送り込んでおいてsshで実行だけするという手もあるな。
あまりにも長くて複雑な場合はその方が楽だと思う。
ただし、送り込んでから実行するまでの間に何者かによって別のファイルに置き換えられてしまったら終わりなのでその心配のない環境でしかできない。
53:デフォルトの名無しさん
19/10/29 15:59:43.78 zCzSjgo7.net
うう。リロードし忘れて書いたら既に同じようなのが書かれている。orz
54:デフォルトの名無しさん
19/10/29 16:01:56.26 spBBwL/I.net
やり方は忘れたが、ローカルでgzにしたものをワンライナーで
送ってリモートに保存せずに実行っていうのをやったことがある気がする
かもしれないけど、保存していたかもしれない
55:46
19/10/30 15:36:46.01 p2ffZ2o0.net
環境構築のChef は、サーバーに、Ruby をインストールする。
そこで、サーバーに、Ruby Script を転送して、Rubyで実行する
一方、Ansible は、サーバーに、Python をインストールしない
他にも、Capistrano, Terraform などもある
56:デフォルトの名無しさん
19/10/30 18:02:20.30 ssr4q2PY.net
>>52
きたーーー!!!
57:デフォルトの名無しさん
19/10/31 17:56:20.75 pBbgzdOe.net
cshで書いたスクリプトの途中でキーから入力をしたいんですが
なんという命令で実現できますか?
58:デフォルトの名無しさん
19/10/31 18:01:50.06 wR8wpXdO.net
set key_input = $<
59:デフォルトの名無しさん
19/10/31 19:36:28.51 pBbgzdOe.net
>>55
サンクス(´・ω・`)
60:デフォルトの名無しさん
19/11/06 17:06:15.24 4kXKpMLv.net
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならex
61:portすればできるけどさ
62:デフォルトの名無しさん
19/11/06 19:12:11.78 wTTuQQRz.net
>>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない
63:デフォルトの名無しさん
19/11/06 19:12:36.64 wTTuQQRz.net
関数も無理やろ?
64:デフォルトの名無しさん
19/11/06 19:20:58.71 wTTuQQRz.net
たたbashに関数をexportできる機能があるってのは不思議なんだよなw
まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?
65:デフォルトの名無しさん
19/11/06 19:34:34.77 OvjaMqE0.net
echo 'Hello World' | xargs -I@ bash -c $'shopt -s expand_aliases;alias p="echo";\n p @'
66:デフォルトの名無しさん
19/11/07 00:18:43.96 dfqCliYv.net
func(){ echo $@;}
export -f func
echo foo | xargs func
xargs: func: そのようなファイルやディレクトリはありません
echo foo | xargs -I@ bash -c 'echo @'
foo
関数ならこうだな
xargsでaliasはbashだと無理だからtcshでやれってstack overflowで見た
67:デフォルトの名無しさん
19/11/07 08:59:49.28 C0Y8MuYI.net
macては動かないのでwindows使ってくださいみたいな暴論
68:デフォルトの名無しさん
19/11/07 11:05:05.20 cfhO2vSD.net
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな
69:デフォルトの名無しさん
19/11/07 11:11:30.53 sEmiRyTj.net
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw
まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?
70:デフォルトの名無しさん
19/11/07 11:19:16.71 cfhO2vSD.net
>>65
bash -> zsh -> bash
で、bashでは関数になってるけど。zshでも環境変数には存在する
環境変数の引き継ぎってどうなってたかなあ
71:デフォルトの名無しさん
19/11/07 11:26:10.68 mwfKyddL.net
なんかもろにそれっぽいのがあった。dashは一般的でないような名前のは削除するらしい
URLリンク(unix.stackexchange.com)
72:デフォルトの名無しさん
19/11/07 11:52:29.35 sEmiRyTj.net
ようやく見れたw
envで見れるね。export使ってた。
73:デフォルトの名無しさん
19/11/07 11:53:35.24 sEmiRyTj.net
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?
74:デフォルトの名無しさん
19/11/07 11:54:11.02 sEmiRyTj.net
bashを介せば
75:デフォルトの名無しさん
19/11/08 00:07:00.88 jWGBsuvq.net
alias xargs='xargs '
echo *txt | xargs ll
.basurcの登録分はこれでもいける
76:デフォルトの名無しさん
19/11/14 12:41:11.56 RaS+/sOM.net
uucpとかって今時どういう活用法あるかな?
77:デフォルトの名無しさん
19/11/14 12:59:55.09 GaAZ8ORG.net
TrailBlazer でも手に入れたのか
78:デフォルトの名無しさん
19/11/27 15:42:28 JZevxkSS.net
kill とtrapでソフトタイマ作ってみた。需要
79:あるかな
80:デフォルトの名無しさん
19/11/27 16:34:50.24 KOWJoLHR.net
sleepと何が違うん?
81:デフォルトの名無しさん
19/11/27 18:43:12.26 9SXmP3sk.net
SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。
82:デフォルトの名無しさん
19/11/27 18:48:52.87 KOWJoLHR.net
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが
83:デフォルトの名無しさん
19/11/28 06:15:51.80 f/6vs/+B.net
シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。
84:デフォルトの名無しさん
19/11/28 07:03:59.17 uZo2jF8i.net
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ
85:デフォルトの名無しさん
19/11/28 07:05:43.89 uZo2jF8i.net
もしここに書いたらレビューするかもね
内容が気に入ればだけど
86:デフォルトの名無しさん
19/11/28 08:08:54.32 f/6vs/+B.net
いっぺんにアップできないから小出し。
#! /bin/bash
MAX_TIMER=10;
OLD_SECONDS=$SECONDS;
while true; do
cp_SECONDS=$SECONDS;
if [ $cp_SECONDS -ne $OLD_SECONDS ]; then
kill -SIGINT $$;
OLD_SECONDS=$cp_SECONDS;
fi
sleep 0.5;
done &
87:デフォルトの名無しさん
19/11/28 08:09:31.03 f/6vs/+B.net
for ((aa = 0; aa < MAX_TIMER; aa++)); do
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;
88:デフォルトの名無しさん
19/11/28 08:09:55.57 f/6vs/+B.net
trap '
for ((aa = 0; aa < MAX_TIMER; aa++)); do
if [ ${tim_flg[$aa]} -eq 1 ]; then
if [ ${tim[$aa]} -gt 0 ]; then
tim[$aa]=$((tim[$aa] - 1));
fi
fi
done
printf "%3d" ${tim[*]};
echo ":" $(date -R);
' SIGINT
89:デフォルトの名無しさん
19/11/28 08:11:04.34 f/6vs/+B.net
for((nn=0; nn < 10; nn++)); do
tim_flg[$nn]=1;
done
while true; do
for((nn=0; nn < 10; nn++)); do
if [ ${tim[$nn]} -eq 0 ]; then tim[$nn]=$((nn + 2)); fi
done
sleep 0.6
done;
終わり
90:デフォルトの名無しさん
19/11/28 08:24:45.92 uZo2jF8i.net
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。
91:デフォルトの名無しさん
19/11/28 08:29:37.54 f/6vs/+B.net
動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。
92:デフォルトの名無しさん
19/11/28 08:30:36.19 uZo2jF8i.net
しばし読んでみたけど、やっぱりわからんw
これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ
93:デフォルトの名無しさん
19/11/28 08:41:39.82 uZo2jF8i.net
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的
94:デフォルトの名無しさん
19/11/28 08:42:09.42 f/6vs/+B.net
各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです
tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。
95:デフォルトの名無しさん
19/11/28 08:49:25.10 uZo2jF8i.net
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。
96:デフォルトの名無しさん
19/11/28 08:51:32.36 uZo2jF8i.net
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。
97:デフォルトの名無しさん
19/11/28 21:14:01.96 uBUVzLWV.net
宿題の添削をしてやるとか親切たなw
98:デフォルトの名無しさん
19/11/28 21:
99:36:47.47 ID:asJppHFe.net
100:デフォルトの名無しさん
19/11/28 23:49:59.71 RaRUIeaw.net
bash依存しまくりで
URLリンク(wandbox.org)
101:デフォルトの名無しさん
19/11/29 00:53:33.34 Fh79+8D6.net
あんまりソフトタイマに有用性を感じてもらえないようで残念でした。
102:デフォルトの名無しさん
19/11/29 01:09:45.97 IIqk2+5U.net
timeoutでやっつけ
103:デフォルトの名無しさん
19/11/29 02:19:44 XcyRQJ1W.net
>>95
タイマに有用性がないんじゃなくて
君が作ったスクリプトに有用性がなかったんだよ
104:デフォルトの名無しさん
19/11/29 04:30:20 9RHOSbKH.net
>>94
めんどくせーから、もうそれでいいやw
その程度でbash依存するな
URLリンク(wandbox.org)
105:デフォルトの名無しさん
19/11/29 05:10:07 hA38q2SN.net
おれおれかよ
106:デフォルトの名無しさん
19/11/30 00:04:41.28 FMRNVBPU.net
Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。
これは何がまずいのでしょうか?
wget -r -A Download拡張子 -I /Downloadディレクトリ URL
107:デフォルトの名無しさん
19/11/30 00:53:41.92 KUL76oc2.net
オプションに -e robots=off -U mozilla でも付けてみたら上手く行くかも
108:デフォルトの名無しさん
19/11/30 00:54:25.61 czFcPKLy.net
碌に調べずの返答でアレなんだが多分訪問先のサイトがファイル一覧
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う
109:デフォルトの名無しさん
19/11/30 13:20:31.41 f33nsdyy.net
リファラの偽装が必要かも。知らんけど
110:デフォルトの名無しさん
19/11/30 16:49:40.30 mvBIEviw.net
googleはbashがデフォルト
111:デフォルトの名無しさん
19/12/01 11:47:31.42 0pH8jk7+.net
bash/zsh依存しまくりで
URLリンク(wandbox.org)
そんなのが仮に必要でも
trap 'date -R' USR1
for (( i=1 ; i <= 10 ; i++ )); do
( sleep $i; kill -USR1 $$ ) &
done
wait
でいいだろとしか思わんけどw
112:デフォルトの名無しさん
19/12/01 19:22:22.28 IoGKXgrY.net
>>91
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。
113:デフォルトの名無しさん
19/12/01 19:49:41.33 YWi4MX0G.net
このサンプルでは1固定なんだからゴミやろ
114:デフォルトの名無しさん
19/12/02 22:02:29.21 9nn8K+iP.net
親ディレクトリ
-子ディレ クトリ(1)
file(1).txt
file ().txt
-子デ ィレクトリ(2)
file(2) .txt
-子ディレクトリ(3)
fil e(3).txt
ディレクトリとファイル名の半角スペースと半角の()を_で置換したいのですが
どうやればいいのでしょうか
for dir in $(ls -d */); do
for f in ${dir}*; do
mv "$f" `echo $f|sed -e 's/[ ()]/_/g'`
done
done
これでディレクトリ名とファイル名はどうにかなったのですが、、
一回目ではディレクトリ名が変換されてしまうのでファイル名が変換されず
対応策として同じコードを2回実行してファイル名も変換しています
まず一回目にディレクトリ名を変換するために
for dir in $(ls -d */); do
mv "$dir" `echo $dir|sed -e 's/[ ()]/_/g'`
done
をやってみたのですが、statがなんやらと警告が出てきます
115:デフォルトの名無しさん
19/12/02 22:13:56.47 cDa5fVnx.net
そういう用途なら、forとかlsとか使わないでfind使え
116:デフォルトの名無しさん
19/12/02 22:15:41.19 cDa5fVnx.net
いきなりstatがでるような事はやめて、
117:mv なんとか かんとか で実行命令を表示するようにしろ 怖すぎるわ。それやればなんとかなるだろ
118:デフォルトの名無しさん
19/12/02 22:19:56.11 agtAae1a.net
rename 関係はperlで試せる dry run 作ってる
URLリンク(pastebin.com)
touch "file(1).txt"; ~/bin/rename.pl dry 'tr/[()]/_/' *txt
file(1).txt => file_1_.txt
~/bin/rename.pl run 'tr/[()]/_/' *txt; ls
file_1_.txt
119:デフォルトの名無しさん
19/12/02 22:46:09.47 RT0MauQR.net
find . -name '*[ ()]*' -print | sort -r | while read item; do
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done
120:デフォルトの名無しさん
19/12/03 07:24:55 v9g/lO5M.net
Ruby で作った。
コードは次のレスに書く
DryRun を使ったので実際には、変更されない
ファイル/ディレクトリは、同時に変更すると、バグるかも知れないので、別々に変更する。
また「子ディレクトリ(1)/孫ディレクトリ(1)」のように、2か所以上同時に変更すると、バグるかも知れない
こんな複雑なものを、シェルスクリプトで書くのは超危険!
特に移動は、dest が存在するときは移動になり、
存在しないときは変更になるという、極めて難しい場合分けが必要で、
処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!
121:113
19/12/03 07:25:55 v9g/lO5M.net
require 'fileutils'
root_dir = "C:/Users/Owner/Documents/Ruby/test/**/*" # 基準ディレクトリ
# 変更前のファイル/ディレクトリを入れる配列
src_files = [ ]; src_dirs = [ ]
# 基準ディレクトリ以下のファイル/ディレクトリを取り出して、配列に入れる
Dir.glob( root_dir ) do |path|
case
when File.file?( path ) then src_files.push ( path )
when File.directory?( path ) then src_dirs.push ( path )
else # 処理しない
end
end
def change_paths( src_ary ) # ファイル/ディレクトリ名を変更する
src_ary.each do |src_path|
dest_path = src_path.tr( " ()", "_" ) # 変換
next if src_path == dest_path # 変換されなかった場合は、処理しない
# 変更後の名前のファイル/ディレクトリが、既に存在すれば、エラー
msg = "変更後の名前のファイル/ディレクトリが、既に存在します!\n#{ dest_path }"
raise msg if File.exist? ( dest_path )
FileUtils::DryRun.move( src_path, dest_path )
end
end
change_paths( src_dirs )
change_paths( src_files )
122:デフォルトの名無しさん
19/12/03 08:29:02 ujGDA/f+.net
なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?
123:デフォルトの名無しさん
19/12/03 08:29:47 ujGDA/f+.net
perlではなくrubyか。しつれい
124:113
19/12/03 09:46:02.07 v9g/lO5M.net
mv を作った奴は、頭おかしいw
dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから
漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数
それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
125:デフォルトの名無しさん
19/12/03 12:17:58.24 5ZiHQIvd.net
つまり自分に都合が悪い仕様=バグ
126:デフォルトの名無しさん
19/12/03 12:28:33.61 Uh1tIUQA.net
一括リネームってたいてい複雑になるから
GUIツールを使ったほうが良いと思うんだよね
Windows 10版のPowerToysにリネーム機能が追加
URLリンク(pc.watch.impress.co.jp)
127:デフォルトの名無しさん
19/12/03 18:09:42.76 +zVWCKlo.net
>>112
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item ~ メッセージは単なる目安
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"
[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}
mv "$item" "$dir/$newname"
done)
128:デフォルトの名無しさん
19/12/03 18:14:03.14 +zVWCKlo.net
>>120
誤 ext="${newname#*.}"
正 ext="${newname##*.}"
129:デフォルトの名無しさん
19/12/03 18:30:56.19 HnkJN8FN.net
>>111
rename自体がperlだしちゃんと試行もあるけど
130:デフォルトの名無しさん
19/12/03 19:27:45.48 mUaHu9IR.net
>>122
perl ワンライナーより
dry run のスイッチと
どのように変更させるかに集中し
出力確認などの余計なことは共通する定型処理だから
コードにまとめたほうが使いやすい
131:デフォルトの名無しさん
19/12/03 19:44:49.63 R2wB6lmg.net
Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ
132:デフォルトの名無しさん
19/12/03 20:48:36.39 jDo5c24e.net
renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
133:デフォルトの名無しさん
19/12/03 21:32:10.96 yTVXI633.net
話のネタから外れて何を主張したいのだか
134:デフォルトの名無しさん
19/12/03 22:25:15.93 yTVXI633.net
dry-runって言っても結局ひとつをrename/mvするその時点での状態でしか判断してないし、mvコマンドの前にecho付けるのと何が違うのだか
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか
>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
135:113
19/12/03 23:09:51.48 v9g/lO5M.net
Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある
この手の処理の何がヤバイかと言うと、
例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている
データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく
すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
136:デフォルトの名無しさん
19/12/03 23:14:22.94 50yNXJCt.net
自作コードがそれ以下なのになにを言っているのだか
137:デフォルトの名無しさん
19/12/04 00:03:09.04 LOcDYH/A.net
>>108
まだ見てくれてる? 変更するんじゃなくて新たに作�
138:驍ルうが無難だと思うよ。 新たに作るといっても通常ファイルはハードリンクできるからね。 実際にやってみたよ。 $ find a a a/a (0) a/a (0)/a (00) a/a (0)/a (01) a/a (1) a/a (1)/a (11) a/a (1)/a (10) $ find b b $ cd a $ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");' $ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");' $ cd .. $ find b b b/a__1_ b/a__1_/a__10_ b/a__1_/a__11_ b/a__0_ b/a__0_/a__00_ b/a__0_/a__01_ $ 途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。
139:デフォルトの名無しさん
19/12/04 02:51:13 hySlbdZs.net
pax -rwlpe src dst
140:デフォルトの名無しさん
19/12/04 23:27:09.69 xn8KyTI4.net
renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
141:デフォルトの名無しさん
19/12/05 00:34:07.65 0uggokQM.net
Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
142:デフォルトの名無しさん
19/12/05 11:01:01.81 3XJjcX6a.net
>>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
143:デフォルトの名無しさん
19/12/05 11:02:39.94 6ZFP3Xq2.net
>>132
Debian系はPerl付属のprename、
CentOS系はutil-linuxのrename.ulをrenameとして使ってるらしい
そら人によって言ってることが違う筈だ
144:デフォルトの名無しさん
19/12/05 15:05:31 0uggokQM.net
Larry Wall
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも
URLリンク(github.com)
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.
らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな
145:デフォルトの名無しさん
19/12/05 15:14:33 TzSLtKO4.net
たぶん基本的なことだと思うんですが、教えてください。
#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv
このスクリプトを実行すると…
$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description
このように、先頭に-eが入ってしまいます。なぜでしょう…?
146:デフォルトの名無しさん
19/12/05 15:19:51 0uggokQM.net
Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
147:デフォルトの名無しさん
19/12/05 15:21:52.11 0uggokQM.net
>>138
いや、違った
Perl同梱(?)のprename/file-renameもLarry Wall and Robin Barker版か
148:デフォルトの名無しさん
19/12/05 15:22:44.42 WdOnkWYr.net
>>137
そのスクリプトを x.sh だとして、
$ /bin/sh x.sh
とかして実行したんじゃない?
149:デフォルトの名無しさん
19/12/05 15:55:06 Gb1I+/8K.net
>>137
-eをオプションとして扱うかどうかはシェルによって違う
150:。 bashはオプションだが、dashはオプションではなくただの文字列
151:デフォルトの名無しさん
19/12/05 15:58:33 TzSLtKO4.net
>>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
152:デフォルトの名無しさん
19/12/06 20:34:56.63 08yg4gJX.net
宇宙刑事シェバン
153:デフォルトの名無しさん
19/12/10 22:30:09.16 zD6aLrgM.net
x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
154:デフォルトの名無しさん
19/12/10 23:18:51.56 kdXCWOtW.net
$((var < 0))はPOSIX準拠じゃなくね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
155:デフォルトの名無しさん
19/12/10 23:24:09.60 kdXCWOtW.net
ちなみにうちのマシンだとこんな感じ
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
156:デフォルトの名無しさん
19/12/10 23:25:16.53 SL+fGedD.net
echo "$var<0"|bc
157:デフォルトの名無しさん
19/12/10 23:28:35.11 kdXCWOtW.net
bcプロセス起動してるから遅い
それは実行しなくてもわかる
158:デフォルトの名無しさん
19/12/10 23:50:31.02 kdXCWOtW.net
あとオマケ、速いとは思えないけど
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
159:デフォルトの名無しさん
19/12/10 23:51:59 LOypIkS3.net
>>146
それ100万やったら50秒かかったわ
10万で5秒だしawk使うわ
160:デフォルトの名無しさん
19/12/10 23:59:28 kdXCWOtW.net
>>150
えらい遅いなw
俺のなんて2012年発売のCPUだぞ。
i7 3770。3.40Ghz(ブースト時で3.9Ghz)
161:デフォルトの名無しさん
19/12/11 00:00:32 ivhCTlPt.net
i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
162:デフォルトの名無しさん
19/12/11 00:00:55 5YQOA1oq.net
>>150
awkつかうなら、awkのコード書いてみてくれ
実行してみる。
163:デフォルトの名無しさん
19/12/11 00:03:27 5YQOA1oq.net
>>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2~3万円台で搭載パソコンを買えちゃうよ
URLリンク(used.dospara.co.jp)
164:デフォルトの名無しさん
19/12/11 00:11:26 ivhCTlPt.net
>>154
凄い時代になったなw
いつのまにか皆さんハッピーになってた
165:デフォルトの名無しさん
19/12/11 00:15:38 rj8eSq0k.net
バックグラウンドで色々動きっぱなし(usage 60%ぐらい)のWindows PC(Ryzen 5 2600, 3.66GHz)で
Cygwin
real 0m2
166:3.706s user 0m23.375s sys 0m0.093s WSL real 0m3.987s user 0m3.891s sys 0m0.016s だった。えっ、私のCygwin遅すぎ・・・
167:デフォルトの名無しさん
19/12/11 00:21:29 5YQOA1oq.net
>>156
うちもcygwinだとそんな感じだわw msysも
WSLは全然速度変わらないのにな
本質的にCPUだけで処理できる内容のはずだが
なにかシステムコール呼び出してるんだろうな
168:デフォルトの名無しさん
19/12/11 00:26:41 H3x5MOt+.net
>>153
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる
計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる
169:デフォルトの名無しさん
19/12/11 00:40:07 5YQOA1oq.net
>>158
円文字化けしてんぞ
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
real 0m0.373s
user 0m0.300s
sys 0m0.005s
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt
real 0m8.247s
user 0m4.337s
sys 0m3.904s
まあ速いんだろうけどさ。想定の範囲内かな。
170:デフォルトの名無しさん
19/12/11 00:40:26 H3x5MOt+.net
ランダムな引き算生成するawkバージョン
$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
171:デフォルトの名無しさん
19/12/11 00:46:42 5YQOA1oq.net
お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど
$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt
real 0m7.866s
user 0m4.114s
sys 0m3.744s
172:デフォルトの名無しさん
19/12/11 00:53:02 mRJcWm57.net
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.268s
user 0m2.264s
sys 0m0.004s
$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s
173:デフォルトの名無しさん
19/12/11 00:54:49 5YQOA1oq.net
> 対象の文字列は標準出力ではなくて変数に格納されています。
お前らこの条件忘れてるだろw
174:デフォルトの名無しさん
19/12/11 01:39:58.92 5YQOA1oq.net
うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん
$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.678s
user 0m9.059s
sys 0m4.427s
$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.629s
user 0m6.358s
sys 0m1.580s
$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.649s
user 0m6.869s
sys 0m2.006s
175:デフォルトの名無しさん
19/12/11 01:44:25 5YQOA1oq.net
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo + || echo; done' < input.txt | while read i; do [ "$i" ]; done
real 0m7.596s
user 0m9.484s
sys 0m5.123s
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done
real 0m5.418s
user 0m4.670s
sys 0m1.012s
176:デフォルトの名無しさん
19/12/11 01:47:25 5YQOA1oq.net
結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
177:デフォルトの名無しさん
19/12/11 03:39:07.57 MgOCMEvC.net
>>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする
シェルスクリプトなんかスレッド使わないだろうし
178:デフォルトの名無しさん
19/12/11 07:28:04.35 hRzITiR9.net
>>167
スレッドバリバリ使ってるぞw
| つかうと必然的にスレッドになるしな
179:デフォルトの名無しさん
19/12/11 08:22:26.35 6UY8oXji.net
>>145
URLリンク(pubs.opengrou)
180:p.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04 によると https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01 の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい とあるから>はPOSIXの範疇だと思います。
181:デフォルトの名無しさん
19/12/11 12:44:26.62 MgOCMEvC.net
>>168
そりゃプロセスだろ
182:デフォルトの名無しさん
19/12/11 13:32:50.85 hRzITiR9.net
>>170
今はCPUの話だからハイパースレッディングのスレッドだろう
183:デフォルトの名無しさん
19/12/11 13:55:32.35 hRzITiR9.net
>>169
POSIX準拠じゃないのでは?と言ってるのは
$((var < 0)) のvarは数値限定ってところだよ
184:デフォルトの名無しさん
19/12/11 15:18:53 ++mq81bA.net
>>171
> | つかうと
じゃないの。普通は子プロセスだろう
185:デフォルトの名無しさん
19/12/11 15:22:46 ++mq81bA.net
プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
186:デフォルトの名無しさん
19/12/11 15:28:13 hRzITiR9.net
>>173
文句は>>167に言ってくれ。合わせただけ
187:デフォルトの名無しさん
19/12/11 15:29:58 hRzITiR9.net
>>174
普通にCPUの所に4コア8スレッドって書いてあるからさ
URLリンク(kakaku.com)
188:デフォルトの名無しさん
19/12/11 15:39:31 ++mq81bA.net
そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
189:デフォルトの名無しさん
19/12/11 15:46:36 hRzITiR9.net
>>167涙目www
でよろしいか?
俺に言うなって
190:デフォルトの名無しさん
19/12/11 15:55:15 ++mq81bA.net
一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw
プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
191:デフォルトの名無しさん
19/12/11 16:11:12 6UY8oXji.net
>>172
なるほど。確かに準拠してませんでした,すいません。
192:デフォルトの名無しさん
19/12/11 20:23:56.94 MgOCMEvC.net
>>175
いや、あってないから
勘弁してくれ
193:デフォルトの名無しさん
19/12/12 01:47:04 4Chv4WTd.net
>>181
シェルスクリプトでスレッドってどういう事?
スレッド使わなくてもコアは使うじゃん。
194:デフォルトの名無しさん
19/12/12 02:33:13 NtLqNRlV.net
>>182
なんでオレに聞くんだよ
シェルスクリプトはスレッド使わないって当然のこと言っただけじゃないか
なんで頭悪い奴が絡んでくるんだよ気持ち悪いな
195:デフォルトの名無しさん
19/12/12 02:40:24.09 n05Ewb3K.net
CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
196:デフォルトの名無しさん
19/12/12 03:38:37.48 g+q4RhTJ.net
そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな
> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
197:デフォルトの名無しさん
19/12/12 03:41:30.87 g+q4RhTJ.net
スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
198:デフォルトの名無しさん
19/12/12 08:10:01 NtLqNRlV.net
>>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話
新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
199:デフォルトの名無しさん
19/12/12 08:11:55 NtLqNRlV.net
>>186
頭悪いなー
シェルスクリプトで使うのは1コアだけだろうが
200:デフォルトの名無しさん
19/12/12 09:49:29.49 AVYkL4QT.net
本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが
例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く
あとバックグラウンド実行もあるよね
自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
201:デフォルトの名無しさん
19/12/12 09:52:07.59 AVYkL4QT.net
あと、xargsとかGNU parallelとか
202:デフォルトの名無しさん
19/12/12 10:19:43.03 mtFqZIGW.net
それはプロセスレベルの並列化のお話。スレッドの話はどこいった?
203:デフォルトの名無しさん
19/12/12 10:24:13.74 AVYkL4QT.net
シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?
シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ
それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
省略
done < ファイル名
外部コマンド一切なし
204:デフォルトの名無しさん
19/12/12 10:24:48.46 AVYkL4QT.net
>>191
今はCPUコアの話
205:デフォルトの名無しさん
19/12/12 12:23:33.66 NxSFhA/k.net
>コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
206:デフォルトの名無しさん
19/12/12 12:43:03.31 NxSFhA/k.net
>>183
まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
シェルスクリプトを書いてどこがスレッドとか全然わからん、どうスクリプト書けばスレッドになるのかなんて全然わからないとこではあるので、そういう意味ではスレッド使わないと言えるだろうけど
また、>>146にスレッドの効果なんて期待できないだろう。子プロセスがんがん起動しているわけでもなさそうだし、並列化なんてできそうもないスクリプトのようだからね
使ってる環境のshの実態がなんによるかが大きいんじゃないのかな?bashはかなり遅い感じかなあ
207:デフォルトの名無しさん
19/12/12 12:57:42.86 NxSFhA/k.net
>>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
208:デフォルトの名無しさん
19/12/12 16:08:19.94 AVYkL4QT.net
>>194
i5 9500は6コア6スレッド
なんでこういつも思い込みで発言するかな?
URL貼れないから「インテルR Core? i5-9500 プロセッサー」からググれ
209:デフォルトの名無しさん
19/12/12 16:10:23.64 AVYkL4QT.net
>>195
OSのスレッドは使ってなくても、
CPUのコア数が多ければ、シェルスクリプトでそれを使えるから
コア数の数はシェルスクリプトでも意味があるよって話
210:デフォルトの名無しさん
19/12/12 16:11:47.38 AVYkL4QT.net
>>105
> なんでこういつも思い込みで発言するかな?
そりゃそうやろw
ただの1-2の計算なんか、どんな言語使っても
スレッドの効果なんてねーよw
言語じゃなくてやる処理の問題
211:デフォルトの名無しさん
19/12/12 16:24:20.77 AVYkL4QT.net
ちなみに>>164-165とかはパイプを使ってるのでコア数は意味がある
例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'
212:デフォルトの名無しさん
19/12/12 16:41:19.05 1H8k0UmA.net
自己文書化(?)されたシェルスクリプトの例
URLリンク(www.tip.net.au)
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
213:デフォルトの名無しさん
19/12/12 16:43:22.79 AVYkL4QT.net
>>201
それ何が嬉しいん?
ロングオプションがあればいいだけの話?
214:デフォルトの名無しさん
19/12/12 16:49:53.62 mtFqZIGW.net
$ seq 1 inf | tail
を実行して別のターミナルで
$ top -1
を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
215:デフォルトの名無しさん
19/12/12 17:08:05.32 1H8k0UmA.net
>>202
わざわざヘルプを別個に書かないでも
gettopts ... case ...
↑この行を解析できるようになれば
半自動的にヘルプが生成できる(のでは)ってことじゃない?
216:デフォルトの名無しさん
19/12/12 17:46:32.53 3GyD1b3F.net
>>197
ああ、ハイパースレッディングなんてないCPUか。そりゃすまん
わざわざコア6スレッド6なんて書く必要ないだろう、そのスレッドの所以たるハイパースレッディングなんてないんだから、ただのコア6だな
ハイパースレッディングがあるCPUと並列したりする場合にあった方がハイパースレッディングが無いという意味でわざわざ書くぐらいだろう
ハイパースレッディングなんて名前が悪いなw(まあ、CPU内部でやってることはスレッディングなんだろけど)
>>199言い足りなかったのねwやはりいつものか
217:デフォルトの名無しさん
19/12/12 17:46:52.23 AVYkL4QT.net
>>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、
とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
218:デフォルトの名無しさん
19/12/12 17:48:26.91 AVYkL4QT.net
>>205
コア6(ハイパースレッドなし) と書くよりも
コア6 スレッド6 の方が明確で短いだろw
219:デフォルトの名無しさん
19/12/12 17:53:26.87 AVYkL4QT.net
試しに書いてみようかと思ってコピペしようとしたら画像やしw
220:デフォルトの名無しさん
19/12/12 18:02:50.61 CkUjiG2X.net
>>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
221:デフォルトの名無しさん
19/12/12 18:16:03.44 n05Ewb3K.net
>>188
>頭悪いなー
>シェルスクリプトで使うのは1コアだけだろうが
えっ?
>>195
>また、>>146にスレッドの効果なんて期待できないだろう
えっ?
話が噛み合ってなかった理由がわかってみんなスッキリだね
222:デフォルトの名無しさん
19/12/12 18:21:26.57 CkUjiG2X.net
>>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?
「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
223:デフォルトの名無しさん
19/12/12 18:22:28.30 AVYkL4QT.net
>>201
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw
#!/bin/sh
print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}
while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done
224:デフォルトの名無しさん
19/12/12 18:26:08.31 AVYkL4QT.net
>>211
今シェルスクリプトの話をしてるんですよ?
という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし
例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw
最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
225:デフォルトの名無しさん
19/12/12 18:33:38.18 CkUjiG2X.net
ああ、>>184なのかそもそもは
スレッド使ってなんか賢いことしてたら、プロセス起動する時間や並列なんぞで速くなるとか思ったのだろう、よくわからんけどw
(スレッド使えば速くなると思いがちというのはありがち)
スレッドでうまいことやっていたとしても、>>146にスレッドの効果なんて期待できないだろうということだよ。>>167のその部分の否定だよ、やんわりとしたw
で、「え?」って?
>>213
イミフ。何をいいたいのかな?C??妄想すぎるな
226:デフォルトの名無しさん
19/12/12 18:38:11.60 CkUjiG2X.net
>>213
ああ、誰かと同一人物だと思ってる??違うよ
>>167だって、>>170と言っているだろう(プロセスで並列処理だろう)、
>最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
とんちんかんな決めつけだろうなw
227:デフォルトの名無しさん
19/12/12 18:57:21.35 CkUjiG2X.net
CPU使い尽くす>>167改変版(やっつけ)
numparallels=8
time zsh -c 'var=1-2; sub () { i=0; while [ $i -lt '$((1000000 / $numparallels))' ]; do [ $(($var)) -lt 0 ]; : $((++i)); done; cat; echo "$1:$i" }; echo'"$(printf " | sub %d" $(seq $numparallels))"
まあ、やってることは何もないので分割並列しても何も問題ないが(そもそもスクリプトの目的としては問題ある)、仮にオプティマイズなんぞがあってもこんなことはしない(だろう)
現在のシェルはsubがプロセスだがスレッドを使っていたりしても、しないだろう
「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
228:デフォルトの名無しさん
19/12/12 19:01:40.02 AVYkL4QT.net
>>215
↓こいつが馬鹿だって言ってる。
>>188
> シェルスクリプトで使うのは1コアだけだろうが
並列処理しないコードはコアを使わないと言われても
どんな言語でも当たり前としか言えない。そういう話
229:デフォルトの名無しさん
19/12/12 19:04:56.67 AVYkL4QT.net
>>214
>>167が言うには「シェルスクリプトでスレッドを使わない」(このスレッドとはハイパースレッディングのスレッドの意味)
正しい答えはシェルスクリプトでも並列処理できるし。マルチコアを使い切ることも可能。
230:デフォルトの名無しさん
19/12/12 19:06:01.30 CkUjiG2X.net
>>217,218
お前には聞いてない。最初からそう思っているおもいっきりばかにしたくてなんだろ?
そんなやつの言うことはww 変に勝手に決めつける点からも明らかに
231:デフォルトの名無しさん
19/12/12 19:23:11.97 AVYkL4QT.net
語彙がおかしくなってる(笑)
232:デフォルトの名無しさん
19/12/12 19:24:18.99 CkUjiG2X.net
こういうやつwww
233:デフォルトの名無しさん
19/12/12 22:51:40.18 1H8k0UmA.net
>>201
>>212
俺も作ってみた。
改良どころか根本的な書き直しが必要かもw
URLリンク(paste.ubuntu.com)
234:デフォルトの名無しさん
19/12/13 02:20:43.65 ysGzQi5M.net
>>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか
それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう
シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。
逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
URLリンク(github.com)
こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね
cat<<HERE
Usage: ・・・
-a, --aaa aaaaaa
HERE
235:デフォルトの名無しさん
19/12/13 02:37:48.49 r2S5lo/C.net
HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
236:デフォルトの名無しさん
19/12/13 03:28:44 ysGzQi5M.net
END_USAGEからはじまるで?
237:デフォルトの名無しさん
19/12/13 12:27:46.56 aQIhFndX.net
素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
238:デフォルトの名無しさん
19/12/13 16:35:44.26 oSsH2Kni.net
>>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
239:デフォルトの名無しさん
19/12/13 18:58:27.09 ysGzQi5M.net
個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
240:デフォルトの名無しさん
19/12/13 19:44:00.66 oSsH2Kni.net
寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
241:デフォルトの名無しさん
19/12/13 19:51:43.71 ysGzQi5M.net
あ、getoptが良いって言ってるわけじゃないよw
getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
242:デフォルトの名無しさん
19/12/13 19:55:08.60 ysGzQi5M.net
あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
243:デフォルトの名無しさん
19/12/13 21:32:49.16 oSsH2Kni.net
そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
244:デフォルトの名無しさん
19/12/14 11:52:21.09 gTK06/8e.net
POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
245:デフォルトの名無しさん
19/12/14 12:02:40.53 q2HhYeOb.net
ドキュメントはもうウェブサイトで用意したほうが良いよ
246:デフォルトの名無しさん
19/12/14 20:55:20.00 gTK06/8e.net
$ man foo
please see URLリンク(example.com)
ってかw
ネットワーク環境がなかったり貧弱だったりする環境は無視ですかい?
247:デフォルトの名無しさん
19/12/14 21:20:20.57 6YH7rFov.net
オフラインダウンロード機能でもあればいいだけじゃん
248: manの表現力は低いわけだし、いまどき画像表示できるマシンを 誰だって持ってるのに、テキストベースに拘る必要はない 開発者とかろくにメンテしないし、多言語化なんてまず無理 wikipediaのマニュアル特化型みたいにして一元管理 MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。 古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。 ドキュメントは分離して最新のものを常に更新していったほうが良い
249:デフォルトの名無しさん
19/12/14 23:05:33.87 gTK06/8e.net
まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
250:デフォルトの名無しさん
19/12/15 02:19:32.16 a0yEED8b.net
>>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか
ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。
シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
251:デフォルトの名無しさん
19/12/15 03:19:52.38 woT0VW+T.net
ソフトウェア作ってるのはそんなの気にしないだろう
拡張部分で同じだがちょっと違うとは普通にあるのだし
やるのは他の誰か必要と思ったのがやるもんだろな、たとえば>>238が
252:デフォルトの名無しさん
19/12/15 04:20:02 3SLEzfiL.net
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw
253:デフォルトの名無しさん
19/12/15 04:35:07 a0yEED8b.net
>>240
wikipedia方式で良いんじゃね?
254:デフォルトの名無しさん
19/12/15 10:01:39.28 E44EqLgR.net
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。
で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。
という訳で誰かそういうwiki作ってw
255:デフォルトの名無しさん
19/12/15 11:36:59 pTp+dpJs.net
必要性を感じた者がやるんだよ! 頑張れ!
256:デフォルトの名無しさん
19/12/16 00:44:09.03 5wUpgmce.net
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
257:デフォルトの名無しさん
19/12/16 07:48:45.99 4GuGuHT1.net
逆になぜinfoは信頼できると思ったのか
258:デフォルトの名無しさん
19/12/17 13:48:36.21 BxEORdhA.net
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
259:デフォルトの名無しさん
19/12/17 22:02:31.85 kdkfgKcy.net
>>244
なければ作るとよい
260:デフォルトの名無しさん
19/12/18 18:56:56.67 C
261:w3S1jU2.net
262:デフォルトの名無しさん
19/12/18 19:39:48.69 uFDqtnkl.net
日本語の問題とman自身の問題は別の話でしょう?
英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?
日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)
アプリとそのマニュアルは本来別でリリースすべきなんだろう
263:デフォルトの名無しさん
19/12/19 10:03:23.50 y7Q/2NKF.net
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
264:デフォルトの名無しさん
19/12/19 11:24:35.20 belDjs1+.net
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
265:デフォルトの名無しさん
19/12/19 16:35:50.82 jArWapvD.net
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
266:デフォルトの名無しさん
19/12/19 18:30:09.45 4hkxYlHE.net
bashで関数名に使える文字と使えない文字ってこれであってる?
・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)
・使えない
! " $ & ' ( ) \ | ` < > ; スペース
何だこのカオスwww
267:デフォルトの名無しさん
19/12/19 18:38:08.39 UoMpZOx6.net
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
268:デフォルトの名無しさん
19/12/21 20:28:47.93 X9+p8H27.net
func() {
foo "123$@"
}
って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた
func() {
tar "v$@"
}
func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ
はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
269:デフォルトの名無しさん
19/12/22 11:21:06.45 JDtuJK73.net
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
270:デフォルトの名無しさん
19/12/22 11:45:14.20 JDtuJK73.net
sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
271:デフォルトの名無しさん
19/12/22 12:51:34.17 O05uH48x.net
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ
272:デフォルトの名無しさん
19/12/22 15:12:02.64 JDtuJK73.net
>>258
なるほど。
ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
273:デフォルトの名無しさん
19/12/22 15:49:52.02 9GUBQyj0.net
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。
#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
274:デフォルトの名無しさん
19/12/22 16:03:17.69 XO28QfbO.net
削除じゃなくてコメントにしちゃうとか
sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
275:デフォルトの名無しさん
19/12/22 17:46:01.65 O05uH48x.net
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。
bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね
276:デフォルトの名無しさん
19/12/22 18:25:06.92 M+q9E136.net
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
277:デフォルトの名無しさん
19/12/23 15:40:09.98 YJsAIsu8.net
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
278:デフォルトの名無しさん
19/12/23 15:55:18.14 YJsAIsu8.net
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。
でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
279:デフォルトの名無しさん
19/12/23 16:20:51.38 CGg4xw4r.net
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと
> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
280:デフォルトの名無しさん
19/12/23 16:22:45.93 CGg4xw4r.net
>>264
何を言ってるのかわからんが、検証が間違ってる
281:デフォルトの名無しさん
19/12/23 16:36:13.95 YJsAIsu8.net
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
282:デフォルトの名無しさん
19/12/23 16:37:34.35 CGg4xw4r.net
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ
どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
283:デフォルトの名無しさん
19/12/23 16:40:45.68 CGg4xw4r.net
>>268
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる
URLリンク(pubs.opengroup.org)
> If the application sets OPTIND to the value 1, a new set of parameters can be used:
> either the current positional parameters or new arg values. Any other attempt to
> invoke getopts multiple times in a single shell execution environment with
> parameters (positional parameters or arg operands) that are not the same in all invocations,
> or with an OPTIND value modified to be a value other than 1, produces unspecified results.
284:デフォルトの名無しさん
19/12/23 16:43:06.84 CGg4xw4r.net
bashやkshはローカル変数にでもなってるんだろ
285:デフォルトの名無しさん
19/12/23 20:47:02.60 sS1JWXeN.net
ぷぷぷ、ぷろぐらみんぐ言語論wwwww
286:デフォルトの名無しさん
19/12/23 20:50:03.01 YJsAIsu8.net
>>269
え、そうなん?
じゃあ
URLリンク(pubs.opengroup.org)
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。
ありがとう!勉強になったわ。
287:デフォルトの名無しさん
19/12/23 22:11:39.28 gENEPh5i.net
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
288:デフォルトの名無しさん
19/12/23 22:26:33.99 EXKdfS/F.net
大昔は cd が外部コマンドだったと知って吃驚仰天
289:デフォルトの名無しさん
19/12/24 11:07:35.47 mQqeuoCV.net
そんなバナナ
290:デフォルトの名無しさん
19/12/24 11:10:44.79 8h2rOUkn.net
URLリンク(www.atmarkit.co.jp)
Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd~~と書くと正しくチェンジディレクトリされます。
shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。
# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
291:デフォルトの名無しさん
19/12/24 11:11:40.76 8h2rOUkn.net
URLリンク(tutorialmore.com)
この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?
解決した方
292:法 # 1 主に、シェルの
293:デフォルトの名無しさん
19/12/24 13:50:24.53 lTGNfo7C.net
POSIXシステムには外部バイナリ cd があります
ないけど…?
294:デフォルトの名無しさん
19/12/24 17:56:12.00 O0jTO9nR.net
WSLのUbuntuにもない。
295:デフォルトの名無しさん
19/12/24 18:31:17.89 mQqeuoCV.net
というか、あったとしてどうやって使うのか?
296:デフォルトの名無しさん
19/12/24 18:35:06.35 mQqeuoCV.net
カレントディレクトリを移動してから何か実行させたいならそのcdコマンドからexecしない限りできんよな?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
297:デフォルトの名無しさん
19/12/24 20:48:55.98 uCBqTgFr.net
>>278 が出ているのに。あまり使い道がない例だけどな
298:デフォルトの名無しさん
19/12/24 21:07:13.05 uCBqTgFr.net
URLリンク(pubs.opengroup.org)
APPLICATION USAGE
最初�
299:ノビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん 例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
300:デフォルトの名無しさん
19/12/25 17:49:11.61 DcKuxkE0.net
なるほど
301:デフォルトの名無しさん
19/12/25 18:50:00.73 N+K1pmuB.net
シェルのバックグラウンドジョブとtrapとシグナルについての理解がしたいです。
手許の環境はBashですが、コマンドライン自体はPOSIXに準じているつもりです。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }&
↑このコマンドラインを実行すると
すぐにプロンプトが帰ってきて
start
# 5秒後
end
↑などと出力されます。
一方で
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
↑このコマンドラインを実行すると
start
# 1秒後
trapped
↑と出力されますが(少なくとも手許では)、
バックグランドジョブに回した直後のsleepを除去すると↓
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
何も出力されなくなります。
最後のコマンドラインでもsleep 1を挿入した時と同じ挙動(start→#1秒後→trappedと表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
302:デフォルトの名無しさん
19/12/25 19:25:32.89 GfHtMQ6w.net
シグナルハンドラはデフォルトの動作があらかじめ決まってる
SIGQUITだとコアダンプ吐いて強制終了かな。SIGUSR1/SIGUSR2もなんかあったな
シグナルハンドラを設定しようとするスクリプト(trap)が実行される前にはそのデフォルトのが動いてしまう
シグナルハンドラを設定するスクリプトが実行されるであろうまでsleepで待つか、設定した準備できたと知らせる(親プロセスにシグナル投げるなり)じゃないかな
onhandling=0; trap -- 'onhandling=1' USR1; { trap -- 'echo trapped; exit' QUIT; kill -USR1 $$; echo start; sleep 5& wait $!; echo end; }& while [ $onhandling -eq 0 ]; do sleep 0.1; done; kill -s QUIT $!
とか
シグナル実行抑止遅延とかあったかなあ
303:デフォルトの名無しさん
19/12/25 19:36:59.98 N+K1pmuB.net
>>287
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)
304:デフォルトの名無しさん
19/12/25 19:39:42.14 N+K1pmuB.net
>>288
これは取消します。
これではいかなる場合でもtrapが実行されちゃいますね。
すいませんでした。
305:デフォルトの名無しさん
19/12/25 19:59:14.64 GfHtMQ6w.net
notif=/tmp/$$.fifo; mkfifo $notif; { trap -- 'echo trapped; exit' QUIT; echo read > $notif; echo start; sleep 5& wait $!; echo end; }& read a < $notif; kill -s QUIT $!; rm $notif
通知はFIFO使って、ループが無くなってちょっとスッキリ版
306:デフォルトの名無しさん
19/12/25 20:09:25.33 v8ePSHs/.net
>>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。
コアダンプって出力されるよな?
307:デフォルトの名無しさん
19/12/25 21:22:56.22 rkHGbRnb.net
一行で書くから見づらいったらありゃしないw
そんなごちゃごちゃやらなくても、これでいいやろ?
#!/bin/sh
sleep 1& SLEEP=$!
{
trap -- 'echo trapped; exit' QUIT
kill $SLEEP
echo start
sleep 5& wait $!
echo end
}&
wait $SLEEP
kill -s QUIT $!
一行に戻すでー
sleep 1& SLEEP=$!; { trap -- 'echo trapped; exit' QUIT; kill $SLEEP; echo start; sleep 5& wait $!; echo end; }& wait $SLEEP; kill -s QUIT $!