X



シェルスクリプト総合 その32
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
0002デフォルトの名無しさん
垢版 |
2019/10/25(金) 00:09:51.40ID:6btPTvif
・特記なき場合、POSIX準拠シェルが既定です
 POSIX準拠シェルとBourneシェルの区別はついていますか?BourneシェルはUNIXで過去広く使われたシェルで
 多くの亜種が存在します。Bourneシェルの後継で標準化されたものがPOSIX準拠シェルです
  参考 https://unix.stackexchange.com/questions/145522/
 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シェルは既にレガシーです
 歴史的資料 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でそれらしい単語による簡単な検索もできます
・ワイルドカードは正規表現ではありません
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0003デフォルトの名無しさん
垢版 |
2019/10/25(金) 00:10:25.47ID:6btPTvif
関連スレ

【Bash】Windows Subsystem for Linux【WSL】6
https://mao.5ch.net/test/read.cgi/linux/1560665525/

Bashでプログラミング [転載禁止](c)2ch.net
https://mao.5ch.net/test/read.cgi/linux/1443885102/

シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/unix/1533154936/

zsh その7
https://mevius.5ch.net/test/read.cgi/unix/1337844883/

【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
0004デフォルトの名無しさん
垢版 |
2019/10/25(金) 00:31:55.29ID:pN2Np6rx
隣で仕事してる他社のチームが、新人にコマンドプロンプトのことをMS-DOSって教えてて笑える
0008デフォルトの名無しさん
垢版 |
2019/10/25(金) 19:44:43.63ID:f89Z34lq
あれって MS-DOS プロンプトって名前じゃなかった?
Windows NT の方はコマンドプロンプト。
0010デフォルトの名無しさん
垢版 |
2019/10/25(金) 21:16:19.65ID:Qd2+OiXZ
そういう誰も効かない変な略し方ってどうやって生まれるんだろうね?
俺の知り合いは、AMDをアーマーデーとか言ってた。なんで伸ばすん?
0011デフォルトの名無しさん
垢版 |
2019/10/25(金) 23:38:51.04ID:9ZGj0mXw
ドイツ語読みだとしてもマーがおかC
0014デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:02:34.81ID:5U6kcXeJ
MS-DOS の話をしても現在の Windows で再現できないという理由で嘘つき呼ばわりされる。
0015デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:33:49.92ID:+M+pJ73c
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)

FLAG=$TRUE or $FALSE


↑クソコード

理由
true / false を使えばいい
true / false がない環境があるかもという理屈なら、 [ がない環境もあるかもと考えろ
set -e のときに動かない
[ ! $FALSE ]; echo $? が 1($FALSEと同じ値)を返すことに気づいていない
サブシェルを使うのもアホらしい

たったこれだけのコードに、こんだけのツッコミができるとはw
0016デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:35:45.72ID:+M+pJ73c
TRUE=0
FALSE=1

と書いたほうが遥かにマシだが、
これでも、[ $TRUE ] も [ $FALSE ] も共に 0(成功)を返すので
なんだかなーって感じw
0017デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:38:37.76ID:+M+pJ73c
>>15は [ ! $TRUE ] ← こういうコードを書いてますが、
つまりこういうことですよ

FLAG=$FALSE

if [ $FLAG ]; then
 echo ここが実行されるwww
fi
0018デフォルトの名無しさん
垢版 |
2019/10/26(土) 16:49:43.23ID:+M+pJ73c
変数($FLAG)に、0 or 1 を入れてる人は、

こういう書き方をしたいかんのやで
if [ $FLAG ]; then
if [ ! $FLAG ]; then

if [ $FLAG -eq $TRUE ]; then とか
if [ $FLAG -ne $TRUE ]; then って書かないといかん
0020デフォルトの名無しさん
垢版 |
2019/10/26(土) 20:30:57.76ID:+M+pJ73c
0: コマンドが見つかりません

www
0022デフォルトの名無しさん
垢版 |
2019/10/26(土) 21:55:28.23ID:NL9ts++5
>>21
Mikuの回答とやらで混乱しすぎててわろたw

ま、普通考えて、変数の内容を実行するのは危険だわな
0024デフォルトの名無しさん
垢版 |
2019/10/26(土) 23:42:04.85ID:Mu/CRk1W
0: コマンドが見つかりません
を確かめようと、WSLで実行したらエラー無く実行されたw

/mnt/c/WINDOWS/system32/0
というファイルが有る。

サイズゼロだから問題ないが、なんだこれw

ちなみに1はないのでエラーになる
0025デフォルトの名無しさん
垢版 |
2019/10/27(日) 12:52:55.51ID:HgLbCoih
>>9
DECのVAX上で動くシェルスクリプトのようなものでコマプロってあったな
先輩からはコマンドプロシジャーの略って聞いたけど
今調べると「DCL および MCR コマンド言語インタプリタ」って言うのっぽい
適当にぐぐって出てきたPDFに載ってるそれらしい用語だけどさ
20年以上前の話だ、なつかしい・・・
0026デフォルトの名無しさん
垢版 |
2019/10/27(日) 23:45:43.77ID:seZQk3at
質問スレでこっちでやれってレスもらったのできました。
そのまま同じ書き込みします。

リモートで最新の1つを残してログを削除したいです。
$ ssh 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)

うまくいくようにアドバイスなどいただけるとうれしいです。
0031デフォルトの名無しさん
垢版 |
2019/10/28(月) 00:34:13.46ID:UoBv9hmi
for loop の場合、デフォルトでは "$@" が対象になるので

for var;do ... ;done

と書ける
0032デフォルトの名無しさん
垢版 |
2019/10/28(月) 00:48:08.79ID:h0m+PRW8
>>27
クォートしても同じでした。
ls: /home/app/201909/*.log: No such file or directory

>>28
リモート側が
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
を返してきました。

>>30
ハゲろ!
0033デフォルトの名無しさん
垢版 |
2019/10/28(月) 00:49:49.60ID:+rzOrIi/
>>26
ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'

ってやればいいと思うけど
>>28の人が書いたようにパイプ使ったほうが読みやすい
0035デフォルトの名無しさん
垢版 |
2019/10/28(月) 01:18:31.93ID:h0m+PRW8
考えてくれて、レスをくれてありがとうございます。

>>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を書いてます。

取り急ぎ報告します。エラーについては調べてみます。
0036デフォルトの名無しさん
垢版 |
2019/10/28(月) 01:42:31.88ID:h0m+PRW8
bash: /bin/rm: 引数リストが長すぎます
についてはしかたないので>>28さんのパイプを使うことにしました。

/dev/tty を読み込むために開けませんでした
についてはsshにtオプションをつけました。

`done' 周辺に構文エラーはこれから調べます。

とりあえず当初の目的は達成できました。
みんな親切にありがとうございます。
0039デフォルトの名無しさん
垢版 |
2019/10/29(火) 09:50:33.80ID:zCzSjgo7
sshを複数回動かすよりも一回で全部やらせちゃった方が効率良いような気がするんだ
0041デフォルトの名無しさん
垢版 |
2019/10/29(火) 12:20:30.44ID:zCzSjgo7
forのループごとsshで引き渡せばいいじゃん。1行の長いシェルスクリプトってことね。
0042デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:55:53.48ID:2AEjd6SF
まだ帰宅していないので考えただけですが、
ls | tail | rm したいディレクトリが11個あって、
ディレクトリのpwdは/home/'"$var"'/'"$i"'/ みたいに2箇所変数にしてます。
それをssh1行でループを送れるバエた方法があるますか?
0043デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:59:15.42ID:2AEjd6SF
たしかにsshのループの時にいちいち
Connection to xxx.xxx.xxx.xxx closed
が出てうざかったんですよね。
0044デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:00:01.92ID:gns1i7FP
ヒアドキュメントにすればいいんじゃない

#!/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
0045デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:19:01.08ID:gns1i7FP
と思ったけど、リモートホストのどこかにスクリプトファイルを置いて

ssh host /path/to/script

とかやればいいんじゃないかな

> たしかにsshのループの時にいちいち
> Connection to xxx.xxx.xxx.xxx closed
> が出てうざかったんですよね。

なんでこのメッセージが表示されるんだろう…やっぱり pseudo tty を
使ってるよね
0046デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:32:50.27ID:CowX2GWO
CI/CD で使う、Task Runner みたいな方が良いかも

Ruby なら、Rake を使った、Capistrano とか、
Thor とか
0048デフォルトの名無しさん
垢版 |
2019/10/29(火) 15:00:21.96ID:2AEjd6SF
> ヒアドキュメント
> リモートホストのどこかにスクリプト
なるほど!それならわたしでも理解できます!

> 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が出ます。
0049デフォルトの名無しさん
垢版 |
2019/10/29(火) 15:57:57.38ID:zCzSjgo7
sshで接続する先のサーバに予めシェルスクリプト送り込んでおいてsshで実行だけするという手もあるな。
あまりにも長くて複雑な場合はその方が楽だと思う。

ただし、送り込んでから実行するまでの間に何者かによって別のファイルに置き換えられてしまったら終わりなのでその心配のない環境でしかできない。
0050デフォルトの名無しさん
垢版 |
2019/10/29(火) 15:59:43.78ID:zCzSjgo7
うう。リロードし忘れて書いたら既に同じようなのが書かれている。orz
0051デフォルトの名無しさん
垢版 |
2019/10/29(火) 16:01:56.26ID:spBBwL/I
やり方は忘れたが、ローカルでgzにしたものをワンライナーで
送ってリモートに保存せずに実行っていうのをやったことがある気がする
かもしれないけど、保存していたかもしれない
005246
垢版 |
2019/10/30(水) 15:36:46.01ID:p2ffZ2o0
環境構築のChef は、サーバーに、Ruby をインストールする。
そこで、サーバーに、Ruby Script を転送して、Rubyで実行する

一方、Ansible は、サーバーに、Python をインストールしない

他にも、Capistrano, Terraform などもある
0054デフォルトの名無しさん
垢版 |
2019/10/31(木) 17:56:20.75ID:pBbgzdOe
cshで書いたスクリプトの途中でキーから入力をしたいんですが
なんという命令で実現できますか?
0057デフォルトの名無しさん
垢版 |
2019/11/06(水) 17:06:15.24ID:4kXKpMLv
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならexportすればできるけどさ
0058デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:12:11.78ID:wTTuQQRz
>>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない
0059デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:12:36.64ID:wTTuQQRz
関数も無理やろ?
0060デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:20:58.71ID:wTTuQQRz
たたbashに関数をexportできる機能があるってのは不思議なんだよなw

まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?
0062デフォルトの名無しさん
垢版 |
2019/11/07(木) 00:18:43.96ID:dfqCliYv
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で見た
0064デフォルトの名無しさん
垢版 |
2019/11/07(木) 11:05:05.20ID:cfhO2vSD
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな
0065デフォルトの名無しさん
垢版 |
2019/11/07(木) 11:11:30.53ID:sEmiRyTj
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw

まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?
0066デフォルトの名無しさん
垢版 |
2019/11/07(木) 11:19:16.71ID:cfhO2vSD
>>65
bash -> zsh -> bash
で、bashでは関数になってるけど。zshでも環境変数には存在する
環境変数の引き継ぎってどうなってたかなあ
0069デフォルトの名無しさん
垢版 |
2019/11/07(木) 11:53:35.24ID:sEmiRyTj
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?
0074デフォルトの名無しさん
垢版 |
2019/11/27(水) 15:42:28.61ID:JZevxkSS
kill とtrapでソフトタイマ作ってみた。需要あるかな
0076デフォルトの名無しさん
垢版 |
2019/11/27(水) 18:43:12.26ID:9SXmP3sk
SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。
0077デフォルトの名無しさん
垢版 |
2019/11/27(水) 18:48:52.87ID:KOWJoLHR
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが
0078デフォルトの名無しさん
垢版 |
2019/11/28(木) 06:15:51.80ID:f/6vs/+B
シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。
0079デフォルトの名無しさん
垢版 |
2019/11/28(木) 07:03:59.17ID:uZo2jF8i
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ
0081デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:08:54.32ID:f/6vs/+B
いっぺんにアップできないから小出し。
#! /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 &
0082デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:09:31.03ID:f/6vs/+B
for ((aa = 0; aa < MAX_TIMER; aa++)); do
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;
0083デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:09:55.57ID:f/6vs/+B
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
0084デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:11:04.34ID:f/6vs/+B
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;
終わり
0085デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:24:45.92ID:uZo2jF8i
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。
0086デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:29:37.54ID:f/6vs/+B
動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。
0087デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:30:36.19ID:uZo2jF8i
しばし読んでみたけど、やっぱりわからんw

これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ
0088デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:41:39.82ID:uZo2jF8i
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的
0089デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:42:09.42ID:f/6vs/+B
各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです

tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。
0090デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:49:25.10ID:uZo2jF8i
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。
0091デフォルトの名無しさん
垢版 |
2019/11/28(木) 08:51:32.36ID:uZo2jF8i
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。
0093デフォルトの名無しさん
垢版 |
2019/11/28(木) 21:36:47.47ID:asJppHFe
目的は、bash依存すんな。って言うことだったんだがなw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw
0095デフォルトの名無しさん
垢版 |
2019/11/29(金) 00:53:33.34ID:Fh79+8D6
あんまりソフトタイマに有用性を感じてもらえないようで残念でした。
0100デフォルトの名無しさん
垢版 |
2019/11/30(土) 00:04:41.28ID:FMRNVBPU
Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。

これは何がまずいのでしょうか?

wget -r -A Download拡張子 -I /Downloadディレクトリ URL
0102デフォルトの名無しさん
垢版 |
2019/11/30(土) 00:54:25.61ID:czFcPKLy
碌に調べずの返答でアレなんだが多分訪問先のサイトがファイル一覧
を返すのを禁止してる(apache httpd だと Indexes オプションが有効
になってない)からだと思う
0103デフォルトの名無しさん
垢版 |
2019/11/30(土) 13:20:31.41ID:f33nsdyy
リファラの偽装が必要かも。知らんけど
0106デフォルトの名無しさん
垢版 |
2019/12/01(日) 19:22:22.28ID:IoGKXgrY
>>91
tim_flgをゴミ扱いしたこいつがソフトタイマを理解していない。
0108デフォルトの名無しさん
垢版 |
2019/12/02(月) 22:02:29.21ID:9nn8K+iP
親ディレクトリ
-子ディレ クトリ(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がなんやらと警告が出てきます
0110デフォルトの名無しさん
垢版 |
2019/12/02(月) 22:15:41.19ID:cDa5fVnx
いきなりstatがでるような事はやめて、
echo mv なんとか かんとか で実行命令を表示するようにしろ
怖すぎるわ。それやればなんとかなるだろ
0112デフォルトの名無しさん
垢版 |
2019/12/02(月) 22:46:09.47ID:RT0MauQR
find . -name '*[ ()]*' -print | sort -r | while read item; do
mv "$item" "${item%/*}/$(echo "${item##*/}" | tr ' ()' '_')"
done
0113デフォルトの名無しさん
垢版 |
2019/12/03(火) 07:24:55.79ID:v9g/lO5M
Ruby で作った。
コードは次のレスに書く

DryRun を使ったので実際には、変更されない

ファイル/ディレクトリは、同時に変更すると、バグるかも知れないので、別々に変更する。
また「子ディレクトリ(1)/孫ディレクトリ(1)」のように、2か所以上同時に変更すると、バグるかも知れない

こんな複雑なものを、シェルスクリプトで書くのは超危険!

特に移動は、dest が存在するときは移動になり、
存在しないときは変更になるという、極めて難しい場合分けが必要で、

処理の途中でエラーになると、エラーまでの処理が確定してしまうから、中途半端で巻き戻せないから、
必ず、親ディレクトリ以下のバックアップを取っておく!
0114113
垢版 |
2019/12/03(火) 07:25:55.85ID:v9g/lO5M
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 )
0115デフォルトの名無しさん
垢版 |
2019/12/03(火) 08:29:02.93ID:ujGDA/f+
なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?
0117113
垢版 |
2019/12/03(火) 09:46:02.07ID:v9g/lO5M
mv を作った奴は、頭おかしいw

dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから

漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数

それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
0120デフォルトの名無しさん
垢版 |
2019/12/03(火) 18:09:42.76ID:+zVWCKlo
>>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)
0123デフォルトの名無しさん
垢版 |
2019/12/03(火) 19:27:45.48ID:mUaHu9IR
>>122
perl ワンライナーより
dry run のスイッチと
どのように変更させるかに集中し
出力確認などの余計なことは共通する定型処理だから
コードにまとめたほうが使いやすい
0124デフォルトの名無しさん
垢版 |
2019/12/03(火) 19:44:49.63ID:R2wB6lmg
Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ
0125デフォルトの名無しさん
垢版 |
2019/12/03(火) 20:48:36.39ID:jDo5c24e
renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
0127デフォルトの名無しさん
垢版 |
2019/12/03(火) 22:25:15.93ID:yTVXI633
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
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
0128113
垢版 |
2019/12/03(火) 23:09:51.48ID:v9g/lO5M
Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある

この手の処理の何がヤバイかと言うと、

例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている

データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく

すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
0130デフォルトの名無しさん
垢版 |
2019/12/04(水) 00:03:09.04ID:LOcDYH/A
>>108
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。

$ 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 の方は無傷だからね。好きなだけやり直せるよ。
0132デフォルトの名無しさん
垢版 |
2019/12/04(水) 23:27:09.69ID:xn8KyTI4
renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
0133デフォルトの名無しさん
垢版 |
2019/12/05(木) 00:34:07.65ID:0uggokQM
Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
0134デフォルトの名無しさん
垢版 |
2019/12/05(木) 11:01:01.81ID:3XJjcX6a
>>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
0135デフォルトの名無しさん
垢版 |
2019/12/05(木) 11:02:39.94ID:6ZFP3Xq2
>>132
Debian系はPerl付属のprename、
CentOS系はutil-linuxのrename.ulをrenameとして使ってるらしい
そら人によって言ってることが違う筈だ
0136デフォルトの名無しさん
垢版 |
2019/12/05(木) 15:05:31.16ID:0uggokQM
Larry Wall
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも

https://github.com/tldr-pages/tldr/issues/3125
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 だな
0137デフォルトの名無しさん
垢版 |
2019/12/05(木) 15:14:33.96ID:TzSLtKO4
たぶん基本的なことだと思うんですが、教えてください。

#!/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が入ってしまいます。なぜでしょう…?
0138デフォルトの名無しさん
垢版 |
2019/12/05(木) 15:19:51.21ID:0uggokQM
Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
0141デフォルトの名無しさん
垢版 |
2019/12/05(木) 15:55:06.05ID:Gb1I+/8K
>>137
-eをオプションとして扱うかどうかはシェルによって違う。
bashはオプションだが、dashはオプションではなくただの文字列
0142デフォルトの名無しさん
垢版 |
2019/12/05(木) 15:58:33.95ID:TzSLtKO4
>>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。

ありがとうございました!
0143デフォルトの名無しさん
垢版 |
2019/12/06(金) 20:34:56.63ID:08yg4gJX
宇宙刑事シェバン
0144デフォルトの名無しさん
垢版 |
2019/12/10(火) 22:30:09.16ID:zD6aLrgM
x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。

思い付いたのは
[ ${var%-*} -lt ${var#*-} ]

$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
0145デフォルトの名無しさん
垢版 |
2019/12/10(火) 23:18:51.56ID:kdXCWOtW
$((var < 0))はPOSIX準拠じゃなくね?

やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
0146デフォルトの名無しさん
垢版 |
2019/12/10(火) 23:24:09.60ID:kdXCWOtW
ちなみにうちのマシンだとこんな感じ

$ 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秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
0149デフォルトの名無しさん
垢版 |
2019/12/10(火) 23:50:31.02ID:kdXCWOtW
あとオマケ、速いとは思えないけど

IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2

これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
0156デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:15:38.57ID:rj8eSq0k
バックグラウンドで色々動きっぱなし(usage 60%ぐらい)のWindows PC(Ryzen 5 2600, 3.66GHz)で

Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s

WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s

だった。えっ、私のCygwin遅すぎ・・・
0157デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:21:29.42ID:5YQOA1oq
>>156
うちもcygwinだとそんな感じだわw msysも
WSLは全然速度変わらないのにな

本質的にCPUだけで処理できる内容のはずだが
なにかシステムコール呼び出してるんだろうな
0158デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:26:41.57ID:H3x5MOt+
>>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秒くらいになる
0159デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:40:07.88ID:5YQOA1oq
>>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

まあ速いんだろうけどさ。想定の範囲内かな。
0160デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:40:26.36ID:H3x5MOt+
ランダムな引き算生成するawkバージョン

$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
0161デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:46:42.05ID:5YQOA1oq
お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
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
0162デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:53:02.45ID:mRJcWm57
$ 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
0163デフォルトの名無しさん
垢版 |
2019/12/11(水) 00:54:49.86ID:5YQOA1oq
> 対象の文字列は標準出力ではなくて変数に格納されています。

お前らこの条件忘れてるだろw
0164デフォルトの名無しさん
垢版 |
2019/12/11(水) 01:39:58.92ID:5YQOA1oq
うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん

$ 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
0165デフォルトの名無しさん
垢版 |
2019/12/11(水) 01:44:25.40ID:5YQOA1oq
$ 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
0166デフォルトの名無しさん
垢版 |
2019/12/11(水) 01:47:25.15ID:5YQOA1oq
結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
0167デフォルトの名無しさん
垢版 |
2019/12/11(水) 03:39:07.57ID:MgOCMEvC
>>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする

シェルスクリプトなんかスレッド使わないだろうし
0174デフォルトの名無しさん
垢版 |
2019/12/11(水) 15:22:46.18ID:++mq81bA
プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
0177デフォルトの名無しさん
垢版 |
2019/12/11(水) 15:39:31.82ID:++mq81bA
そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
0179デフォルトの名無しさん
垢版 |
2019/12/11(水) 15:55:15.40ID:++mq81bA
一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw

プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
0183デフォルトの名無しさん
垢版 |
2019/12/12(木) 02:33:13.07ID:NtLqNRlV
>>182
なんでオレに聞くんだよ
シェルスクリプトはスレッド使わないって当然のこと言っただけじゃないか
なんで頭悪い奴が絡んでくるんだよ気持ち悪いな
0184デフォルトの名無しさん
垢版 |
2019/12/12(木) 02:40:24.09ID:n05Ewb3K
CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
0185デフォルトの名無しさん
垢版 |
2019/12/12(木) 03:38:37.48ID:g+q4RhTJ
そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな

> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
0186デフォルトの名無しさん
垢版 |
2019/12/12(木) 03:41:30.87ID:g+q4RhTJ
スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
0187デフォルトの名無しさん
垢版 |
2019/12/12(木) 08:10:01.85ID:NtLqNRlV
>>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話

新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
0189デフォルトの名無しさん
垢版 |
2019/12/12(木) 09:49:29.49ID:AVYkL4QT
本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが

例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く

あとバックグラウンド実行もあるよね

自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
0192デフォルトの名無しさん
垢版 |
2019/12/12(木) 10:24:13.74ID:AVYkL4QT
シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?

シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ


それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
 省略
done < ファイル名

外部コマンド一切なし
0194デフォルトの名無しさん
垢版 |
2019/12/12(木) 12:23:33.66ID:NxSFhA/k
>コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
0195デフォルトの名無しさん
垢版 |
2019/12/12(木) 12:43:03.31ID:NxSFhA/k
>>183
まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
シェルスクリプトを書いてどこがスレッドとか全然わからん、どうスクリプト書けばスレッドになるのかなんて全然わからないとこではあるので、そういう意味ではスレッド使わないと言えるだろうけど

また、>>146にスレッドの効果なんて期待できないだろう。子プロセスがんがん起動しているわけでもなさそうだし、並列化なんてできそうもないスクリプトのようだからね

使ってる環境のshの実態がなんによるかが大きいんじゃないのかな?bashはかなり遅い感じかなあ
0196デフォルトの名無しさん
垢版 |
2019/12/12(木) 12:57:42.86ID:NxSFhA/k
>>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
0197デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:08:19.94ID:AVYkL4QT
>>194
i5 9500は6コア6スレッド
なんでこういつも思い込みで発言するかな?

URL貼れないから「インテルR Core? i5-9500 プロセッサー」からググれ
0198デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:10:23.64ID:AVYkL4QT
>>195
OSのスレッドは使ってなくても、
CPUのコア数が多ければ、シェルスクリプトでそれを使えるから
コア数の数はシェルスクリプトでも意味があるよって話
0199デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:11:47.38ID:AVYkL4QT
>>105
> なんでこういつも思い込みで発言するかな?
そりゃそうやろw

ただの1-2の計算なんか、どんな言語使っても
スレッドの効果なんてねーよw
言語じゃなくてやる処理の問題
0200デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:24:20.77ID:AVYkL4QT
ちなみに>>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'
0203デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:49:53.62ID:mtFqZIGW
$ seq 1 inf | tail

を実行して別のターミナルで

$ top -1

を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
0204デフォルトの名無しさん
垢版 |
2019/12/12(木) 17:08:05.32ID:1H8k0UmA
>>202
わざわざヘルプを別個に書かないでも
gettopts ... case ...
↑この行を解析できるようになれば
半自動的にヘルプが生成できる(のでは)ってことじゃない?
0205デフォルトの名無しさん
垢版 |
2019/12/12(木) 17:46:32.53ID:3GyD1b3F
>>197
ああ、ハイパースレッディングなんてないCPUか。そりゃすまん

わざわざコア6スレッド6なんて書く必要ないだろう、そのスレッドの所以たるハイパースレッディングなんてないんだから、ただのコア6だな
ハイパースレッディングがあるCPUと並列したりする場合にあった方がハイパースレッディングが無いという意味でわざわざ書くぐらいだろう

ハイパースレッディングなんて名前が悪いなw(まあ、CPU内部でやってることはスレッディングなんだろけど)

>>199言い足りなかったのねwやはりいつものか
0206デフォルトの名無しさん
垢版 |
2019/12/12(木) 17:46:52.23ID:AVYkL4QT
>>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、

とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
0210デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:16:03.44ID:n05Ewb3K
>>188
>頭悪いなー
>シェルスクリプトで使うのは1コアだけだろうが
えっ?

>>195
>また、>>146にスレッドの効果なんて期待できないだろう
えっ?

話が噛み合ってなかった理由がわかってみんなスッキリだね
0211デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:21:26.57ID:CkUjiG2X
>>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?

「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
0212デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:22:28.30ID:AVYkL4QT
>>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
0213デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:26:08.31ID:AVYkL4QT
>>211
今シェルスクリプトの話をしてるんですよ?

という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし

例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw

最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
0214デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:33:38.18ID:CkUjiG2X
ああ、>>184なのかそもそもは
スレッド使ってなんか賢いことしてたら、プロセス起動する時間や並列なんぞで速くなるとか思ったのだろう、よくわからんけどw
(スレッド使えば速くなると思いがちというのはありがち)

スレッドでうまいことやっていたとしても、>>146にスレッドの効果なんて期待できないだろうということだよ。>>167のその部分の否定だよ、やんわりとしたw
で、「え?」って?


>>213
イミフ。何をいいたいのかな?C??妄想すぎるな
0215デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:38:11.60ID:CkUjiG2X
>>213
ああ、誰かと同一人物だと思ってる??違うよ
>>167だって、>>170と言っているだろう(プロセスで並列処理だろう)、
>最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
とんちんかんな決めつけだろうなw
0216デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:57:21.35ID:CkUjiG2X
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がプロセスだがスレッドを使っていたりしても、しないだろう

「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
0217デフォルトの名無しさん
垢版 |
2019/12/12(木) 19:01:40.02ID:AVYkL4QT
>>215

↓こいつが馬鹿だって言ってる。

>>188
> シェルスクリプトで使うのは1コアだけだろうが

並列処理しないコードはコアを使わないと言われても
どんな言語でも当たり前としか言えない。そういう話
0218デフォルトの名無しさん
垢版 |
2019/12/12(木) 19:04:56.67ID:AVYkL4QT
>>214

>>167が言うには「シェルスクリプトでスレッドを使わない」(このスレッドとはハイパースレッディングのスレッドの意味)

正しい答えはシェルスクリプトでも並列処理できるし。マルチコアを使い切ることも可能。
0219デフォルトの名無しさん
垢版 |
2019/12/12(木) 19:06:01.30ID:CkUjiG2X
>>217,218
お前には聞いてない。最初からそう思っているおもいっきりばかにしたくてなんだろ?
そんなやつの言うことはww 変に勝手に決めつける点からも明らかに
0223デフォルトの名無しさん
垢版 |
2019/12/13(金) 02:20:43.65ID:ysGzQi5M
>>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか

それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう

シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。

逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts

こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね

cat<<HERE
Usage: ・・・

-a, --aaa aaaaaa
HERE
0224デフォルトの名無しさん
垢版 |
2019/12/13(金) 02:37:48.49ID:r2S5lo/C
HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
0226デフォルトの名無しさん
垢版 |
2019/12/13(金) 12:27:46.56ID:aQIhFndX
素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
0227デフォルトの名無しさん
垢版 |
2019/12/13(金) 16:35:44.26ID:oSsH2Kni
>>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
0228デフォルトの名無しさん
垢版 |
2019/12/13(金) 18:58:27.09ID:ysGzQi5M
個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
0229デフォルトの名無しさん
垢版 |
2019/12/13(金) 19:44:00.66ID:oSsH2Kni
寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
0230デフォルトの名無しさん
垢版 |
2019/12/13(金) 19:51:43.71ID:ysGzQi5M
あ、getoptが良いって言ってるわけじゃないよw

getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
0231デフォルトの名無しさん
垢版 |
2019/12/13(金) 19:55:08.60ID:ysGzQi5M
あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
0232デフォルトの名無しさん
垢版 |
2019/12/13(金) 21:32:49.16ID:oSsH2Kni
そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
0233デフォルトの名無しさん
垢版 |
2019/12/14(土) 11:52:21.09ID:gTK06/8e
POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
0236デフォルトの名無しさん
垢版 |
2019/12/14(土) 21:20:20.57ID:6YH7rFov
オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない

開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理

MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。

古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
0237デフォルトの名無しさん
垢版 |
2019/12/14(土) 23:05:33.87ID:gTK06/8e
まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
0238デフォルトの名無しさん
垢版 |
2019/12/15(日) 02:19:32.16ID:a0yEED8b
>>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか

ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。

シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
0239デフォルトの名無しさん
垢版 |
2019/12/15(日) 03:19:52.38ID:woT0VW+T
ソフトウェア作ってるのはそんなの気にしないだろう
拡張部分で同じだがちょっと違うとは普通にあるのだし
やるのは他の誰か必要と思ったのがやるもんだろな、たとえば>>238
0240デフォルトの名無しさん
垢版 |
2019/12/15(日) 04:20:02.09ID:3SLEzfiL
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw
0242デフォルトの名無しさん
垢版 |
2019/12/15(日) 10:01:39.28ID:E44EqLgR
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。

で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。

という訳で誰かそういうwiki作ってw
0244デフォルトの名無しさん
垢版 |
2019/12/16(月) 00:44:09.03ID:5wUpgmce
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
0246デフォルトの名無しさん
垢版 |
2019/12/17(火) 13:48:36.21ID:BxEORdhA
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
0247デフォルトの名無しさん
垢版 |
2019/12/17(火) 22:02:31.85ID:kdkfgKcy
>>244
なければ作るとよい
0248デフォルトの名無しさん
垢版 |
2019/12/18(水) 18:56:56.67ID:Cw3S1jU2
manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
0249デフォルトの名無しさん
垢版 |
2019/12/18(水) 19:39:48.69ID:uFDqtnkl
日本語の問題とman自身の問題は別の話でしょう?

英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?

日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)

アプリとそのマニュアルは本来別でリリースすべきなんだろう
0250デフォルトの名無しさん
垢版 |
2019/12/19(木) 10:03:23.50ID:y7Q/2NKF
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
0251デフォルトの名無しさん
垢版 |
2019/12/19(木) 11:24:35.20ID:belDjs1+
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
0252デフォルトの名無しさん
垢版 |
2019/12/19(木) 16:35:50.82ID:jArWapvD
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
0253デフォルトの名無しさん
垢版 |
2019/12/19(木) 18:30:09.45ID:4hkxYlHE
bashで関数名に使える文字と使えない文字ってこれであってる?

・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)

・使えない
! " $ & ' ( ) \ | ` < > ; スペース

何だこのカオスwww
0254デフォルトの名無しさん
垢版 |
2019/12/19(木) 18:38:08.39ID:UoMpZOx6
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
0255デフォルトの名無しさん
垢版 |
2019/12/21(土) 20:28:47.93ID:X9+p8H27
func() {
 foo "123$@"
}

って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた

func() {
 tar "v$@"
}

func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ

はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
0256デフォルトの名無しさん
垢版 |
2019/12/22(日) 11:21:06.45ID:JDtuJK73
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
0257デフォルトの名無しさん
垢版 |
2019/12/22(日) 11:45:14.20ID:JDtuJK73
sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
0258デフォルトの名無しさん
垢版 |
2019/12/22(日) 12:51:34.17ID:O05uH48x
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ
0259デフォルトの名無しさん
垢版 |
2019/12/22(日) 15:12:02.64ID:JDtuJK73
>>258
なるほど。

ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
0260デフォルトの名無しさん
垢版 |
2019/12/22(日) 15:49:52.02ID:9GUBQyj0
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。

#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
0261デフォルトの名無しさん
垢版 |
2019/12/22(日) 16:03:17.69ID:XO28QfbO
削除じゃなくてコメントにしちゃうとか

sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
0262デフォルトの名無しさん
垢版 |
2019/12/22(日) 17:46:01.65ID:O05uH48x
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。

bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね
0263デフォルトの名無しさん
垢版 |
2019/12/22(日) 18:25:06.92ID:M+q9E136
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
0264デフォルトの名無しさん
垢版 |
2019/12/23(月) 15:40:09.98ID:YJsAIsu8
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる

dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
0265デフォルトの名無しさん
垢版 |
2019/12/23(月) 15:55:18.14ID:YJsAIsu8
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。

でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
0266デフォルトの名無しさん
垢版 |
2019/12/23(月) 16:20:51.38ID:CGg4xw4r
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと

> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
0268デフォルトの名無しさん
垢版 |
2019/12/23(月) 16:36:13.95ID:YJsAIsu8
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
0269デフォルトの名無しさん
垢版 |
2019/12/23(月) 16:37:34.35ID:CGg4xw4r
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ

どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
0270デフォルトの名無しさん
垢版 |
2019/12/23(月) 16:40:45.68ID:CGg4xw4r
>>268
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html

> 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.
0274デフォルトの名無しさん
垢版 |
2019/12/23(月) 22:11:39.28ID:gENEPh5i
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
0276デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:07:35.47ID:mQqeuoCV
そんなバナナ
0277デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:10:44.79ID:8h2rOUkn
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32549&;forum=6

Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd〜〜と書くと正しくチェンジディレクトリされます。

shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。

# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
0278デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:11:40.76ID:8h2rOUkn
https://tutorialmore.com/questions-292990.htm

この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?

解決した方法 # 1
主に、シェルの
0281デフォルトの名無しさん
垢版 |
2019/12/24(火) 18:31:17.89ID:mQqeuoCV
というか、あったとしてどうやって使うのか?
0282デフォルトの名無しさん
垢版 |
2019/12/24(火) 18:35:06.35ID:mQqeuoCV
カレントディレクトリを移動してから何か実行させたいならそのcdコマンドからexecしない限りできんよな?
とするとそのcdコマンドはディレクトリだけでなく実行するコマンドを引数として受け取るのか?
0284デフォルトの名無しさん
垢版 |
2019/12/24(火) 21:07:13.05ID:uCBqTgFr
https://pubs.opengroup.org/onlinepubs/009695399/utilities/cd.html
APPLICATION USAGE
最初にビルトインに決まってるという説明の後で、ほぼ同じこと書いてあるやん
例が実行できるようにするには必要で、これはできないとは書いてないからあるのが仕様内だろう、たぶん
こんな使い方しねーよで無いんじゃないの、Ubuntu(Debian?)などは
0285デフォルトの名無しさん
垢版 |
2019/12/25(水) 17:49:11.61ID:DcKuxkE0
なるほど
0286デフォルトの名無しさん
垢版 |
2019/12/25(水) 18:50:00.73ID:N+K1pmuB
シェルのバックグラウンドジョブと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と表示)に
させるにはどうすればいいでしょうか。
どうかご教示ください。
0287デフォルトの名無しさん
垢版 |
2019/12/25(水) 19:25:32.89ID:GfHtMQ6w
シグナルハンドラはデフォルトの動作があらかじめ決まってる
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 $!
とか

シグナル実行抑止遅延とかあったかなあ
0288デフォルトの名無しさん
垢版 |
2019/12/25(水) 19:36:59.98ID:N+K1pmuB
>>287
ありがとうございます!
無事解決しました。
ところで (すでに問題は解決できたので)単なる興味本位なのですが、
trap -- 'kill -s QUIT $!' USR1; { trap -- 'echo trapped; exit' QUIT; kill -s USR1 $$; echo start; sleep 5& wait $!; echo end;
}&
↑これだと問題ありますか。
素人目線では上手くいくような気がしますが、子プロセスを殺すtrapを親プロセスの前に仕掛けてるあたりが
マズい気がします……。
(ちなみに手許では>>287様が示してくださったものと同様上手くいきました)
0289デフォルトの名無しさん
垢版 |
2019/12/25(水) 19:39:42.14ID:N+K1pmuB
>>288
これは取消します。
これではいかなる場合でもtrapが実行されちゃいますね。
すいませんでした。
0290デフォルトの名無しさん
垢版 |
2019/12/25(水) 19:59:14.64ID:GfHtMQ6w
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使って、ループが無くなってちょっとスッキリ版
0291デフォルトの名無しさん
垢版 |
2019/12/25(水) 20:09:25.33ID:v8ePSHs/
>>286
> { trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& kill -s QUIT $!
> 何も出力されなくなります。

コアダンプって出力されるよな?
0292デフォルトの名無しさん
垢版 |
2019/12/25(水) 21:22:56.22ID:rkHGbRnb
一行で書くから見づらいったらありゃしない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 $!
0293デフォルトの名無しさん
垢版 |
2019/12/25(水) 22:03:53.28ID:N+K1pmuB
>>291
うーん。すいません。
恐らくシステムか何かがコアダンプを生成しないようになっているようです。
コアダンプはありませんでした。
0295デフォルトの名無しさん
垢版 |
2019/12/25(水) 22:29:25.06ID:ixBqsT77
このスレにtrapでソフトタイマを作ったのが載ってるよ。
0297デフォルトの名無しさん
垢版 |
2019/12/26(木) 00:40:43.87ID:uF/G2OAQ
いちゃもんつけながらでないと自己表現できない自分が確認できない、いつものやつ
0300デフォルトの名無しさん
垢版 |
2019/12/26(木) 00:58:56.93ID:0kHOyMkL
「俺」を否定することはできても
「レス」は否定できないやろ?w
>>292とかシンプルで美しい回答だからな
0302デフォルトの名無しさん
垢版 |
2019/12/26(木) 01:03:25.32ID:0kHOyMkL
そうそう俺を叩いた所で無駄やで。煽り耐性レベルMAXだからな
そんなくだらないことよりレス(シェルスクリプト)の話をしようや
0303デフォルトの名無しさん
垢版 |
2019/12/26(木) 10:54:33.00ID:zbYMFUyq
>>292はいいな。タイムアウトまで実装できてる
>>287とか>>290だとバグで通知が行われないとフリーズしてしまうが
>>292だと一定期間でタイムアウトになって処理を継続できる
0304デフォルトの名無しさん
垢版 |
2019/12/26(木) 12:41:29.91ID:MI1/ojN2
>>292だとどうしても1秒間停止してしまわない?
echo trappedを(適切に)実行する準備が整い次第速やかにkill QUITしたいんじゃ
なかったっけ?
>「sleep 1を付けると(シグナルハンドラを設定するスクリプトが起動する猶予が生れて)
start→trappedが出力されるけど、sleep 1を取っ払っても作動するようにしたい」

>>287の実装が一番良いな。
シグナル受け取り側の準備が出来るまで実直に待ってるから余計な待ち時間はほぼ発生しない。
sleep <小数点>はBash拡張ってのが玉に瑕だけどもともとBash前提だから問題ない。
0305デフォルトの名無しさん
垢版 |
2019/12/26(木) 12:47:29.21ID:zbYMFUyq
>>304
よく読んでみて、停止しないでしょ?
必要最小限しかwaitしない

>>287だと0.1秒待つことになるが
そんなに待たないし、ループで負荷をかけることもない
0306デフォルトの名無しさん
垢版 |
2019/12/26(木) 12:51:43.96ID:zbYMFUyq
仮にwaitする前にsleepが(一瞬で)killされたとしても
wait ${すでにいないPID} を実行してもエラーにならないんだよね
0307デフォルトの名無しさん
垢版 |
2019/12/26(木) 13:26:19.54ID:zbYMFUyq
>>287>>292もQUITだとdashで想定どおりに動かないからTERMに変更したけど
timeで測りやすくスクリプトにして実行した結果はこんな感じ

$ time sh 287.sh
start
trapped

real 0m0.103s
user 0m0.001s
sys 0m0.002s


$ time sh 292.sh
start
trapped

real 0m0.002s
user 0m0.002s
sys 0m0.000s


>>287は多くの場合、最初の [ $onhandling -eq 0 ]; を満たさないのでsleep 0.1をすることになる。
なので↓のsleep 1を取っ払いたい要望に対して、sleep 0.1に変えたのと大差なくなってる。
{ trap -- 'echo trapped; exit' QUIT; echo start; sleep 5& wait $!; echo end; }& sleep 1; kill -s QUIT $!
0312デフォルトの名無しさん
垢版 |
2019/12/26(木) 20:40:26.24ID:VT4/hGaE
ただいま。ってかお前ら何やってんの?w
また俺じゃない人に絡んでるようだが
0315デフォルトの名無しさん
垢版 |
2019/12/26(木) 21:06:21.96ID:GKWkZChC
はいはい
同じ反応速度、普通のスクリプトでわいわいなレスに対していきなりな同じ態度レスで絡む
同一人物でいいだろ。そんな辺なやつはそう居ないと思うけど
0319デフォルトの名無しさん
垢版 |
2019/12/26(木) 21:35:49.17ID:VT4/hGaE
>>307
俺もやってみたけどQUITじゃたしかにdashで動かないね
確かめたつもりだったけど

> sleep 0.1に変えたのと大差なくなってる。
実際のところ、この例だとsleep 0でも問題なかったりする
sleepという外部プロセスを呼び出す時間があれば、その間にtrapできてるから

と思ってkshでやったら動かんかったわw
kshではsleepはシェルビルトインなんだな
0320デフォルトの名無しさん
垢版 |
2019/12/27(金) 09:20:57.82ID:NrzsOb0y
横だけどQUITって使うことってある?
OSとかデバッガ系なら使うことあるだろうけど
アプリでは使わないほうが良いんじゃいかな?
0324デフォルトの名無しさん
垢版 |
2019/12/28(土) 23:26:23.77ID:lWCFWx/Q
QUITをトラップするとコアダンプ機能が使えなくなるというデメリットがあるね
普通はQUITでコアダンプするわけだから、あれ?コアダンプできない?ってなるかもしれない
コアダンプを明示的に生成する方法あるのかな?
あと、もしかしてdash、ksh、yashだとQUITってtrapできない?
trapしても何も動作しない
0326デフォルトの名無しさん
垢版 |
2019/12/29(日) 01:53:56.90ID:MrCxy9bb
#!/bin/sh
trap 'echo trapped; exit' QUIT
echo $$
sleep 60


これを、sh test.sh & ってやって
表示されたプロセスIDに対してkill -q QUIT プロセスIDって
やっても何も表示されないんだけど、どうやって確認した?
0328デフォルトの名無しさん
垢版 |
2019/12/29(日) 02:10:00.25ID:FmabBrht
なんか言い方が変だな。POSIXでそのような文が書いてあったと思うそのまま書いた
コマンドが実行中はシグナル受け取っても実行されない、コマンドが終わってから実行
for i in $(seq 60); do sleep 1; done
とかで動くでしょ
0329デフォルトの名無しさん
垢版 |
2019/12/29(日) 02:13:23.19ID:MrCxy9bb
あれ?なんかおかしいね。
じゃあ>>287がbashだとtrappedって表示されて
shでは何も表示されないのはなぜ?

念の為、整形したやつ
#!/bin/sh
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 $!
0333デフォルトの名無しさん
垢版 |
2019/12/29(日) 02:25:16.44ID:FmabBrht
>>329
shって?dashでいいの?表示されたけど
強制終了ってなにをいいたいのかわからん
dashはtrap中の標準出力にクセがあるかな?dash起動してコマンドラインでtrapでechoして、他からシグナル送っても出力されないリターンキー叩いたりしたら出る、コマンドラインではね>>329はそうならんけど

>>332
なにを言いたいのかわからん。>>326は解決したんだろ?
強制終了と思い込んで次の展開されても困るぞ
0334デフォルトの名無しさん
垢版 |
2019/12/29(日) 02:31:00.58ID:MrCxy9bb
>>333
全ては>>329でdashとbashで動作に違いがあるってことだよ
強制終了は強制終了。そのまんま終了してしまうってこと
0335デフォルトの名無しさん
垢版 |
2019/12/29(日) 02:46:04.76ID:FmabBrht
強制終了自体してなくないんじゃないの
なぜかスクリプトファイルとして実行すると、dash/kshではサブシェルのtrapが動いてないな>>329
シグナル無視なのかなんなのかendまで動き終わる

>>326はそんなんじゃなくて、単なるシンプルな間違いで、違いもなんもないけど
0337デフォルトの名無しさん
垢版 |
2019/12/31(火) 07:15:28.46ID:xfr0s5Fj
PowerShell最強説
0343デフォルトの名無しさん
垢版 |
2020/01/01(水) 08:19:52.80ID:6zSEt3Eo
>>337
使用されることが最強に少ない感
0344デフォルトの名無しさん
垢版 |
2020/01/02(木) 13:42:39.95ID:ZoBKtk8g
例えば/usr/local/binに

#!/bin/bash
xdg-open /usr/local/bin/hoge.html

という中身のhogeってファイル入れてコマンドで同階層のhtmlを開きたい場合、
ブラウザを閉じたら

[Parent fuga,Cecko_IOThread]
WARNING:pipe error: Connection reset by peer(piyo):
Connection reset bu peer:
file /build/firefox-esr-tpvy6K/filefox-esr-68.2.0esr/ipc/chromium/src/chrome/common/ipc_channel_posix.cc. line 358

という表示が出てくるのですがこれを表示させない方法ってありますか?
0346デフォルトの名無しさん
垢版 |
2020/01/02(木) 14:17:59.62ID:ZoBKtk8g
>>345
つまり標準ブラウザ変えるかchromeとかにすれば良い感じですね。pipe errorとか connection reset の方で検索してました、ありがとうございますm(_ _)m
0348デフォルトの名無しさん
垢版 |
2020/01/10(金) 15:59:20.38ID:pZwemz/Y
GNU sedって一応POSIXに準拠してるけど、色々拡張機能もあるじゃん
こういう拡張機能がほとんど無い、純粋にPOSIX標準に準じたようなsedやらawk、bcなんかの実装ってある?
0349デフォルトの名無しさん
垢版 |
2020/01/10(金) 16:05:57.94ID:c8NDboJX
GNU sed, GNU awk には --posix オプション、GNU bc には --standard
っていうオプションが用意されている
0351デフォルトの名無しさん
垢版 |
2020/01/11(土) 21:29:54.53ID:9SPVzhvj
やっぱzshクソ。pathとかstatusが特殊変数なのやめてくれ。
しかも大文字と小文字区別しねーし
path=hogehogeってやったら、環境変数PATHから検索しなくなる。
command not found!
0353デフォルトの名無しさん
垢版 |
2020/01/11(土) 23:39:31.73ID:NBzz9dXo
なんだ、単に zsh = ksh + tcsh ってのを理解してなくて的外れな文句言っているだけじゃん
アホらしい。文字通り
0355デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:36:05.07ID:FpBV3Lt5
>>1より
> ・csh/tcshでのシェルスクリプトは*まったく推奨しません*

>>353
> なんだ、単に zsh = ksh + tcsh ってのを
kshにまったく推奨しないものを加えたら、クソになるんじゃないですかねぇ(笑)
0356デフォルトの名無しさん
垢版 |
2020/01/12(日) 09:39:05.21ID:u1ffAIxu
あと、環境変数の大文字と小文字は区別されてるのに
PATHに関してだけ区別されないのはどう考えてもクソだと思いますよ

pathに代入してもPATHが変わるってどう考えても
存在理由がない機能でしょw
0358デフォルトの名無しさん
垢版 |
2020/01/12(日) 17:34:52.15ID:J9pO5B5T
そんなに不満があるなら誰かがフォークしてそれがメジャーになってるだろ
俺が正しいって言ってもお前の頭の中ではだな
0361デフォルトの名無しさん
垢版 |
2020/01/12(日) 19:23:15.19ID:J9pO5B5T
>>356
わざわざ後付けで書いてあるのに根本的に何も理解しようとしてないだけだな
大文字小文字を判断してないじゃないよ、
PATHは単なる文字列pathは配列、
pathはcsh特有での、
PATHとpathという別の2つの環境変数
shモードcshモードを切り替えてなんていう実装ではなくちゃんぽんの可能な実装なので、PATH/pathをどちらか変更したら相対する方にも同期するというのだろ。そもそもcshでのpathがそういうものらしいが
内部的に参照しているのはpathの方かな。同期されない特定状態の場合から(どういうときか探してみようw)

今まで使っていたのと違うというだけじゃ話にならない、俺が正しいって言ってもお前の頭の中ではだなでしかないということ(>>355なんてそれが甚だしいけどw)
0362デフォルトの名無しさん
垢版 |
2020/01/12(日) 21:32:38.39ID:UPYAUoGA
cshがーっていうけど、zshとcshに互換性はまったくないじゃん
真似しなくていいものを真似した結果、貴重な短い変数名が
使えなくなってしまったことに違いはないんだけど
0363デフォルトの名無しさん
垢版 |
2020/01/12(日) 21:53:04.90ID:J9pO5B5T
作りもしないのに何を文句だけ言っているのだか。そんなに俺が偉いしたいの?
This is a shar file containing zsh, a ksh/tcsh-like shell.
というコンセプトで始めてるんだよ、その成果が認められているのは有名ディストリでもパッケージとしてあるんだから明らかだろう

そんなに俺の考えたのが最強なら作ってみればいいじゃん、フォークしてでも。世界に名を轟かせるいい機会だぞ、こんな匿名で偉そうに評論してんじゃなくw
0364デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:07:46.46ID:7H3TRCXg
zshのクソ機能をクソ機能と言っただけで
なにファビョってるんだろう?

お前が作ったわけでもないだろうに
バカにされたとでも思ってるのか?
0365デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:14:00.70ID:J9pO5B5T
クソ機能をクソ機能と言えるほど全然賢くないのが明らかなのに、自覚のないヤツ(ら?)だなあという。自覚がないようだからでしかないんだがな

いや、そのコメでますますアレでしかないなあ。自分は何かをクソと呼ぶが、自分が同じように呼ばれると聞かないって、じゃあ、そもそもどういうつもりでクソと呼んでいるのか?哲学だよww
結局俺偉いだけもしくはただの根拠のない感情だけだから、俺が自分自身と同じだと思ってそんなコメすんだろな?としか思えんけど
0366デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:26:10.29ID:7H3TRCXg
うわっw なんだろう、これ美味しくないって言ったら
お前は料理できるんか?みたいな反応

ただの評論家だろ、評論家は評論するな!
自分で料理しろ、自分で自分で絵をかけ、自分で歌を歌え
プロよりうまくなかったら、評価する資格なし。みたいな極端な考えw
0367デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:29:57.49ID:J9pO5B5T
わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん
それに対して、そんなことないぞなぜなら〜と返しているのだが。なにか問題があるか?
料理調理の内容がというなら自分で作れというのはいたって当たり前だろう。不満があったら自分で調理するのがOSSだからな

結局俺偉いってだけで反論を許さない、なぜなら俺偉いからというだけかw
0368デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:36:44.16ID:7H3TRCXg
> わざわざ不特定多数のとこで美味しくないという個人的感情を書く理由はなんなん

レビュー。Googleもやってるで
0369デフォルトの名無しさん
垢版 |
2020/01/12(日) 22:39:15.15ID:J9pO5B5T
ちょっと意味がわからんが、ああいうとこはやりとりはしないできないだろ
てか、ど素人かよ。スクリプトであってもまがりなりにも何か自分で作っているのに未だど素人かよと思ってしまうな、クレーマーレベルすぎてw
0370デフォルトの名無しさん
垢版 |
2020/01/13(月) 05:57:08.53ID:iUioslZh
そんなに気に入らないなら自分で新しいシェル作れば良いのに。
0371デフォルトの名無しさん
垢版 |
2020/01/13(月) 06:56:27.50ID:00IYKkjv
信者の例

新しいバトルシステムが使いづらい
→ そんなに気に入らないなら自分で新しいゲーム作れば良いのに

「設定」が使いづらい
→ そんなに気に入らないなら自分でOS作れば良いのに
0372デフォルトの名無しさん
垢版 |
2020/01/13(月) 12:47:53.36ID:cEXtDkBR
ナポレオン「私は卵を産めないが、卵が腐っていると判断できる」

(Zshの利用者が満足するような)シェルを作れる自信はないが、
Zshの一部機能を腐ってるとは言える。

ていうか他の人も指摘してたけど二三の欠点を指摘されただけで
まるで自分の人格を全否定されたかのような反応をするのってどういう感情なんだろう?
0373デフォルトの名無しさん
垢版 |
2020/01/13(月) 15:10:18.33ID:v+Mp6rDH
psコマンドで見て a.out で実行されているプロセスを全部 kill -9 してくれるスクリプトってどう書いたらいいですか
0375デフォルトの名無しさん
垢版 |
2020/01/13(月) 15:35:35.00ID:v+Mp6rDH
約に立たない2chのクズ共が自分で調べた方が早い

ps | grep "./a.out" | grep -v grep | awk '{ print "kill -9", $1}' | sh
0378デフォルトの名無しさん
垢版 |
2020/01/13(月) 16:03:48.34ID:cEXtDkBR
煽って回答を貰うのはよく見掛ける光景だけど
煽りながら自己解決するのは珍しいなw
0379デフォルトの名無しさん
垢版 |
2020/01/13(月) 16:56:48.83ID:48BANHU6
zshはbashの強化版だと思ってたら違うのね
bashを覚えるので手一杯なんで他のシェルに浮気する余裕ないけど
0380デフォルトの名無しさん
垢版 |
2020/01/13(月) 22:41:06.83ID:ybxFvJaC
シェルスクリプトとしてはzshは使わないね。
bashとだいたい互換性があるシェル。
スクリプトとしてはPOSIX準拠にするかbashでしょう
0381デフォルトの名無しさん
垢版 |
2020/01/13(月) 23:52:57.18ID:HaVRjpT+
>>379
派生、元とした流れが全く違うからね
新しい機能つけるのに相互に参照してたり参考にしてたりするかもだが
0383デフォルトの名無しさん
垢版 |
2020/01/14(火) 03:49:13.20ID:GtH+RxOj
アップデートでは強制にならないよ
アップデートでなくても強制でもないし、単なるデフォ
0386デフォルトの名無しさん
垢版 |
2020/01/14(火) 18:09:26.71ID:Xjyusg2Z
この図 https://tangentsoft.com/misc/unix-shells.svg を見ると
zshはtcshを取り入れてると言うが、正確にはそれをやったのはKornShellで
その後継のksh88が、POSIX shellやbash等の現存する全てのシェルの祖先に
なるわけだから、zshと同様にdashやbashなんかもtcshを取り入れてることになるんだよな。
0388デフォルトの名無しさん
垢版 |
2020/01/14(火) 18:46:58.03ID:3k/caRNi
kshってなんか凄いんだな

昔、AIXでksh書いた事あるけど
AIXぐらいでしかインストールされてる環境に出逢ったことない
Solarisでbsh書いてた後に触って配列使えて感動したのを覚えてる
また使ってみるかなぁ
0389デフォルトの名無しさん
垢版 |
2020/01/14(火) 23:00:12.31ID:eC6vK415
>>386
図だけで想像しすぎ
kshで取り入れたのはヒストリ機能などの極めて一部
そういろいろいうなら、ちゃんと調べた方がいいよ
0390デフォルトの名無しさん
垢版 |
2020/01/14(火) 23:05:01.84ID:eC6vK415
>>388
インストールというのならmacOSも昔から標準で入ってる
デフォルトログインシェルなのはAIXぐらいらしいね
0391デフォルトの名無しさん
垢版 |
2020/01/15(水) 00:00:09.35ID:kWU6CwmB
UNIXでbshができる
BSDでcshができる
改良版のtcshができる
bshにtcshを追加したkshができる
kshが商用だったので派生が拡がる
軽量版bshのashができる
Lnux版ashのdashができる
GNU版bshのbashができる
機能マシマシのzshができる
独立系のfishができる

こんな感じか
文字の修正とか昔のbashにはなかったらしいな
0394デフォルトの名無しさん
垢版 |
2020/01/15(水) 07:03:57.56ID:kWU6CwmB
関係ないから独立系にしたんだけど
0395デフォルトの名無しさん
垢版 |
2020/01/15(水) 07:44:52.57ID:YlxQUfnE
それ依然に単に図を適当に日本語にしただけの説明なんてしなくていいから。
0398デフォルトの名無しさん
垢版 |
2020/01/19(日) 08:08:23.81ID:q9WTUin1
例えば'100 50'を渡すとして、コマンドと実行結果がそれぞれ
awk '$0' #100 50
awk '$0+=1' #101
awk '$0+=$0' #200
awk '$0+=$2/2' #125
awk '$1+=$2/2' #125 50
みたいになったのですが、内側3つの挙動がよく分かりません。
予想ではそれぞれ'101 51'や'200 100'や'125 75'等になると思っていたのですが、
$0って計算式を書き込むと$1を表示する仕組みなんでしょうか…?
0399デフォルトの名無しさん
垢版 |
2020/01/19(日) 09:17:02.04ID:qcodQ+dh
$1, $2 などは、フィールド(列)変数。
$0 は、入力レコード(行)全体

こういう特別な変数に、代入してはいけない!
読み込む事だけに使うこと!
0400デフォルトの名無しさん
垢版 |
2020/01/19(日) 11:47:43.00ID:eoYSOV4S
それは言いすぎだろう。少なくとも gawk では何が起こるか明確になっている。
理解する気が無いならやらない方がいいというならその通りだ。
0401デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:39:38.50ID:JpGnQ0ST
シェル芸の定義って、スクリプトファイル作らないで、シェル(CLI)を駆使して
実用的ではないネタを披露すること。でいいですかね?

いやあまりにもくだらないネタが多いんで
0403デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:52:31.45ID:JpGnQ0ST
難読化シェル芸の解読
ながいPythonコードをシェル芸で実行させる
じわじわ広がる星型模様シェル芸
動く!電光掲示板シェル芸
ボディビルダーが泳ぐシェル芸
アイドルグループが46か48かわからなくなったときにワンライナーで解決する方法
鬼滅の刃の幾何学模様シェル芸
踊るgifシェル芸
ojichatグラフシェル芸
3の倍数と3が付く数字のときだけアホになるシェル芸
床屋シェル芸
闇シェル芸「さあ、闇のゲーム(シェルゲイム)の始まりだぜ!」
実践 キングウンコの作り方
画像っぽい素数をシェル芸でつくる
fish起動時にサイゼリヤ1000円ガチャの結果を表示する
【危険シェル芸】禁じられた闇の魔術とその防衛術??
0404デフォルトの名無しさん
垢版 |
2020/01/19(日) 19:54:37.30ID:ExWppFRM
>>400
POSIXでも、
The symbol $0 shall refer to the entire record; setting any other field causes the re-evaluation of $0. Assigning to $0 shall reset the values of all other fields and the NF built-in variable
と明言してるね。$1〜$nを変えれば$0が再構築され、$0を変えれば$1〜$nとNFが作り直される風に
0407デフォルトの名無しさん
垢版 |
2020/01/20(月) 15:24:29.08ID:oVJVVsJQ
>>399 >>404
ありがとうございます、普通に動くから大丈夫だと思ってましたm(_ _)m
とりあえず今後は素直にprintで出力します
0409デフォルトの名無しさん
垢版 |
2020/01/21(火) 21:11:00.03ID:Mn6KsPak
教えていただきたいことがあります。
ワンクリックで複数のターミナルを開いてそれぞれで別々のコマンドを動かすスクリプトを書きたいと思っています。
gnome-teminalにオプションつけたらいけるかと思いますしたが、うまく行かなくて、、なにかアドバイスいただけないでしょうか
0410デフォルトの名無しさん
垢版 |
2020/01/22(水) 07:07:11.43ID:uCiji4On
gnome-terminal なら -- の後に実行したいコマンドを書けばいいだけみたいだけど
動いているが挙動がイマイチとかじゃないの?
うまく行かないって、そのままTerminalとしてウィンドウを残しておきたいとか引き続きインタラクティブでなんかしたいとか?
0411デフォルトの名無しさん
垢版 |
2020/01/22(水) 07:22:53.82ID:uCiji4On
GUI Terminalアプリは一般的にコマンドが実行し終えたらアプリも終える=ウィンドウも消えるという、まあそうなるか的な(まあshもそうだし)
gnome-terminalはオプションでウィンドウを残すようにできるが、なんかイマイチかな、出るべきものが出てないとか
gnome-terminal -- sh -c 'なんかコマンド;sh'
が確実に解りやすいかなあ

shで引き続きインタラクティブにするのには、--rcfile スクリプトファイル という変態的な方法で
gnome-terminal -- sh --rcfile スクリプトファイル
とかあったが、変態すぎてしないなw
0412デフォルトの名無しさん
垢版 |
2020/01/22(水) 20:17:38.02ID:IMIM4EWG
返信ありがとうございます!
具体的にはFIFOを複数作成した後に、
ffplay (作成したfifo) というコマンドを
fifoの数だけ開きたいのですが、数が多くて一つ一つ開くのは大変なので、スクリプトで一気に開けないかと考えているところです。
0413デフォルトの名無しさん
垢版 |
2020/01/22(水) 20:31:41.36ID:aGAY9ZaD
ffplayって自分で独自のウィンドウ開くんじゃないの?
全てバックグラウンドで起動する/動かせばいいんじゃないの?
ffplayが吐くログも同時に見たいとか??
0415デフォルトの名無しさん
垢版 |
2020/01/22(水) 21:18:09.64ID:aGAY9ZaD
for i in 1 2 3 4; do
gnome-terminal -- ffplay $i.fifo
done
で、再生中はTerminalウィンドウも健在でログも見えるんじゃないの。ffplayが終了したらTerminalウィンドウは閉じてしまう
gnome-terminal -- sh -c "ffplay $i.fifo;sh"
で、Terminalウィンドウも残ると思うけど。Terminalウィンドウでffplayを終了させようとctrl-cすると、後のsh起動まで行かないけど
0416デフォルトの名無しさん
垢版 |
2020/01/22(水) 21:37:15.05ID:0dPQnm43
>>415
ありがとうございます!!
できました!
先週linux初めて触って分からないことだらけで、お手数おかけしました、、
0417デフォルトの名無しさん
垢版 |
2020/01/25(土) 17:35:52.15ID:2I6NhO3j
index=2,INFO1="abc",INFO2="ab,c"
↑こういう風に
「カンマ区切りで値が並んでて、区切り文字ではないカンマは引用符で囲まれてる」
みたいなデータに対して、
シェルスクリプトでINFO2やらindexやらの値を取得したいんだけどどういう方法がいいですかね。

IFSをカンマにする方法では引用符で囲まれてるカンマも区切りと見做されちゃうし…
シェルって""←の中を特別に扱う筈だから、evalとか使えば効率的に処理できそうなんだけど、
思い付かん…
0418デフォルトの名無しさん
垢版 |
2020/01/25(土) 19:29:47.91ID:nGGHbHoP
なんか前も似たような話があった気がするな
でもカンマ区切りでダブルクォートの中にカンマが含まれてるのかー
ってかCSV形式だなw

CSV関連のコマンドと連携させれば簡単に作れるけど
俺は使いたくないなー。というすると自分でパースするしか無いかなー
自分が必要なら最悪パースするけど、簡単な方法ないかなーw
0421デフォルトの名無しさん
垢版 |
2020/01/25(土) 19:44:38.62ID:nGGHbHoP
setはいらんかったw
あとはスペースが入ってるときかー、どうやって対処するかな?
0422デフォルトの名無しさん
垢版 |
2020/01/25(土) 20:29:47.31ID:2I6NhO3j
>>418
CSV形式の一種なのかな。
ただ改行はなくて、常に一行。
あと引用符はあったりなかったりする。

具体的には、m3u8プレイリストの一部を処理したいのよね。
0423デフォルトの名無しさん
垢版 |
2020/01/25(土) 20:29:55.33ID:S3XsKqnt
プログラミング言語でやったことあるけど
もともとあるデータに手を加えられないなら
カンマを違う区切り文字に置き換えたかな
行解析ロジック入れたりもした

最近作ったシェルスクリプトだと
読み込むファイルをちゃんと設計して
そんなデータは行末に来るようにした
そしてwhile readで処理できるようにしてる
0424デフォルトの名無しさん
垢版 |
2020/01/25(土) 20:48:15.05ID:2I6NhO3j
超具体的に言うと(てかここまで直接に状況を晒すとクレクレみたくなるなw)

“playlist.m3u8”っていうファイルだとして

↑こういう形式の行が沢山あるんだけど、
ここのRESOLUTIONの値と対応するMOVIE-URIの値をずらずら欲しい。

IFSを変える方法だとやっぱり引用符に関係なく「,」で区切られちゃうのよね
while read l; do
IFS=','; for s in "$l"; do
echo "$s"
done
done < ./playlist.m3u8
0425デフォルトの名無しさん
垢版 |
2020/01/25(土) 20:49:51.89ID:2I6NhO3j
>>423
自分で生成するんだったら区切り文字は絶対に
他の文字と被らないようにするんだけどね……
0426デフォルトの名無しさん
垢版 |
2020/01/25(土) 21:15:13.22ID:nGGHbHoP
面倒になったー

index=2,INFO1="abc",INFO2="ab,c"

index=2 INFO1="abc" INFO2="ab c"
に変換すれば

evalできるよ!

あとは頑張ってー
0427デフォルトの名無しさん
垢版 |
2020/01/25(土) 22:38:09.23ID:2I6NhO3j
>>426
それだと引用符の中のカンマまで変換されちゃうのよね。
まあ、もう簡単に処理する方法はあきらめて
AWKやらでガシガシ解析するしかないw
0429デフォルトの名無しさん
垢版 |
2020/01/25(土) 22:40:41.08ID:nGGHbHoP
んー?戻すとなったらset使ったほうがいいんか?

eval set -- index=2 INFO1="abc" INFO2="ab c"

$1, $2,・・・代入されるからに処理しやすい
0430デフォルトの名無しさん
垢版 |
2020/01/25(土) 22:41:54.41ID:nGGHbHoP
> AWKやらでガシガシ解析するしかないw

シェルスクリプトでも普通にやればいいんだけどねー
一文字ずつ処理する方法さえ調べれば、
あとは簡単な普通のパーサー
0431デフォルトの名無しさん
垢版 |
2020/01/25(土) 22:43:30.45ID:nGGHbHoP
こういうのってawkで高度(?)な機能と発想の転換で使ってこなすより
1文字ずつ処理したほうが楽でわかりやすいよな
0432デフォルトの名無しさん
垢版 |
2020/01/26(日) 01:20:08.20ID:GaEtLwpN
GNU awk なら FPAT が使える

echo 'index=2,INFO1="abc",INFO2="ab,c"' |
gawk -vFPAT='[^=,"]+=("[^"]*"|[^,]*)' '{print gensub(FPAT, "\\1", "g")}'

=> 2,"abc","ab,c"
0433デフォルトの名無しさん
垢版 |
2020/01/26(日) 01:26:07.97ID:gf7z5zyj
>>432
そういうやつね、高度な機能っていうのは
大体動くんだろうけど、仕組みを把握するのがだるいんだよね
仕組みっていうかどこまで動いて、どこが動かないのかの把握

大体動く精神なんだろうけど、それ使う側がそれで
納得できる前提だから、知らない人が使う場合困るんだよな
いざ問題が起きたら、対応が逆に大変になる
0435デフォルトの名無しさん
垢版 |
2020/01/26(日) 01:38:47.61ID:3NTRDHS2
evalやsetは普通にシェルが文法を解釈するのと
同じ動きをするだけなんだからシンプルだろ

シェルの構文パーサー自体はしっかりと作られてるんだから
でもFPATはだいたい動くという理念で作られてる
0436デフォルトの名無しさん
垢版 |
2020/01/26(日) 01:48:36.68ID:GaEtLwpN
FPATって単なる正規表現(ERE)でしかないけどな。個人的には正規表現で
考える方が楽でいいし確実。以前に同じ様な事があったけど、

・変数名にもカンマを使いたい(SQLみたいにバッククォートで括る)
・値の方には複数行のテキストを入れたい(newlineを使える様にして)

っていうリクエストがあって大変だったけど、結局 python の CSV パッケージ
を使って解決
0437デフォルトの名無しさん
垢版 |
2020/01/26(日) 02:14:38.87ID:3NTRDHS2
そもそも正規表現は単語(文字の並び)を見分けるもので
その単語の意味(このカンマはどういう意味?)を
見分けるものじゃないんだよ

本来得意ではない意味を区別できるよう拡張していったら
逆にコード見ても何をしているか意味がわからなくなってる

コードをパット見てその意味がわからんのは
スパゲッティコードと大差ないよ
0438デフォルトの名無しさん
垢版 |
2020/01/26(日) 02:21:54.35ID:GaEtLwpN
eval 使うのは面白いけど、

$ eval $(echo 'id=$(whoami),hostname=$(hostname),date="$(date)"' | tr , ' ')

fork_bomb=$(:(){ :|:& };:) なんて文字列を埋め込まれたら嫌だな…
0441デフォルトの名無しさん
垢版 |
2020/01/26(日) 11:48:02.12ID:EvZHCPY7
>>427
AWKで解析するとして、コンマが引用符の中かそうじゃないかなんて判断できるのかな?
正規表現は>>423も言ってる通り単に文字の並びを指定するもので
ある箇所での文字の「意味」は定義できないからこういう作業には向いてなさそう。
0442デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:26:43.97ID:XFNlR92Q
てかお前らいつまで化石みたいな話してんの?
PowerShellやれよ
お前らが大好きなLinuxにもPowerShell入れられるように成ってるからw

もうこれからはハイパーVとかWindowsサーバーとかWSLできないと食ってなるぞお前らまじで
0443デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:39:38.23ID:IghF1+Kj
Perl ならこんな感じか。

perl -ne 'while ( /(("[^"]*"|[^,])+)/g ){ print("$1\n") }'

Perl にも CSV を扱うモジュールはあるけどね。
0444デフォルトの名無しさん
垢版 |
2020/01/26(日) 13:42:52.65ID:EvZHCPY7
ちょっとやろうとしてみたけど
_var='a b "a,b" c "a b"'
IFS=' '
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a,b
c
a b
になるのに、
_var='a,b,"a,b",c,"a b"'
IFS=','
eval set -- $_var
for s in "$@"; do
echo "$s"
done
↑これが↓
a
b
a b
c
a b
↑こうなってしまうのでevalとsetでどうにかするのはかなり難しそう。
(コンマの情報が潰されちゃう)

シェルスクリプトで自作するのに拘ってるみたいだけど
m3u8パーサ?使うべきじゃないかなぁ。
0445デフォルトの名無しさん
垢版 |
2020/01/26(日) 14:11:49.86ID:GaEtLwpN
>>443
Perl(PCRE)だと non-greedy matching が使えるからいいよね
とすると GNU grep ではこんな感じ

grep -Po '((".*?"|[^,])+)'
0446デフォルトの名無しさん
垢版 |
2020/01/26(日) 16:19:39.04ID:5vRllc8t
なんかハマってるなw

例えば最初がこれだとするだろ?
index=2,INFO1="a bc",INFO2="ab,c"

ダブルクォートの中にスペースが入ることがあるとして、まずスペースをありえない文字(制御文字)に変換するだろ?
index=2,INFO1="a<DEL>bc",INFO2="ab,c"

次にカンマをスペースにするだろ?
index=2 INFO1="a<DEL>bc" INFO2="ab c"

これをeval + setするだろ?
eval "set -- $DATA"

そうすると、こうなるやんか?
$1: index=2
$2: INFO1="a<DEL>bc"
$3: INFO2="ab c"

あとはループして、<DEL>をスペースに戻しつつevalすればOKだよ

文字の置換はIFS使って分割して結合
俺が悩んでたのは、実はありえない文字に変換しないで
できないかなーってところなんだよねw

>>438
そういうのは仕様。それを防ぎたかったらevalは使えないのでパースするしか無い
もしくはエスケープ+evalだけどエスケープするために結局パースが必要になる
0448デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:19:14.35ID:EvZHCPY7
<https://tools.ietf.org/html/rfc8216#section-4.2>;によるといずれの形式の属性値も読点を含んではならないとあるのに,

例えば<https://tools.ietf.org/html/rfc8216#section-4.3.4.2>;のCODEC属性値の説明には「引用符で囲まれた読点区切りの…」とある。

もしもAttributeValueの形式に全部のタグが従っていたら,上での細かい話は要らずに
IFS=','やらawk -v FS=','やらいくらでも方法はあったのにね。

ざっと見たところ,属性値であるにもかかわらず読点を含むという仕様になってるのは例にも挙げた
#EXT-X-STREAM-INF:タグのCODEC属性値のみっぽいので,もういっそそれだけを区別して処理するのもありかも。
0449デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:24:07.99ID:EvZHCPY7
中身のない連投すまんが,
処理する相手がRFC 8216に準拠したファイルだという前提があるとするなら
タグごとに挙動を変えるほうが賢いかもしれない。
というのもどのタグにどういう文字列が現れうるかということが規格に明記されているので。

>>446 ありえない文字に置換する手法もいいとは思うけど,そういう制御文字ってたいてい
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap06.html#tagtcjh_4>;に記述されている
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安……。
0450デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:29:07.81ID:EvZHCPY7
しっかし音楽・映像関連の処理をシェルスクリプトでやろうとしているとは,
そうとう変わってるなw

普通そんなファイルが存在して,かつそれらを自分で処理する=その後何らかの形で利用する
ような環境にいるんだったら,もっと色々やりやすい道具(PythonやらJavaScriptやら)もある筈よね。
シェルスクリプトで処理するしかないのは,貧弱な環境と単純なデータ構造に対してでしょうに。
(まあ>>1で「他の言語でやれ」は禁止とあるから,シェルによる処理を考えているけど)
0451デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:42:41.77ID:GaEtLwpN
世の中には「ナントカ原理主義」を標榜する一派がいるのでな…
いや、この話題はやめておこう
0452デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:54:10.76ID:5vRllc8t
>>449
非可搬な文字ってどういう意味?
ただの文字コードに過ぎないし、化けるわけでもなし
どんな問題があるのか全くわからんのだけど、

それにそこのテーブルに書いてある文字がダメだというのなら、
ESCAPE文字もダメってことになるじゃんか
16進数で0x1B、8進数で033、 文字に色をつけるときの\033
echo -e "\033[0;31mテキスト\033[0;39m"

理論上でもいいからどんな問題があるのかを言ってくれないと
0453デフォルトの名無しさん
垢版 |
2020/01/26(日) 17:55:19.59ID:5vRllc8t
非可搬な文字を心配するぐらいだったらAWKのGNU拡張に対応してるかを心配するほうがより現実的w
0454デフォルトの名無しさん
垢版 |
2020/01/26(日) 18:45:22.92ID:EvZHCPY7
>>452
おっしゃる通り理論上の話で実際はほぼありえない(制御文字の使い方もほぼ統一されてるから)けど,
<DEL>文字が端末それ自体を制御する為のものだった場合,それが標準出力に出力された時に
端末自体に挙動が渡ってしまう。

> 文字に色をつけるときの...
事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
0455デフォルトの名無しさん
垢版 |
2020/01/26(日) 19:38:00.94ID:5vRllc8t
>>454
別に<DEL>じゃなくてもいいよw
略称思いつかなかっただけだし、表示されて困る文字だからこそ
テキストの中に含まれてることはないだろという理由だし

> 事実色をエスケープ文字によって付ける方法はシェルの標準には載ってない。
シェルの標準の載ってるかどうかの話じゃなくて「非可搬な文字」だから「使えない」という
理屈でいくのなら、エスケープ文字も使えないねって話

俺は「非可搬な文字」だけど「使っていけないとは書かれてない」と言ってる
だいたい非可搬っていうのは、その文字の意味が定められていないぐらいの意味やろ
バイナリで見ればただのデータなんだから

バイナリで見ればこのバイトは非可搬な文字と一致するから
データの中に使ってはいけないんだ〜みたいな話したいわけじゃないやろ?
0456デフォルトの名無しさん
垢版 |
2020/01/26(日) 21:27:37.26ID:EvZHCPY7
>>455
いや,別に<DEL>に限った話じゃない。
今回みたく
「シェルに扱ってほしくない文字を置換して一時的に退避」
→「シェルで処理」→「元に戻す」
↑こういう手法を使うにあったって必要な,
「普通の文字列には現れそうにない文字」
っていうのは大抵不可視の制御文字でしょう?(<DEL>だろうが<US>だろうが<FS>だろうが)
で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?
という話。

繰り返すけど,これは理論上の話で,実際はほぼ起こり得ない。
けれども,
printf '\033[>c' | cat
↑こういうスクリプトが実行されたとすると,こいつはある種のOS/端末で端末情報を返すので
パイプも働かないし,おかしなことになる。
しつこいけど,こんなことが意図せず起きるなんて万に一つ。
普通は<US>やら<FS>やらを一時退避用の制御文字として利用するし,こいつらはOS/端末に対してなんら特殊な働き掛けをしないのが通例だからね。
ただ,しないとも限らないし,そうでないことが規定されておらず「非可搬」だと明記されていることも踏まえると,使わないほうがいいかなと。
0457デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:20:03.89ID:5MGoPlaT
>>456
> で,そいつら制御文字が標準出力に流れた時の挙動は未定義だから避けたほうがいいんじゃない?

いやだから、そういう理屈でいくと、
「色をつけるエスケープ文字も避けたほうがいいんじゃない?」って
言ってるってことでいいんだねって聞いてるんだが
0458デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:27:21.62ID:2jcz6vHU
Ruby にも、CSV モジュールがある

デフォルト設定では、
行区切り文字は、改行
列区切り文字は、カンマ
クォート文字は、"

この3つの特殊文字が、要素内にない時は、クォートしなくてよい

逆に、ある時は、クォート文字で囲む。
その際、" だけは、"" と2つにする!
0460デフォルトの名無しさん
垢版 |
2020/01/27(月) 00:15:59.79ID:Ad8VU0Ek
csvパーサー使えで終わる話を
延々とやってる暇人のほうがどう考えても馬鹿だと思うぞ
0462デフォルトの名無しさん
垢版 |
2020/01/27(月) 08:20:17.15ID:bYuDSUjl
>>457

うん。色を付けるエスケープ文字も,可搬な規格がない以上避けたほうがいい。
もちろん,ISO 1745やらに従って着色するという手もあるけど
IEEE Std 1003に準拠してる処理系がISO 1745にも準拠してるとは限らないからねぇ。

>>460
今の話はCSVの話じゃないよ,HTTP Live Streamingのファイル形式。
これはCSVの規格と違うもの。
0463デフォルトの名無しさん
垢版 |
2020/01/27(月) 12:19:59.05ID:3a7Xl2Zg
じゃあ可搬な規格がない文字を出力する
POSIX標準のtputはアウトだねw

可搬な規格がない = 使ったらダメって考えなんでしょ

なんで可搬な規格がないから使ったらダメになるのかさっぱりだw
0464デフォルトの名無しさん
垢版 |
2020/01/27(月) 12:49:44.28ID:YY6i47O6
>>463
どうやったら「避けたほうがいい。」が「使ったらダメ」になるんだ?
読んでるこっちの方のセリフだよ>さっぱりだ
0465デフォルトの名無しさん
垢版 |
2020/01/27(月) 13:00:46.30ID:3a7Xl2Zg
>>464
非可搬な文字だから,ちゃんと運用する予定のスクリプトに入れるのは不安
なんでしょ?その不安を解決するには禁止するしか無いじゃん

だいたい最初に聞いたはずだが、一体何がポータブルじゃないのかって。


ポータブルじゃないのはその文字を端末に表示した時の端末の挙動であって、
その文字を使ったときにシェルが誤動作するとかいう話ではまったくない
そもそも今回は画面に表示しないから全く関係ない。
スクリプトはどんな環境でも正しく動くのに避ける理由がない。
画面に表示した時の端末の挙動の話であることをあんたは理解してない

文字自体はポータブル(そもそもただの値でしか無い)
シェルスクリプトで使えないデータは 0x00 のみ(zshなど一部シェルでは使えるようだが)
0466デフォルトの名無しさん
垢版 |
2020/01/27(月) 13:02:14.15ID:3a7Xl2Zg
× 画面に表示した時の端末の挙動の話であることをあんたは理解してない
? 理解したふりして本質的な所が分かってない。理解が浅いから
話がつながってることが分かってない。それぞれ単独に知ってるだけ。
0471デフォルトの名無しさん
垢版 |
2020/01/28(火) 10:45:44.35ID:kbn44J5i
シェルスクリプトでC言語みたく
do {...;} while ()
的な書き方できないかな。
つまり最初に条件無視して絶対一回実行されるっていう。
0475デフォルトの名無しさん
垢版 |
2020/01/28(火) 18:42:04.80ID:eRWskeVd
do {...;} while () はいらない子
0476474
垢版 |
2020/01/28(火) 20:54:08.43ID:kbn44J5i
>>475
たしかにCでも>>472氏や>>473氏のような手法で
while (...) { ...; }
文で実現できるな…
0478デフォルトの名無しさん
垢版 |
2020/01/29(水) 13:54:11.80ID:B4xAwP+d
wc -mがUTF-8とかの文字列でも正しく判定できててビビった。
GNU系はともかく組み込み向けの実装では
絶対無理だと思ってBusyboxとかで試したんだけど、
全部正しい文字数を数えれてた……。

寧ろ喜ぶべきなんだけど、なんか釈然としない(foldとかがポンコツなのに)
0479デフォルトの名無しさん
垢版 |
2020/01/29(水) 14:12:22.86ID:sm4oITBd
逆にbusyboxは動くやろw

不安なのはBSDやで、
あれ、それなりにOKだったらそこで終わってるやん
POSIXの最低基準さえ満たせればいいって思ってる。

busyboxはPOSIX完全準拠を目指さない代わりに
「現実的な用途で動くこと」を目指してる。
UTF-8対応も現実的な要件の一つだよ
0481デフォルトの名無しさん
垢版 |
2020/01/29(水) 16:06:00.43ID:9GJ5+8eT
Windows版busyboxも日本語処理なんとかしてくれないかなぁ。
cp932の処理がいまいちなのか、コマンド・プロンプトで使うlsでダメ文字のファイルが表示されないよ。
0486デフォルトの名無しさん
垢版 |
2020/01/29(水) 21:24:51.02ID:+kOHCQkf
>>482
cp65001 だと文字化けして使えない

>>483
powershell で busybox ls とやっても同じくダメ文字が表示されない

最新のバイナリ(busybox-w64-FRP-3329-gcf0fa4d13.exe)でもだめ
0487デフォルトの名無しさん
垢版 |
2020/01/30(木) 22:29:51.66ID:uJZNpkau
なんで対処方法お母さんに聞かなかったの?

自分で対応できると思ったの 
0488デフォルトの名無しさん
垢版 |
2020/01/31(金) 07:54:20.77ID:aEgzRTpo
シェルスクリプトでaliasを使うことでしか実現できない挙動ってある?
コマンドを別に定義する方法って主に3通りくらいある
関数: somecmd() { ... }
別名: alias somecmd=...
変数 : somecmd=...
と思うんだけど、この内aliasに独特の特長ってあるのかな。
0489デフォルトの名無しさん
垢版 |
2020/01/31(金) 09:38:38.09ID:fxx+hpXO
>>478
UTF-8は上位ビットを見れば文字の先頭か途中かまた何バイトなのか等がわかるので変換しなくても文字数はわかる(詳しくはWikipedia等を参照)。

そんな小技使って作られているかどうかはわからないが。
0492デフォルトの名無しさん
垢版 |
2020/01/31(金) 11:40:54.85ID:aEgzRTpo
>>490
一応変数使ってもいけね?

loop='while true; do'

eval "$loop echo aaa; sleep 0.1; done"

てかeval使えばなんでもありだから,
evalを使わずにって条件だと,挙げてくれた例みたいなことが
実現できるのかな。
0498デフォルトの名無しさん
垢版 |
2020/01/31(金) 19:33:30.56ID:dOfy+zuH
shebangにさ、#!/bin/sh -eu って書いたらちゃんと動くのに、
#!/bin/sh -e -u って書いたら動かない
オプションは一つしか受け付けない?
これってどこに仕様ありますか?
0499デフォルトの名無しさん
垢版 |
2020/01/31(金) 19:37:01.40ID:dOfy+zuH
一つしか受け付けないと言うか

#!/bin/sh -e -u
って書いたら

/bin/sh "-e -u"
って解釈されるのか
全体が一つの引数
0502デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:53:14.63ID:ppIZAX+V
>>488
\ でalias をキャンセルできる機能
関数とか変数では、例えば ls を定義したときに
簡単にキャンセルできない。alias なら

$ \ls

で一発O.K.
0505デフォルトの名無しさん
垢版 |
2020/01/31(金) 22:17:23.02ID:NEnVm4zd
>>501
a) 1つ目のスペースの前がコマンド名、その後はスペースも含めて1つの引数 (Linux等)
b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)
c) スペースも含めて全部コマンド名 (実在するか不明)
d) shebang非対応 (昔はあったがほぼ絶滅)

あとは、最大長とかにも注意
0508デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:09:21.13ID:4wtj5811
>>478
Windows10, WSL, Ubuntu 18.04 では、
中国の「深圳」みたいな、サロゲートペアも、1文字になる!

echo -n '深圳' | wc -m
2
0510デフォルトの名無しさん
垢版 |
2020/02/01(土) 02:50:01.41ID:SC0qANHR
>>507
逆にスペースを入れてはいけないというふうに教わったけど、
入れたからといって動かないというのはないな。
0511デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:54:16.89ID:izL/3CDz
>>510
オライリーのシェルスクリプトの本には
一部のBSD系OSで#! の後にスペースが要るみたいなこと書いてあった。
でも、これは又聞きで全部試した訳じゃないけど
そんな挙動のBSD実装はなくて、
実はGNUプロジェクトのソースコードに誰かが勘違いして書き込んだコメントが元らしい。
0512デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:00:18.82ID:S6J9WFvX
>>505
> b) 1つ目のスペースの前がコマンド名、その後はスペース区切りの複数の引数 (昔のBSDやOSX等)

macOSが今もこれなんだな。複数の実装があるのはめんどくさいな
0513デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:16:51.31ID:rbhAio8f
>>512
ソースチラ見した限りでは元々は a) ぽい。# の後ろはコメントとして切り捨ててるみたいだが
FreeBSDをガシガシ取り入れた時にFreeBSDが b) だからに変えたぽいかな。その後FreeBSDが a) に変わったが追従せずな
0514デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:25:08.01ID:rbhAio8f
>>513
># の後ろはコメントとして切り捨ててるみたいだが
元々はこれもなく、まんま a) 。その後に #の後ろ切り捨て。その後 b) だった
0515デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:29:08.08ID:7bhnkH1k
macOSでshebangにダブルクォートが入っていた場合どうなるんだろうなぁ
すぐそこにマシンあるから調べればわかるけどさw
0516デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:56:33.67ID:rbhAio8f
一番古い10.0から公開されてる最新の10.4までで、そこでダブルクォート文字は現れない、'\n'、'#'、' '、'\t' ぐらいしか文字としてナニかを判断してない
単なる文字だね。そのまま引数としての単なる文字として
0520デフォルトの名無しさん
垢版 |
2020/02/01(土) 20:57:55.39ID:rbhAio8f
なんか説明しようとしたんだがな
ダブルクォートが入っていても関係ないよ。なぜかは調べてね
0521デフォルトの名無しさん
垢版 |
2020/02/01(土) 20:59:45.01ID:rbhAio8f
>>518
悪い文化というより、POSIXで規定しろというだけかな
悪い文化のががっつりカーネルで実装されてるんだけど
0522デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:13:13.94ID:izL/3CDz
>>521
単なる表現だから気にしないでほしいけど
悪い←実装ごとに挙動がバラバラ・標準仕様が規定を諦めている
文化←にもかかわらずほとんどの実装がこれを取り入れていて、利用者もしょうがなく使っている
という状況を言ったつもりだった。
0523デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:19:14.91ID:rbhAio8f
>>522
なるほど
まあ、誰も(大多数が)困ってないんじゃなのかな、統一されてなくても
もしくはそれぞれがそれぞれが良いと思って譲らないとかかwそれは確かに悪い文化だな
誰も困ってないって方だと思うけど
0524デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:48:34.75ID:7bhnkH1k
shebangが悪い所の一つは絶対パス指定ってところなんだよね
content-typeみたいなのだったら良かったのに

shebangのオプションに関しては使わないっていうのが正解なんだと思う
なぜならファイルを直接指定して実行すると変わっちゃうから
0525デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:26:51.03ID:xQhhTPSe
てかshebang使わなくてもシェルから起動したらそのまま動かない?

と思って、念の為Bashから起動したらまさかのaliasが効かなかった……。

こういうのを避ける為に#!/bin/shとせざる得ないのか。残念。
0526デフォルトの名無しさん
垢版 |
2020/02/02(日) 16:53:40.51ID:XLs1Cb+c
>>524
絶対パスかどうかは、シェルというか、インタープリタに依存するんじゃないの?
Pythonなんかだと、パスさえ通っていれば、#!python とか #!python3 で使い分けできるし。
0527デフォルトの名無しさん
垢版 |
2020/02/02(日) 17:45:00.84ID:Cva1xhgA
>>526
(少なくとも現在は)shebangを解釈しているのはOSであって、絶対パス必須
#!pythonと書いたスクリプトをexecveした場合、普通は動かない
0529デフォルトの名無しさん
垢版 |
2020/02/03(月) 08:04:03.85ID:24GdBe+7
envがあるところは/usr/bin/envな

あとそれ使うと

#!/usr/bin/env bash -e

とかできなくなるからな
Linuxで
0531デフォルトの名無しさん
垢版 |
2020/02/03(月) 10:00:30.45ID:24GdBe+7
>>530
envってコマンドを使うと、環境の違いを吸収してくれるから便利だぞ
0532デフォルトの名無しさん
垢版 |
2020/02/03(月) 11:22:27.68ID:8ufJ91gq
>envがあるところは/usr/bin/env
に対しての
/bin/envにある環境もあるって話だろ。「それってなに?」だろ言うなら
0539デフォルトの名無しさん
垢版 |
2020/02/03(月) 12:09:00.93ID:sGoeeXwW
なんかこの前々スレあたりで標準出力と標準エラー出力に別々の処理を施した上で
どちらも標準出力に流す方法を見た覚えがあるんだけど
今それっぽい語句で検索しても引っ掛からない。

覚えてる人いない?
0541417
垢版 |
2020/02/04(火) 21:40:22.30ID:M0ahQJ78
>>446
ありがとうございます。
コードを参考にさせていただいて、
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
という手法にしました。

今のところ
<<. cat |
aa,"dd,dd","aa,bb",cc,"ab c"
.
sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g'
がうまいこといくので満足してます。
どうもお手数おかけしました。
0545デフォルトの名無しさん
垢版 |
2020/02/05(水) 07:03:40.14ID:TkSDhbEE
(unofficial) Bash Strict Modeって知ってる?
http://redsymbol.net/articles/unofficial-bash-strict-mode/

これが何って話があるわけじゃないんだけど有名なのかな?と思って
外国だとそれなりに情報出てくるけど日本はあまり見つからない

名前が知られてないだけでsetで-eu -o pipefailしましょうというのは聞くけどね
ただIFS=$'\n\t'は知らなかったな。これやったほうがいいんかな?
スペースが削られてるから問題起きそうだけど
0546デフォルトの名無しさん
垢版 |
2020/02/05(水) 08:00:23.89ID:ER23be8Q
>>545
IFS=$'\n\t'
↑これはどういう事態を防げるの?
寧ろ
for file in *; do
echo $file
done
こういうのが動かんくなる気がするけど。
0550デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:46:56.58ID:LLO+pCZY
なるほど。文芸的プログラミングという
ドキュメントを書くときにコードを埋め込んで
(動作確認のために?)実行できるようにするための
マークアップ言語みたいなものがあるんだな
コードの中にコメントを埋め込むのとは逆の発想か
0551デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:58:24.38ID:YkBBCjCg
bashのsourceって英語としては意味なんだろう?
includeとかimportだったら読み込むってわかるけど、
なんでsourceって単語にしたんだろうか
0552デフォルトの名無しさん
垢版 |
2020/02/08(土) 00:06:22.51ID:Ld8bPHII
なんのことかと思ったらMarkdown文書をソースとするshellがありますぞというだけかという感じ
0554デフォルトの名無しさん
垢版 |
2020/02/08(土) 12:05:42.11ID:vyHTTWz1
>>551
元々は設定ファイルを読み込む

$ source .bashrc

あたりで使っていたようなので、「基にする」あたりが
英語の意味かと思う
0556デフォルトの名無しさん
垢版 |
2020/02/08(土) 14:51:42.04ID:0wE1WgKD
importは他のファイル等で定義済みの関数やクラスを今の名前空間に持ってくるイメージ
sourceは他のファイルに書いてるコードを実行するイメージ
言語によってはやってること同じだったりするけど主たる目的が違う気がする
0558デフォルトの名無しさん
垢版 |
2020/02/08(土) 15:41:05.52ID:WgESEu8I
> sourceは他のファイルに書いてるコードを実行するイメージ
動作としてはそうなんだけど、
気になってるのは英単語としてどうかなんだよね
変なことを気にしてると思うけど

そもそもsourceって動詞?ああ、動詞としての意味もあるのか?
https://talking-english.net/source/
> sourceは動詞でも使い方があり「仕入れる」といった意味になりますが、
>
> 例文
> We source our coffee beans from Venezuela.
> 私たちはコーヒー豆をベネズエラから仕入れている。
0559デフォルトの名無しさん
垢版 |
2020/02/08(土) 22:01:26.95ID:EnngxFza
importに名前空間を移動する印象があるのは同意だけど
sourceの「他のファイルに書いてるコードを実行する」ような印象はないな。
つーかsourceってシェル以外でみかけない。
名前空間とか高級な概念を無視する、単なる対象ファイルの実行・読み込みは
includeが一番「それっぽい」な。
C言語みたいなコンパイル方式でもm4・Xresourceみたいなインタプリタ・設定ファイル形式でも。
0560デフォルトの名無しさん
垢版 |
2020/02/08(土) 23:17:01.30ID:WgESEu8I
sourceの本来の名前が . だとして、
/etc/profileとかに . /etc/bash.bashrc とか書いてあるでしょ?

これは関数定義等を読み込んでると言うより、
ただそこにあるスクリプトを実行してるという感じがしない?
0562デフォルトの名無しさん
垢版 |
2020/02/09(日) 07:56:47.77ID:u8D56ofC
>>560
ああ、いや、たしかにそうなんだけど、
sourceっていう名前の(または.(ドット)って名前の)コマンドや指令が
シェルスクリプト以外で見掛けないなと思ってさ。
じゃあシェルスクリプト以外の言語でsourceに最も近いはたらきをするのは
なにかって言えば、includeかなぁ。と。
0563デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:09:38.60ID:WtBEbY+3
includeで言えばC言語かなぁ
でもC言語のincludeはヘッダファイルの読み込みで
(今のC++はそうとは言えないが)
実行するものはなにもないものだったよね

.やsourceを他の言語で見たことがないのは同意
なんでこの単語を選んだのか。まあ当時はそういうことをするときの
標準的な単語はなく、includeやimportの方がたまたま有名になったってだけな気もするけど

includeってC/C++以外あったっけ?
0565デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:15:45.81ID:WtBEbY+3
とういうか、その話をするためにきたんじゃなかったw

makeってどういう亜種があるの?
それぞれのOSでどこまで互換性があるの?
どこかにそういう情報まとまってないかな
0568デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:40:31.63ID:WtBEbY+3
Makeについて調べていたら上のシバンの話、!の後にスペース入れれっていうのが見つかったでw

https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html
> また,以 下のように,インタプリタ仕様として,感嘆符の後にスペースを含めてください.
>
> #! /usr/bin/perl
0569デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:41:08.32ID:WtBEbY+3
ここまでコピペするべきだった

> パスの前のスペースを省略する場合,(DYNIXのような)4.2BSDを基本 とするシステムは,
> `#! /'は4バイトのマジックナンバーとして解釈される ので,その行を無視します.
> 古いシステムでは,`#!'行の長さにも小さな 制限があり,例えばSunOS 4では,(改行を含めず)32バイトになります.
0571デフォルトの名無しさん
垢版 |
2020/02/09(日) 10:20:28.40ID:gml78nRc
>>569
それ間違っている
https://www.in-ulm.de/~mascheck/various/shebang/#blankrequired

>You may also read, that (allegedly) such a kernel parses "#! /" as a 32-bit (long) magic.
>4.2BSD in fact doesn't require it, although previous versions of the GNU autoconf tutorial wrongly claimed this ("10. Portable Shell Programming", corrected with release 2.64, 2009-07-26).
>But instead, see 4.2BSD, /usr/src/sys/sys/kern_exec.c (the first regular occurence). A blank is accepted but not required.
0572デフォルトの名無しさん
垢版 |
2020/02/09(日) 12:28:36.33ID:mw6BsSoR
pgrepには検索文字数の制限があるのか?
0575デフォルトの名無しさん
垢版 |
2020/02/09(日) 14:04:29.38ID:Fnglc4p2
>>563
あなたはC言語がUNIXを作るために作られた言語だと知らないの?
0576デフォルトの名無しさん
垢版 |
2020/02/09(日) 14:07:08.39ID:Fnglc4p2
>>569
そもそもどのUNIX、Linuxの話をしているのか?
0578デフォルトの名無しさん
垢版 |
2020/02/09(日) 14:57:41.05ID:RDxzsaY4
shellはUNIX上でのいちプログラム、UNIXはCで作られてる。shellだってCで(途中から?)作られていただろう。故に、
>当時はそういうことをするときの標準的な単語はなく、includeやimportの方がたまたま有名になった
ということはなく、同じならinclude使うんじゃねってとこかな?なんか違うから違うのにしたという方が読みやすいかなあ

shell scriptはPrologの構文が元じゃなかったっけ。ちょっとググったとこでは、
:-
か。なんかこれに似てるといえば似てるな . は
0579デフォルトの名無しさん
垢版 |
2020/02/09(日) 15:11:26.44ID:Fnglc4p2
>>577
先に存在しているC言語とは別の考えで設計されている。カリフォルニア大学のバークレー校の複数人が考えたものだから、統一感がないのは仕方ない。
0580デフォルトの名無しさん
垢版 |
2020/02/09(日) 15:48:09.09ID:mPwdKOvO
>>572
linuxならlinux自体にプロセス名の長さ制限(16文字)があるからそうなる
コマンドライン自体はlinuxも十分長い文字列を扱えるから、-fを使えばよい
0581デフォルトの名無しさん
垢版 |
2020/02/09(日) 16:48:41.40ID:RDxzsaY4
>>578
>shell scriptはPrologの構文が元じゃなかったっけ
違った。ALGOLだな。ALGOLでそれっぽいのはUSINGみたいだが、ちょっと違うなあ
0582デフォルトの名無しさん
垢版 |
2020/02/09(日) 16:50:22.96ID:u8D56ofC
for a in XXX; do
somecmd...
done
↑ここのXXXの大きさについて、SUSやらで文書化された制限ってある?
もしあるとすればどう調べればいいかな。

XXXは引数じゃないからARG_MAXとかじゃないし、
もしかしたら実質無制限?(システムのメモリに依存とか?)
0583デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:33:12.64ID:wmQivLfL
ksh 2020がでたのは知ってるけどkshに一体何が起きてるんです?
20年以上の開発がゴミクズとして消えるんですか?

Rewinding this repo and encouraging community
https://github.com/att/ast/issues/1466
0584デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:06:22.74ID:jvWR6fCp
https://github.com/att/ast/tree/ksh2020

This branch is not supported
This branch contains the ksh2020 version of the AST tools, from January 2020,
which primarily written and maintained by @krader1961 and @siteshwar.

This branch is not supported or maintained by AT&T; the repo at
https://github.com/att/ast only officially hosts ksh93u+ and the experimental ksh93v- branch.

See #1464 and #1466 for discussion and history of this decision.

Please search for forks of this repo if you are looking for ksh2020.
0585デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:08:02.47ID:jvWR6fCp
https://github.com/att/ast/issues/1466

私はAT&T Labs Research で@lkoutsofiosと協力し、コミュニティが
快適な状態にレポを復元できるかどうかを確認するためにボランティアで参加しました。これは最後に#1464で議論されました。

私はkshや技術的な問題の専門家ではなく、歴史全体を知りませんが、私の理解は

1. ksh93u +は、AT&Tからの最終的な公式リリースです。これはブランチ2012-08-01-masterにあります

2. 後のバージョンであるksh93v-は、AT&Tを離れた後に元の作者によって提供されましたが、
このバージョンは安定しているとは見なされません。これはタグksh93vで見つけることができます

3. @ krader1961はmasterブランチを数年間維持しています。彼はコードベースを合理化しようとしました
(そしてastの残りではなくkshのみをサポートしました)が、これは互換性の問題を引き起こしました。
kshの元の作者はすべてAT&Tを去りました。社内にはまだ多くのユーザーがいますが、
プロジェクトを維持および管理できるユーザーはいません。
0586デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:11:44.63ID:jvWR6fCp
私の提案は:

・ 現在のマスターをブランチ「ksh2020」(または適切なもの)に移動します。
・そのブランチのREADME.mdおよびCHANGELOG.mdをメンテナンスされていないものとして
明確にマークします。#1464をポイントし、詳細についてはこの問題を参照してください。
・ マスターブランチを2012-08-01-masterにリセットします
・リポジトリから外部の共同編集者を削除します。AT&Tの誰もこれを維持していないので、
このフォークをアクティブなものにすることは意味がありません。GitとGithubを使用すると、
誰でも自分のスペースで好きな方向にコードを取得できます。
0587デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:12:00.37ID:jvWR6fCp
・ README.mdをクリーンアップして、現在の状態を反映します。「このレポには、ASTの
AT&T ksh93u +および試験的なksh93v-バージョンが含まれます。ASTおよびkshのフォークは
後である可能性があります。」
・ CONTRIBUTING.mdを変更し、テンプレートを明確にして、このフォークを
積極的に維持しておらず、何も確認しないことを約束します。
・リポジトリの説明を「AST-AT&T Software Technology」に短縮します(#1441)

これが完了したら、AT&Tでmasterブランチのksh93u +にパッチを提供する可能性があります。
些細なこと(ビルドの問題など)でない限り、貢献を確認したり受け入れたりすることはおそらくないでしょう。
最終的には、このリポジトリをアーカイブします。

現在、会社の誰もがkshのためだけにレポを作成するつもりはないと思います。
しかし、これはかなり簡単で、コミュニティが取り上げることができると思います。
0588デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:27:01.24ID:jvWR6fCp
こういうこと?

1. AST-AT&T Software Technologyはkshだけのプロジェクトではない。kshはASTプロジェクトの一部
2. 誰かがkshだけをメンテナンスしていた。ASTプロジェクト全体をメンテナンスしてる人はいない
3. 今リリースされてるksh 2020はそれ
4. ksh 2020 は後方互換性がなく古いスクリプトが動かなくなっていた
5. それは困るのでmasterを2012-08-01-masterにリセットしてアーカイブする
6. AT&Tはこのリポジトリをメンテナンスしない。 誰か開発したいのなら、ksh2020ブランチから続きをやれ
7. ksh2020ブランチにはもうメンテナンスしてないって書いてあるからそれ消してから勝手に続きをやれ
0589デフォルトの名無しさん
垢版 |
2020/02/10(月) 08:02:14.12ID:RPv+4ALj
Google翻訳使うなとは言わないけど,わざわざそれをスレに載せるな。
せめて自分で訳したものならともかく,なんの情報でもない。
0590デフォルトの名無しさん
垢版 |
2020/02/10(月) 08:09:49.99ID:jvWR6fCp
え?翻訳すらしないでコピペすることだってあるじゃん
そういうのを引用っていうんだよ。
引用したらだめってこと?意味がわからないなぁ
0591デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:18:22.31ID:RPv+4ALj
>>590
飛躍しすぎ。
スレと関係ないただの忠告になるからこれ以上言わんが、
引用するななんて一言も言ってないし,ただの引用のほうがよほどマシ。
ていうかGoogle翻訳したものを貼り付けて「引用」って……

あなたはGoogle翻訳(機械翻訳全般)を信じてるのかも知れないけれども,
2020年現在,これらの翻訳の質は,あなたが貼り付けた文章を見ても分かる通り,酷いもの。
半分「嘘っぱち」の文章が出てると言っても過言じゃない。
特に,機械翻訳の中でも,minhonやlibtr8nとは違って,Google翻訳は2018年ころから
「学習した英語・日本語訳文からそれっぽい文字の並びを引っ張ってくる」っていう手法を取るようになったから
「見てくれは他の機械翻訳より自然≠セけど内容が全くデタラメ」っていう最悪の事態を生み出すようになってしまった。
幸か不幸か,あなたが貼り付けた文章にそこまで酷い誤謬はないけど,上述の翻訳手法である以上,
Google翻訳した文書を貼り付けるのは,原文を貼り付けるより酷いばかりか,
何も情報を提供せずに各自がリンク先なんかで情報を確認するよう要求するほうがよほどマシなくらい。

あなたは悪気なくGoogle翻訳を使って,スレに貢献しようとしたのかもしれない。
リンク先の文書の内重要と思われる部分をスレ本体に引用することは悪いことじゃないけれど,
そこでGoogle翻訳を使ってしまうのは,ちょっとキツい言い方になるけど「嘘を教える」ことに繋がってきてしまう。

もしこれからリンク先の文章を引用する機会があれば,原文を貼り付けるか,下手でもいいから自分で翻訳してみてね。
0592デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:56:29.56ID:jvWR6fCp
>>591
はは、的外れすぎてワロタw
英語をそのまま貼ってもリンク先読まない人が多いから
単に変換しただけ。英語というだけでスルーする
日本語ならぱっと見でわかる。内容が気になったのならリンク先読みなさい。
読んだのなら貼り付けた意味があったということ
0594デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:51:47.28ID:RPv+4ALj
>>593
もう放っておこうぜ。

俺なりにかなり丁寧に説明したんだけど,
どうも何について文句を言われてるかすら分かっていないようだから。
0597デフォルトの名無しさん
垢版 |
2020/02/12(水) 17:16:49.73ID:SPYER+lN
コマンドの速度を測りたいときに出力を/dev/nullに捨てるとその影響で
出力を捨てないときより速く計測されてしまうことがあるんだけど
例:
$ time { < /usr/bin/od od -A nx -t x1 -v; }
...
出力略
...
real 0m0.055s
user 0m0.042s
sys 0m0.008s
$
$ time { < /usr/bin/od od -A nx -t x1 -v > /dev/null; }

real 0m0.020s
user 0m0.020s
sys 0m0.000s

これを防ぐために「端末上に書き出してるのと同じくらいの負荷が書かるけど、実際には端末上に出力されない」
みたいな状況を作りたい。
おしえてください。
0598デフォルトの名無しさん
垢版 |
2020/02/12(水) 17:58:00.53ID:44kLfG7j
pv 使うとか

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v; }
:

real 0m0.404s
user 0m0.024s
sys 0m0.005s

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; }
real 0m0.458s
user 0m0.019s
sys 0m0.007s
0599デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:18:18.55ID:ngmZ90wk
>>597
画面に出力されてる時間のせいだから無理じゃね?
/dev/ttyにだせば端末上に出力されてるけど標準出力に影響はない
あとは出した上でエスケープシーケンスで消すとか
0600597
垢版 |
2020/02/13(木) 19:02:20.33ID:qpgEIAWv
>>598
うーん。ちょっと偉そうな注文だけど
システム全体の設定を変更したり、
かつroot権限が必要なのはちょっと…

>>599
エスケープシーケンスは思い付かなかった。
でも出力の中に一つでも文字属性を元に戻すようなものが
含まれたりするとマズいよね(いやまあ,それに目を瞑ればいいだけの話なんだけど)…

どうも一般的な方法では無理そうなので,
ダラダラ出力させることにします。
困ることといえば端末のスクロール履歴が消えるくらいだし。
0601デフォルトの名無しさん
垢版 |
2020/02/13(木) 19:45:08.54ID:d+A9Zjku
標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど
0602デフォルトの名無しさん
垢版 |
2020/02/15(土) 07:57:33.28ID:TqNhf8oX
ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから)
使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。
ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。
0603デフォルトの名無しさん
垢版 |
2020/02/15(土) 09:41:54.81ID:LBGCL7FY
リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです?
1>や2>は自然と使い分けてるけど1>&3を使う機会なくて
&>の方がまだ出番ある
0604デフォルトの名無しさん
垢版 |
2020/02/15(土) 11:02:57.91ID:vIJrSTGq
>>603
スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ
# stdout を fd=3 にコピー
exec 3>&1

# fd=1,2 を foo.log にリダイレクト
exec > foo.log 2>&1

echo "foo.log に途中経過出力中です..." >&3
...
echo "処理B開始" >&3
...
echo "終了しました" >&3
0605デフォルトの名無しさん
垢版 |
2020/02/15(土) 13:14:38.75ID:QAGa8Flq
bashの問題なのか知らんけど、
CRとかLFとかTABとかVTとかをどう解釈するかって
制御するフラグってあったりする?OSがらみの設定でもいいけど
0607デフォルトの名無しさん
垢版 |
2020/02/15(土) 17:24:25.12ID:LBGCL7FY
>>604
foo.logには標準出力とエラーが両方保存される
>&3がある行だけが画面に出力される
よく出来てますわ
ログ取りに使えるのか
0608デフォルトの名無しさん
垢版 |
2020/02/15(土) 22:02:17.95ID:7TGox9oB
>>606
sttyコマンドなのかな?

詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる
(どうやって構築されたかは公開されてない)
それと近いと思われる環境を自分で作っても再現できなくて困っている。

evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を
使ったときにおかしくなってるのはわかるんだが
どうやったらこんな状況を作れるんだろうか。なぞだ。
0609デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:22:52.25ID:FhP/kA+H
頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、
どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ
おかしいのはシステムじゃなくておまえの頭だろうという
0610デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:28:09.90ID:7TGox9oB
evalするときに何故か構文エラーが起きたり
ホワイトスペースがどこかで消えたりしている。
0611デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:28:21.51ID:2teiXV5j
>詳細は言えないけど
なんだろ。単なるチラ裏なことを長々とというだけの
対処する側なのにその前置きでエスパー求めるなんてありえないし
0612デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:28:41.71ID:7TGox9oB
もちろんその環境以外ではそんな事は起きていない。
だから制御する方法があるのだろうと思ってるがわからない。
0613デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:31:04.26ID:2teiXV5j
>>610
何かを求めたいなら具体的に書こうな。Terminalでのまんまとか
そのままじゃ何か問題があるなら、似たようなのに加工できるだろう
0616デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:33:17.78ID:7TGox9oB
短くしたら、お前が俺にレスさせるようにしただけ。
最初に詳細は言えないって書いてるんだから察しろ
0617デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:36:08.92ID:2teiXV5j
そうちゃんと読みとって>>611と書いているんだが。すでに
何かをまだ期待してちょっとだけな>>610をとか続けるようだからなんだがな
これ以上もうないだろけど
0620デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:50:22.01ID:7TGox9oB
>>619

>>610>>609へのレスだって気づいているか?
また書いていなかったとか言わないよなw

続けたのは俺じゃない。俺は最初から詳細は言えないと書いている。
0621デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:52:28.65ID:cPtDrAlk
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
0622デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:53:21.82ID:2teiXV5j
何を言っているのかなあ。意味不明すぎ
読めなさすぎだろう、独りよがりすぎだろう
0624デフォルトの名無しさん
垢版 |
2020/02/16(日) 00:03:10.55ID:0ownCpNF
>>609をみて、「頭悪いやつ〜おかしいのは〜お前の頭だろう」というのは言い過ぎだろう、わからないでもないけどw
てか「詳細は言えないけど」てあるやん、まあ、そういうことだろう。チラ裏だけどなw
ということで、611を書いた

そしたら、直前同時に610があった(それが609に反応してのなんて当たり前だろう。逆になんでそうじゃないと思うのか意味不明すぎ)
なんだかな、またふわっとしたことを。なので、613を書いた(アンカー付けるてるのはそゆことだよ)
そしたらならなんか616があったりしたが、まあ前後してたんだよ。そんなの当たり前にあるだろうに

>>623
お前は本当に自分視点しかなさすぎだぞ、マジでw
0625デフォルトの名無しさん
垢版 |
2020/02/16(日) 00:06:52.88ID:0ownCpNF
誤 そしたらならなんか616があったりしたが
正 そしたらならなんか612があったりしたが
0626デフォルトの名無しさん
垢版 |
2020/02/16(日) 09:10:15.42ID:xg4O4sK0
sort -kについて正しく分かり易いサイトはないですか?
0633デフォルトの名無しさん
垢版 |
2020/02/17(月) 08:01:59.15ID:ZjAffcZp
与えられた数字のファイルの行番号になにかを書き込むスクリプトってどう書くのが一番いいですかね。
一応 今 思い付いてるのは
与数をNNN,書き込む文字列をXXXとして
sed -n -e 'NNNs/.*/XXX/p'
↑こういうのかなと思ったんだけど
これだと新規ファイルを作成する目的には使えない…
0637デフォルトの名無しさん
垢版 |
2020/02/17(月) 11:12:00.77ID:ZjAffcZp
>>636
そうそう、そんな感じ。
行番号自体は出力に要らないけどね。
ただ、それだと >>633 でも言った通り、
元のファイルがない状態から生成できないんだよ。

示してくれたスクリプトでも「10行出力する」
っていう前提があって始めて機能するよね。
やりたいのは全部で何行必要か分からない状態で
次々に指定した行に文字列を書き込むってこと。
0638デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:40:41.78ID:xPbhxlpI
配列に書いて要素番号と共に出力すれば
0639デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:53:39.21ID:qj5C8HtX
おまえらよく

与えられた数字のファイルの行番号になにかを書き込むスクリプト
で何がいいたいのかわかるな

与えられた 数字のファイル の行番号なのか
与えられた数字 のファイルの行番号なのか
与えられた数字のファイル の行番号なのか
与えられた数字のファイルの行番号 なのか
さっぱりなんだがw

入力と出力の例を出せば、すぐに解決する問題だろうに
0640デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:56:06.69ID:qj5C8HtX
> やりたいのは全部で何行必要か分からない状態で
> 次々に指定した行に文字列を書き込むってこと。
これもさっぱり

何行必要かわからないって、何の行数なのか
次々に指定した行って、どうやって指定するつもりなのか

示したスクリプトは別に10行という前提じゃなくても機能するし
元のファイルがないって、元のファイルってどのファイルだよ?
なければ作ればいいだけだろ?
0642デフォルトの名無しさん
垢版 |
2020/02/17(月) 15:42:52.76ID:ZjAffcZp
>>639
入力
linenumber=78
value='hoge huga'
linenumber=805
value='foo bar'
...

出力
(空行)...
(78行目)hoge huga
(空行)...
(80行目)foo bar

こんな感じっすね。
入力は(この例では)変数に格納するような形式にしましたが
別にこれと決まった訳じゃないです。
0643デフォルトの名無しさん
垢版 |
2020/02/17(月) 15:45:24.56ID:ZjAffcZp
>>641
うーん。それはまあ,sedでもawkでも同じことが言えますけど
どちらも既存のファイル(またはパイプ越しの既存の出力)に対しての行処理
が得意なんですよね。

一方いまやりたいことはファイルの新規作成であって
しかも最後まで行の総数が分からないという……

これはawkでどうにかするのは難しいのではと思います。
0644デフォルトの名無しさん
垢版 |
2020/02/17(月) 15:49:37.43ID:qj5C8HtX
行番号と文字列のペアが入ったデータ(ファイル)があって、
それに従って別のファイルの指定された行の頭に文字列を入れるってことね

ん?別のファイルの行の頭に文字列を入れるのか?
それとも単に、その出力通りに出すだけなのか?
その出力を作るだけなら簡単だろうけど・・・あーいやどちらも大差ないかw
0647デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:01:09.81ID:qj5C8HtX
入力ファイル形式を
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい

あとは、こんな感じのスクリプトを書いて

i=1
while read -r num string; do
 while [ $i -lt "$num" ]; do
  echo
  i=$((i+1))
 done
 echo $string
 i=$((i+1))
done

cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
0649デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:25:32.91ID:qj5C8HtX
短くしてみた。バグとかはしらん

i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
0650デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:31:22.20ID:2IQo7lRr
>>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
0651デフォルトの名無しさん
垢版 |
2020/02/17(月) 18:55:51.30ID:P9Oy3OK5
一旦配列に入れてからjoin風に出力
入力はsortされてなくても可

#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done

index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
0653デフォルトの名無しさん
垢版 |
2020/02/18(火) 03:26:33.92ID:enVFBik2
Ruby で作った

以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する

ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル

結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!

行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること

3 あ い
7 ab

# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end

次へ続く
0654653
垢版 |
2020/02/18(火) 03:27:41.15ID:enVFBik2
last_line_num = line_num_ary.last[ 0 ] # 最後の行番号
line_count = nil # ファイルの行数

if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end

# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )

# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
0656デフォルトの名無しさん
垢版 |
2020/02/18(火) 09:24:28.92ID:2AC9Ct1n
いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
0657デフォルトの名無しさん
垢版 |
2020/02/18(火) 09:30:40.26ID:HqsHcaRa
別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
0659デフォルトの名無しさん
垢版 |
2020/02/18(火) 10:03:42.59ID:HqsHcaRa
ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
0660デフォルトの名無しさん
垢版 |
2020/02/18(火) 10:04:48.16ID:HqsHcaRa
文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
0662デフォルトの名無しさん
垢版 |
2020/02/18(火) 14:37:02.43ID:gCN/+gaX
>>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
0663デフォルトの名無しさん
垢版 |
2020/02/18(火) 15:45:01.04ID:fdBjlYYo
IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
0664デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:27:39.45ID:X8dqmLc9
1 2
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
0666デフォルトの名無しさん
垢版 |
2020/02/18(火) 20:22:18.38ID:wp4bvOJX
>>664
sed のダブルクォーテーションをシングルクォーテーションにするとどう?
もしくは s/\t/... じゃなくて s/\\t/... とか

>>665
tr の場合うまくいく理由の説明ができないんじゃ?
0668デフォルトの名無しさん
垢版 |
2020/02/18(火) 20:33:06.70ID:hjlsDnk2
tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと
0669デフォルトの名無しさん
垢版 |
2020/02/18(火) 21:52:28.55ID:8C0JMYsF
665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
0673デフォルトの名無しさん
垢版 |
2020/02/21(金) 06:21:58.42ID:A/822pua
$ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?

これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
0674デフォルトの名無しさん
垢版 |
2020/02/21(金) 07:58:16.90ID:0dzJ+7kH
>>673
Bashの機能でエスケープシーケンスを解釈する
'\n'だと\nに展開されるだけだけど
$'\n'だと改行に展開される。
あと$'\u30A2'みたいにUnicode番号も指定できる。
0675デフォルトの名無しさん
垢版 |
2020/02/21(金) 14:48:04.29ID:A/822pua
>>674
そういやシングルクォートなのに改行できてるな
$ echo $'foo\nbar'も改行されるし中々便利そうだ
ありがとう
0677デフォルトの名無しさん
垢版 |
2020/02/25(火) 12:18:34.54ID:S19Y4jrS
grepの-eオプションみたく複数回指定できるオプション引数って
シェルスクリプトでどうやって処理するのが一般的なんかな。

getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。

そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
0679デフォルトの名無しさん
垢版 |
2020/02/25(火) 14:13:23.37ID:oSeHo6cg
>>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる

while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))

for value in "${strings[@]}"; do

done
0682デフォルトの名無しさん
垢版 |
2020/02/25(火) 15:45:41.88ID:K+FIgRaj
今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
0683デフォルトの名無しさん
垢版 |
2020/02/25(火) 17:02:15.34ID:eOOTHTW4
全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。
0684デフォルトの名無しさん
垢版 |
2020/02/25(火) 17:24:31.11ID:S19Y4jrS
>>683
コマンドライン引数の処理において
$@を使ってもいいのかな。
普通に上書きしちゃいそうな気がするが。
0685デフォルトの名無しさん
垢版 |
2020/02/25(火) 17:25:41.11ID:S19Y4jrS
サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
0687デフォルトの名無しさん
垢版 |
2020/02/25(火) 22:33:40.09ID:S19Y4jrS
>>686

頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。

excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
0690デフォルトの名無しさん
垢版 |
2020/02/26(水) 08:25:40.38ID:iwwM4ZEx
>>689
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
0691デフォルトの名無しさん
垢版 |
2020/02/26(水) 08:29:52.36ID:kXv4PxDr
>>690
下手すぎw どうせgrepとかsedとか外部コマンド持ち出してやったからだろ
だから外部コマンドなし縛りをするんだよ

>>689
話が変わってる。POSIX対応したいならgetoptsとかでは無理
qiitaに対応してるサンプルコードがあるから探せ
0693デフォルトの名無しさん
垢版 |
2020/02/26(水) 09:48:23.19ID:re2OdmIW
timeoutで終了するプログラムの最後の1行だけを表示させたいどうするの?
0695デフォルトの名無しさん
垢版 |
2020/02/26(水) 11:26:08.87ID:vrfGqddo
ちなみにgetoptsコマンドはPOSIXで定義されてるけど,実はPOSIXが定めるオプション書式に対応していないっていう。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
0697デフォルトの名無しさん
垢版 |
2020/02/26(水) 13:41:46.61ID:vrfGqddo
>>696
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると

“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。

なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。
0700デフォルトの名無しさん
垢版 |
2020/02/26(水) 23:24:46.41ID:iwwM4ZEx
>>691
使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

個人的には -help が --help の書き間違いとして拾ってくれずに -h -e -l -p になるのが気に食わんのですよ
0701デフォルトの名無しさん
垢版 |
2020/02/27(木) 00:12:01.62ID:nCyLO+2A
Ruby の、OptionParser では、

require 'optparse'

ARGV.replace %w(-e abc -e あ)

opts = { }
ARGV.options do |o|
o.on( "-e パターン", "絞り込む" ) { |x|
( opts[ :pattern ] ||= [ ] ).push x } # 配列に追加する

o.parse!
end

p opts #=> { :pattern=>["abc", "あ"] }
0703デフォルトの名無しさん
垢版 |
2020/02/27(木) 10:15:09.64ID:1d0gnp8c
>>702
>>700じゃないけど
彼は実装者としての立場ではなくて
利用者としての立場からの意見では?
つまりオプションパーサーを作ってるんじゃなくて
既存のオプションパーサーが-help記法に対応してないってこと。
0704700
垢版 |
2020/02/28(金) 00:12:31.43ID:sbmuwMBZ
>>702
はい。 その通りで連結は未対応なスクリプト書いています。
後は値が連結しているタイプ (--foo=goo) も未対応にしています。
0705703
垢版 |
2020/02/28(金) 17:35:34.53ID:+yZJUcOk
>>704
やっぱりね
0706デフォルトの名無しさん
垢版 |
2020/02/28(金) 21:07:42.16ID:11SJpN8G
> 個人的には -help が --help の書き間違いとして拾ってくれずに
-help が --help の書き間違いとして拾ってくれるものなんてある?
0707デフォルトの名無しさん
垢版 |
2020/02/28(金) 21:16:46.81ID:9ZnEM/be
>>700
> 使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...

外部コマンドを使うと遅くなって使い物にならないから、
外部コマンドなし縛りで自分でパーサーを実装すればいいだけ。
それができないから「下手すぎw」と言ってるわけです。
まあ自分で作れないなら仕方ないけどw
0709デフォルトの名無しさん
垢版 |
2020/02/29(土) 08:10:25.23ID:wnu08hYu
外部コマンドを使おうが使うまいが、パーサーのアルゴリズムに大差ないだろ?
今まで外部コマンドを使ってパースしてたなら、
それを外部コマンドを使わずにパースするだけじゃん
何が難しいというのか?
0710700
垢版 |
2020/02/29(土) 09:04:49.63ID:toFJGN/1
>>706
普通ないんだが、注意力が無い何かなのか、問い合わせしてくるユーザーもいて
対応に苦慮することになるんだわ

>>707,709
引数を前から順番に処理してくれない getopt を使わないと決めた途端に難しくなったんだわ
getopt 使わずに -zxf (ファイル名) を -z -x -f (ファイル名) に分割簡単にできる?
-zfx (ファイル名) にしたときエラー処理/クレーマー処理できる?
0711デフォルトの名無しさん
垢版 |
2020/02/29(土) 09:27:10.60ID:Z90YN+Q9
>>710
問い合わせくるユーザーが居るだけで対応する必要ないじゃん

> 分割簡単にできる?
俺はできるw
0720デフォルトの名無しさん
垢版 |
2020/03/01(日) 14:02:23.94ID:4tQoD8Fw
>>717
シェルスクリプト用のあれこれはすべてシェルスクリプト製じゃないといけない
なんて思ってないよな?

俺の知っているシェル・OS環境は,
sortやgrepみたいな外部コマンドどころか for文や変数処理みたいなシェルの内部動作も
みんなC言語で書かれてるんだが…
0722デフォルトの名無しさん
垢版 |
2020/03/01(日) 15:29:04.21ID:4tQoD8Fw
× シェルスクリプト用のオプションパーサー
○ シェルスクリプト製のオプションパーサー

質問するときは明確な言葉で。
0724デフォルトの名無しさん
垢版 |
2020/03/02(月) 16:01:50.45ID:s5dtAso/
外部コマンド使いなくないならBusyBoxみたいなの使うしかないよな。
0726デフォルトの名無しさん
垢版 |
2020/03/02(月) 23:40:28.80ID:8PHDRupm
-help が --help の書き間違いには、ならない。
-help は、h,e,l,p のオプションを連結した書き方で、文法的に正しいから

だから、オプションの連結を禁止すればよい

そうすれば、-h, -e, -l, -p みたいに、書かないといけないから、
-help は、絶対に間違いになるから、指摘できる

オプションの連結は、情報処理の教育を受けた社員を想定しているから、
勉強していないような素人には、難しすぎるw
0727デフォルトの名無しさん
垢版 |
2020/03/03(火) 07:08:07.59ID:IKAJxND7
根本は中国人なのにマスコミも政府も絶対言わないし、
制限しない。

311の政府対応と同じ

政権変わっても変わらん
0732デフォルトの名無しさん
垢版 |
2020/03/03(火) 12:18:09.49ID:3ukr+OhM
任意のオプション引数ってさ、
-help が -h elp って解釈されるよね?
-h -e -l -p とどうやって区別するの?

-help って書いた時どっちの意味になるの?
0733デフォルトの名無しさん
垢版 |
2020/03/03(火) 12:32:47.35ID:yHaKKNdM
あるスクリプトを作っていて、gitで管理しています。

~/src ← gitで管理
~/src/script.sh ← あるスクリプト
~/src/inc.sh ← あるスクリプトから読み込むライブラリ

script.sh から inc.sh を読み込むときに、
. ./inc.sh と書いています

script.sh をどのディレクトリからでも実行できるように
~/bin ディレクトリにシンボリックリンクを作成しました。
そして実行するとエラーになりました。

~/bin/inc.sh を読み込もうとしているからだと思いますが
いい解決方法はないでしょうか?
0734デフォルトの名無しさん
垢版 |
2020/03/03(火) 14:02:09.02ID:5O39EjRd
>>733
~/bin/script.sh をシンボリックリンクではなく
cd ~/src && exec ./script.sh "$@"
を実行するシェルスクリプトにする
0735デフォルトの名無しさん
垢版 |
2020/03/03(火) 14:06:21.11ID:yHaKKNdM
>>734
いろいろあって、そこはシンボリックじゃないとだめなんですよ
0737デフォルトの名無しさん
垢版 |
2020/03/03(火) 17:55:54.44ID:n9Ghdw3q
>>733
inc.shも~/bin(や特定固定のとこ)にシンボリックリンクを置いてしまえ
とか
pathme="$(which "$0")";
[ -L "$pathme" ] && pathme="$(readlink "$pathme")"
. "$(dirname "$pathme")/inc.sh"
とか
0738デフォルトの名無しさん
垢版 |
2020/03/03(火) 18:16:56.75ID:n9Ghdw3q
>>733
>~/bin/inc.sh を読み込もうとしているからだと思いますが
./inc.sh とかいう相対パスは現在のワーキングディレクトリ/カレントディレクトリからのだよ。sourceも同じく特殊なことはせずに
"$(pwd)/inc.sh" を読み込もうとしているのだろう
0739デフォルトの名無しさん
垢版 |
2020/03/03(火) 19:32:36.52ID:PcLjcySC
>>737
やっぱりreadlink使うしか無いですかね。
シンボリックのシンボリックのシンボリックとか考慮すると
readlink -fが必要になるけど、macOS版だとgreadlinkじゃないと動かないし
そもそもgreadlinkが入ってないとか、その他のOSではどうなるの?とか。
そういう面倒なコードはライブラリにしたいけど、そのライブラリを読み込むのに苦労するというw
0740デフォルトの名無しさん
垢版 |
2020/03/03(火) 19:58:06.90ID:BC6YzT5m
後出しかよ
シンボリックのシンボリックのシンボリック
なら、三行書けばいいだけじゃん
やっぱりって何がやっぱりなんだか
0741デフォルトの名無しさん
垢版 |
2020/03/03(火) 20:06:11.93ID:BC6YzT5m
pathme="$(command -v "$0")" || pathme="$0"
[ "$pathme" = "" ] && pathme="$0"
while [ -L "$pathme" ]; do
pathme="$(readlink "$pathme")"
done
. "$(dirname "$pathme")/inc.sh"
で、いいんじゃねえのかよぉ?なんでこんな簡単な対処も?と思うのでなんか穴があるか???
whichってPOSIXじゃなかったのね。煩そうだからそこも
0743デフォルトの名無しさん
垢版 |
2020/03/03(火) 20:41:22.45ID:Lk6RorVj
>>740
沸点低すぎ。自分が欲しい情報を最初から全部準備しておけってか?
間違えるのが怖いってやつだなw
0744デフォルトの名無しさん
垢版 |
2020/03/03(火) 20:47:57.53ID:BC6YzT5m
なんかぐちぐち言っているけど、そんなこと対処すぐ自分でできるでしょなことをぐちぐちとという
ぐちぐち言う奴にはリアルでもムカつく沸点は低いのは確かだがなw

それと後出しなら当然のようにではなくて、すまんがが先にありがだろうに、何を当たり前のようにというのだな。リアルでもねw
0749デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:01:39.37ID:UParEwxG
相手が何も考えてないと思ってるんだろうね。
そのやり方にはこういう問題があるって言ったら、
知ってるなら先にかけ!だもんな(苦笑)
0750デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:04:21.79ID:BC6YzT5m
読めてないな、全然w
のくせに絡みたいのね。苦笑がいい味付けだねw苦笑いするぞ
0751デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:05:27.34ID:V11R45Nz
毎度ながら回答者に問題があるよな

  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
0752デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:07:13.53ID:BC6YzT5m
何をそんなにひ弱なのかわからん...当事者でもないのに
>>740でそんなにダメージ受けるのか?一応ちゃんと回答してもいるんだがな。ひ弱すぎだろう
0754デフォルトの名無しさん
垢版 |
2020/03/03(火) 21:53:18.68ID:BC6YzT5m
本題ではない瑣末wなことに拘るねえ、延々と。その動機がわからん
そう言うことだよ、皮肉屋さん
0755デフォルトの名無しさん
垢版 |
2020/03/04(水) 00:47:20.27ID:Hp65i7gp
煽るわけじゃないけどさ、シェル芸してる人って
アルゴリズムと呼べるようなコードを書ける人が少ない気がする

スクリプト言語で用意されてる便利な関数は使えても
その関数を自分で実装することはできないレベル
C言語で簡単な設定ファイルのパーサーも作れなさそう
0756デフォルトの名無しさん
垢版 |
2020/03/04(水) 01:10:12.01ID:nNNW6i++
>>733
Ruby で言えば、

require './file' は、カレントディレクトリからの相対パスだけど、
require_relative './file' は、現在のファイルからの相対パスになる

つまり、require_relative './file' は、__dir__ + "/file"

__dir__ は、現在のソースファイル(__FILE__)のあるディレクトリ名を、正規化された絶対パスで返します。
シンボリックリンクも解決されます
0757701
垢版 |
2020/03/04(水) 01:34:09.01ID:nNNW6i++
>>732
Ruby の、OptionParser では、
-e オプションがあっても、-h オプションの引数、elp と解釈される

require 'optparse'

ARGV.replace %w(-help)

opts = { }
ARGV.options do |o|
o.on( "-e 引数", "引数" ) { |x| opts[ :e ] = x }
o.on( "-h 引数", "引数" ) { |x| opts[ :h ] = x }

o.parse!
end

p opts #=> {:h=>"elp"}
0760デフォルトの名無しさん
垢版 |
2020/03/04(水) 08:01:55.10ID:1RejiZvB
>>759
qiitaとかtwitterでシェル芸で検索するとわかるよ
難読化(笑)とか意味のないことを一行でやったすげーとか言ってる連中

シェルスクリプトにもプログラムを書くのに必要な機能はあるのに
一行(シェル芸)で書くか、さもなければ他の言語のライブラリを使うしかないって考えてる連中

シェルスクリプトで一行で書けなければ、他の言語を使って数行かけて書くが
そもそもシェルスクリプトで数行書けば、他の言語より短く実現できたりするのに
アルゴリズムを書く能力がないからそれができない。そういう奴らが好きな言葉がシェル芸

目的の機能がないと何も出来ない。プリミティブな機能を使って実現する思考能力が欠けている
0763デフォルトの名無しさん
垢版 |
2020/03/04(水) 11:31:06.93ID:8C7aLz+2
一般論だが
目的が解決できれば解決策は簡単な方がいい
シェルスクリプトで一行で書けるのならそれにこしたことはない
シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき
0764デフォルトの名無しさん
垢版 |
2020/03/04(水) 11:53:24.17ID:nNNW6i++
シェル芸は、Software Design で、上田隆一が連載しているものだろ。
次回で連載終了だけど

たいてい、awk を使う
0765デフォルトの名無しさん
垢版 |
2020/03/04(水) 15:48:52.99ID:Tzh2DSUj
>>764
シェルスクリプトでプログラミングしないなら
「POSIXコマンドプログラミング」って改名したほうが良いと思う
awkプログラミングでもいいけどなw

シェル(CLIから実行するもの)とシェルスクリプト(.shファイルにまとめたもの)と
厳密に区別してるならいいけど、実際にはシェルスクリプトの中でシェル芸してるんだよなw

例えばRubyなんかでも外部コマンドを呼び出せるわけでRubyのなかでシェル芸もできる。
これをRubyコードと呼べるかというと疑問がでるだろう?それと同じ。

>>763
> 目的が解決できれば解決策は簡単な方がいい
という条件からすると、Rubyのなかでシェル芸するのが正解なパターンは結構多いと思う。
でもやらないことの方が多いだろう。理由はなんだろうか?処理速度かな?
その理由と同じものが、シェルスクリプトにも当てはまると思う。
つまり(Rubyの場合と同様に)シェルスクリプトの中でシェル芸すんな(笑)

> シェルスクリプトだと処理の限界もあらかじめ分かっているというおまけつき
一行では書けなくても、数行書けば実現できることも多い。
シェル芸しかできないから、一行で書けなければムリと諦めてる奴が多い。
たとえばRubyだと1行でできることが、C言語だと数行かかることは多いが、
それを「C言語の限界」と言うやつはいないだろう。だけどシェルスクリプトだと
それをシェルスクリプトの限界だと言う。単に自分の力の限界なだけなのにな。
0767デフォルトの名無しさん
垢版 |
2020/03/04(水) 16:14:02.93ID:yiNVycVp
ロジックが整理されておらず
バグが多数潜んでるシェルスクリプトかのような長文

言語が考え方に影響を与えることが分かるいい例だな
0768デフォルトの名無しさん
垢版 |
2020/03/04(水) 16:37:48.08ID:Tzh2DSUj
>>767
理由が書いてない、説明がまったくないので同意しないw
自分が思ったことつぶやいただけだな
0769デフォルトの名無しさん
垢版 |
2020/03/04(水) 18:50:02.63ID:RW1/oxrb
いちゃもんつける(自分のストレス発散)のが目的なもんだから
段落ごとの方向性がバラバラでつながりが無い/意味不明な文章
0771デフォルトの名無しさん
垢版 |
2020/03/04(水) 23:41:25.17ID:ito9Fws2
>>733
. inc.sh
にすればPATHから探す
0773756
垢版 |
2020/03/05(木) 00:24:52.81ID:PBcHTAfh
>>756
に書いてある

つまり、カレントディレクトリからの相対パスではなく、
このファイルからの相対パスになる

だから、このファイルがあるディレクトリの絶対パスを求めて、
それに相対パスを加えるとよい
0776756
垢版 |
2020/03/05(木) 04:40:53.09ID:PBcHTAfh
>>756
に書いてあるけど、例えば、Ruby では、
script.rb に、スクリプトを書いてるとき、

p __FILE__
p __dir__

出力
"c:/Users/Owner/Documents/test/script.rb"
"c:/Users/Owner/Documents/test"

__FILE__ は、このファイルの絶対パス、
__dir__ は、このファイルがあるディレクトリの絶対パスを表す

だから、このファイルから見て、相対パス、./file なら、
__dir__ + "/file"

つまり、c:/Users/Owner/Documents/test/file
0778デフォルトの名無しさん
垢版 |
2020/03/06(金) 15:44:20.26ID:el16gBAN
Rubyの人に質問するけど
Rubyでは引数処理に便利な機能って標準で提供されてるの?
0779デフォルトの名無しさん
垢版 |
2020/03/06(金) 16:18:48.95ID:dB1opsgL
すでに書かれてるだろ。自演か?w
興味あるならあれが標準かとか具体的なのは自分で調べろよ、もしくはRubyスレでだな
0781デフォルトの名無しさん
垢版 |
2020/03/06(金) 23:52:31.10ID:uvQVOrPP
ようやくbashに慣れてきたけど最低限覚えとけって言語はなんだろうか
頻繁に使うのはsed・awk・grep程度なんでやるならperlの方がいいのかね
今後のためにpythonをと言われても素人に使う機会ないわ
0783デフォルトの名無しさん
垢版 |
2020/03/07(土) 00:00:23.26ID:z518jRtl
>>778
ARGV, ARGFが組み込み、OptionParserが標準添付ライブラリで提供されてる

ARGVは配列に引数が入ってるやつでだいだいどの言語にもあるやつ
ARGV[0]が実行コマンドじゃなく1つ目の引数になってるのが微妙に使いやすい

ARGFは引数でファイル名を受け取る場合と
標準入力でファイルを受け取る場合を1つの処理で書ける便利なやつ
Ruby以外では見たことない

OptionParserはショートオプション/ロングオプション/サブコマンドとかをサポートしてて
getoptやgetoptsに比べれば書きやすいし便利ではある
ただもっと高機能なgemもあるので依存性とのトレードオフでライブラリを選ぶ感じ

総じて簡単には書けるんだけどPerlなんかに比べるとインタプリタの起動が超遅いから
コマンド叩いてから処理が終わるまでの時間が比較的長い場合にしか使わない
0785デフォルトの名無しさん
垢版 |
2020/03/07(土) 13:57:14.80ID:wqSODED6
if文でディレクトリの権限を確認するにはどうしたらいいですか?
-wをやってみたのですがうまく動作してくれません。
ファイルにしか使えないのですかね?
0786デフォルトの名無しさん
垢版 |
2020/03/07(土) 19:03:29.05ID:Tac4Jm8B
rootだからじゃね?いちおう対象がディレクトリも-wで書き込みの可否は返してるけど
0787デフォルトの名無しさん
垢版 |
2020/03/07(土) 22:08:31.10ID:wqSODED6
>>786
動作としては書き込み権限の有無を確認し、無ければ付与するという動作が作りたかったです。
いろいろ調べたところrootだとパーミッションを無視するらしいので、
if [ ! -w ディレクトリ ]
上記の記載をしているスクリプトの実行ユーザがrootの為、全てにおいて書き込み権限があると認識されてしまっていると考えられます。
0789デフォルトの名無しさん
垢版 |
2020/03/08(日) 00:08:43.59ID:rfEr1WGY
>>788
chmodでディレクトリの権限を000にしても可能でしたが…
0791デフォルトの名無しさん
垢版 |
2020/03/08(日) 02:47:35.54ID:rfEr1WGY
>>790
そうなのですね。
それであれば、000にしてもrootは書き込み可能だから毎回書き込み権限が付与されないは正しい挙動ですね。
実行ユーザーを一般ユーザーに変えるか、lsの結果にwの文字があるかを判別する処理に変えるが対処法になりそうですね。
0792デフォルトの名無しさん
垢版 |
2020/03/08(日) 03:12:50.23ID:P20sq25k
>>791
そう、思い出した。ファイルのパーミッションを自分から読み書きできないように変更して
本当に読み書きできないか、-wや-rでチェックするコードを書いたら、rootの場合は
それが上手くいかなかった。だからrootではそのチェックをしないようにした。
0794デフォルトの名無しさん
垢版 |
2020/03/08(日) 12:36:43.71ID:uLLaNXsz
rootが「一見書き込めない」ファイルは存在しうるけど
「書き込む許可をどうしても得られない」ファイルはシステムの不具合でもない限り存在しないからね。
じゃなきゃそのファイルを誰が処理するのかって話になる。

UID 0は自分が持ち上げられない岩は作れないのだ。
0795デフォルトの名無しさん
垢版 |
2020/03/08(日) 19:11:47.52ID:RzwfZ5D7
Read onlyでマウントしたのはボリュームはrootでも書き込めないよね。そもそも書き込めないメディアも
あくまでも-wは書き込めるかの判定だから使う側が勘違いしてるだけで判定としてはrootでも全く正常な動き
0798デフォルトの名無しさん
垢版 |
2020/03/08(日) 22:45:41.68ID:rfEr1WGY
>>795
スクリプトを一般ユーザーで実行した際に書き込み権限があるかを判別するって認識でいいんですかね?
rootだと基本全部書き込めるから、一般ユーザーくらいでしか機能しない処理のような気がします。
0799デフォルトの名無しさん
垢版 |
2020/03/08(日) 23:08:52.65ID:5CM70Uar
単に現在(のユーザで)書き込めるかどうか判別してるにすぎないざね。権限とかは置いておいて。書き込める=書き込める権限と言うのならそうかもしれんが

ちなみに、macOSだとロックというのがあり、ロックするとrootでも書き込めないよう
権限とかではなくて単に書き込めるかどうかだな。Read onlyでrootで書き込めないのもそうだし
権限を調べたいならrootではなくてだろうね。もしくは詳しく権限を調べるとか
0800デフォルトの名無しさん
垢版 |
2020/03/09(月) 01:15:25.69ID:EmgiRGOf
>ちなみに、macOSだと〜
macOSというかBSDだな。FreeBSD/OpenBSDにもあった、そして挙動が同じ
0801デフォルトの名無しさん
垢版 |
2020/03/09(月) 08:15:32.71ID:nSyyVcXg
>>798
> 一般ユーザーくらいでしか機能しない処理のような気がします。

逆じゃね?w
rootくらいでしか問題にならないでしょ

rootでなんか普通使わねーw
0804デフォルトの名無しさん
垢版 |
2020/03/09(月) 16:01:54.84ID:sbrbbxpE
いや、どいつもこいつも設定しないのか。意外だな
PWD
This variable shall represent an absolute pathname of the current working directory. It shall not contain any filename components of dot or dot-dot. The value is set by the cd utility.
> The value is set by the cd utility.
まんまなのか(?)
0805デフォルトの名無しさん
垢版 |
2020/03/09(月) 16:26:06.84ID:sbrbbxpE
いや、スクリプトファイルの実行時にならされる、-c のコマンド羅列文字列の実行時にはされないかな?
0806デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:07:49.62ID:bHKN7jy6
どのシェルも設定されるなーって思ってたらkshはされんかった
export $PWD=aaaってやって
ksh -c 'echo $PWD'したらaaaってでた
0807デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:10:56.70ID:bHKN7jy6
-cだけじゃなくてksh a.shってやってもaaaってでたw
最初、echo $PWDの前に確認のためにpwdコマンドやっていて気づかんかった
kshだとpwdやったらPWDも設定されたw
0808デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:14:17.37ID:bHKN7jy6
おぉ? kshだとcd .してもPWDは設定されんかったぞw
流石に別ディレクトリに移動したら設定されるが
0809デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:33:20.75ID:6JwbfpR0
しまった。>>804,805は -c で " で括ってた。そりゃあ...すまん

kshも設定されない?(??)
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'
ってやったら、(pwdの) hoge かな。バージョン違いかな? うちのは 93u+
0810デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:39:14.18ID:bHKN7jy6
面白いなw
export PWD=aaaってやって以下のスクリプトを実行したら

echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
ってなった。

どこで設定してるんだよwww
kshは93u+
0811デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:40:22.34ID:6JwbfpR0
>>808
どういうテストなのかわからんけど、93u+ ではこんなん
$ cd /home
$ echo $PWD
/home
$ PWD=hoge
$ echo $PWD
hoge
$ pwd
/home
$ echo $PWD
hoge
$ cd .
$ echo $PWD
/home
0812デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:40:35.23ID:bHKN7jy6
echo実行後にせってされてるのでは?と思う人のために

echo $PWD # aaa
echo $PWD # aaa
echo $(echo $PWD) # /home/ore
echo $PWD # /home/ore
0814デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:42:40.76ID:bHKN7jy6
>>811
あ、kshに入ってから実行してるわけじゃないよ
bashからksh -c とか ksh a.sh とかしてる

ksh上でやってるならプロンプト表示する処理の
どこかで設定されてるのでは?
0815デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:45:40.99ID:bHKN7jy6
echo $PWD # aaa
:
echo $PWD # aaa

-----

echo $PWD # aaa
$()
echo $PWD # aaa

-----

echo $PWD # aaa
$(:)
echo $PWD # /home/ore

サブシェルに入ってから?なんか実行すると設定されるっぽいw
0817デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:48:20.68ID:bHKN7jy6
つまりkshで安全に$PWDを使うためには
最初の方で$(:)を実行しておけってことだなw
これが最速の方法か知らんけど、pwd > /dev/null よりかは速そう。いやどっちだろ?
0818デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:50:28.04ID:bHKN7jy6
bashでログインして、cd /homeして

ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
/home
ってでる

export PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD' を実行すると
hoge
hoge
ってでる
0819デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:51:54.13ID:bHKN7jy6
ははは、ワロスワロス。どうなってるのか考えたら、頭がこんがらがってきたw
0820デフォルトの名無しさん
垢版 |
2020/03/09(月) 18:55:32.91ID:6JwbfpR0
なるほど
PWDがexportされていたかに影響するのか、イミフだな
exportされてるされてないで、pwdでのPWDも動作違う(?)
0821デフォルトの名無しさん
垢版 |
2020/03/09(月) 19:04:32.47ID:bHKN7jy6
PWDはデフォルトでexportされてるはずだから

cd /home
PWD=hoge
ksh -c 'PWD=hoge;echo $PWD;cd .;echo $PWD'

これも
hoge
hoge
0823デフォルトの名無しさん
垢版 |
2020/03/09(月) 19:11:00.02ID:bHKN7jy6
スクリプトの中から
さらにksh -c 'echo $PWD'してもPWDはaaaのままだたけど
(echo $PWD)するだけで/homeになるな。
つまりサブシェルを使うと、サブシェルの外のPWDの状態が変化する
0824デフォルトの名無しさん
垢版 |
2020/03/09(月) 19:20:17.23ID:6JwbfpR0
うむ、PWDをイジるとね

>>809のも
export HOGE=hoge
export PWD=hage
ksh -c 'echo $PWD $HOGE'

ログインして(シェルはbash)すぐ実行だと、
/home/ore hage
ログインして(bash)、cd /home した後だと、
hage hoge
だな。まずイミフ。PWDなんてイジらない(そもそもkshを好んで使わないwそういういOSがあるらしいが知らんw)から忘れようw
0825デフォルトの名無しさん
垢版 |
2020/03/10(火) 00:15:26.42ID:oWfapBN9
files="/Users/aaa/Documents/*"
for filepath in $files;
do
case $filepath in *.txt)
echo $filepath
esac
done

このcaseをifに置き換えた場合がうまくできません
ご指導よろしくお願いします
0828デフォルトの名無しさん
垢版 |
2020/03/10(火) 06:34:25.94ID:fD+LS7Hr
単に拡張子を判断したいってだけじゃね。それも txt 一つだけとか。だとしたら、
if [ "${filepath##*.}" = "txt" ]; then
echo "$filepath"
fi
とかにしたくなるのもわからないでもない
0829デフォルトの名無しさん
垢版 |
2020/03/10(火) 08:08:24.53ID:oWfapBN9
>>827
勉強中でどうすればいいかわからなくて色々試してる最中です
if [[ $filepath = *.txt ]]; then
[[]]としたら出来ました
files="/Users/aaa/Documents/*.txt"
こうしたらcaseもifも不要でシンプルに出来ました
>>828
勉強になります。ありがとうございます
0830デフォルトの名無しさん
垢版 |
2020/03/10(火) 10:13:09.27ID:KDNpqv0e
>>828
なんでそんなにifにこだわるんだろうかね

if [ "${filepath##*.}" = "txt" ]; then
case $filepath in *.txt)
if [[ $filepath = *.txt ]]; then

どれがシンプルかは比べてみれば明らかだろうに

caseはcase一つで実現しているが、ifは別途 [ または [[ を
組み合わせてるから無駄な処理を行ってるんだが
文字数も長いし、[[はbash依存

パターンマッチングをcaseからifに置き換えても
文字を長くして無駄な処理を行って動くシェルを減らしているだけで
メリットが一つもない
0831デフォルトの名無しさん
垢版 |
2020/03/10(火) 16:38:10.67ID:HVuW4BfF
一つだけなのにcaseを使うのが気持ち悪い、判断パターンをcaseの後に書くのが気持ち悪いという感性の問題だな
どの感性が良い悪いというのではく。コーディング規約が一つにならないのと同じような
お前は俺のコーディング規約が絶対と言って譲らないのと同じ
0832デフォルトの名無しさん
垢版 |
2020/03/10(火) 22:41:26.01ID:DGocRqod
コーディング規約と漠然にいってるけどその内容には二種類あって、
一つは「理由がある良いやり方」と
もう一つは「どちらでも良いけど統一しましょう」というだけのもの

理由があるものはどちらが良いか明確に言うことができる。
明確に言えないものはインデントのスペースを2にするか4にするかという
統一だけするもの。コーディング規約にはこの二つが混じっているから、
良いか悪いかの話ができるものまで、好みの話だと勘違いしてる。

感性が邪魔して良い方法を採用することが出来ないという気持ちはわかるが
今回は明らかにcaseを使ったほうが良い。他にifの方がいい理由があれば
トレードオフの話に持っていけるが
0834デフォルトの名無しさん
垢版 |
2020/03/11(水) 03:56:24.84ID:arwb9WsV
俺様が決めたコーディング規約に従えねぇってかごるぁ
ということを言いたいんだろうな。caseは正義なんだと。
0836デフォルトの名無しさん
垢版 |
2020/03/11(水) 09:22:15.60ID:FWSDJbu9
>>834
コーディング規約の話なんかしてないだろ?
この場合は、caseの方が優れてるのに
ifを使いたいという"感性"を持ち出してきたアホが居るだけ
そのアホがコーディング規約がーとか意味不明なことを言ってるだけ
0837デフォルトの名無しさん
垢版 |
2020/03/11(水) 09:32:31.50ID:FWSDJbu9
この場合はcaseが優れてるね

case使えって言った!こいつどんなときでもcase使えって言った!
理由はコーディング規約だからそれに従えだって!


誰もそんなこと言ってないんだよなぁ(笑)
なんで優れてるかどうかの話をすり替えたんだろうね
0840デフォルトの名無しさん
垢版 |
2020/03/11(水) 10:35:05.80ID:9AoZOnAU
>>829を読むとcaseもifも使わないでシンプルに出来たと言っていて、本人はifになんか全然拘っていないんだよな。何故か勝手にしつこく敵視してる笑。
0844デフォルトの名無しさん
垢版 |
2020/03/14(土) 09:40:09.35ID:H7XbSJpX
知らんかったけど、こんな書き方できるんやな

cat << HERE |
abc
HERE
sed s/a/b/g

cat <<HERE &&
abc
HERE
echo abc

謎な書き方多すぎw
0846デフォルトの名無しさん
垢版 |
2020/03/14(土) 11:50:07.06ID:9+oeBXql
zshだとOKだけどbashだけど文法エラーになるものってあるかな?

例えばbashだとOKだけど、shでは文法エラーになるものに配列がある。

$ bash -cn 'a=()'
$ sh -cn 'a=()'
sh: 1: Syntax error: "(" unexpected

これのzsh版
0847デフォルトの名無しさん
垢版 |
2020/03/14(土) 11:52:32.93ID:9+oeBXql
ただしこれは除く

$ bash -cn 'foo() :'
bash: -c: 行 0: 予期しないトークン `:' 周辺に構文エラーがあります
bash: -c: 行 0: `foo() :'

これはshでは通る。POSIX準拠の構文なはず。だけどbashが通らない珍しい例
$ sh -cn 'foo() :'
0848デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:19:53.15ID:4q4RZYWz
環境はMac mojave、lsとecho $(ls)とで挙動が違うのってなんででしょうか
前者はスペースや改行がしっかりされてるんですが後者は整形されませんでした
0849デフォルトの名無しさん
垢版 |
2020/03/14(土) 15:51:10.82ID:ILPzjwAA
lsは出力先によってオプションを指定しない場合のdefault formatが変わる
そういう仕様
0850デフォルトの名無しさん
垢版 |
2020/03/14(土) 16:50:55.95ID:cW1wo+Y7
>>848
echoなんぞに引数で渡す場合は、引数として渡すために分割されてるからじゃね。逆に整形されてるとも言える
echo "$(ls)"
(IFS=''; echo $(ls))
だと同じくならなくね?
0851デフォルトの名無しさん
垢版 |
2020/03/14(土) 17:16:06.25ID:aw8SOrjK
>>848
echoは複数の引数を(IFSの値とは関係なく)
スペースで区切ってくっつけるという仕様だから
0852デフォルトの名無しさん
垢版 |
2020/03/14(土) 17:30:36.50ID:ILPzjwAA
$ echo "$(export COLUMNS=159; export CLICOLOR_FORCE=1; ls -C)"
これでlsだけの時と同じ出力になった
0853デフォルトの名無しさん
垢版 |
2020/03/14(土) 17:34:32.34ID:aw8SOrjK
それは一つの引数の中に改行があるからな

別の問題として最後に複数の改行があっても一つにまとまるから
厳密には同じではない
0857デフォルトの名無しさん
垢版 |
2020/03/14(土) 17:56:25.94ID:aw8SOrjK
教えてほしいなら、何を教えればいいか具体的に言おうねw
質問者のくせに
0863デフォルトの名無しさん
垢版 |
2020/03/15(日) 00:05:16.78ID:7lggs81n
$ echo " foo bar " " baz qux"
__foo__bar_____baz__qux

空白まとまらないけど、なんの話をしてるの?
0865デフォルトの名無しさん
垢版 |
2020/03/15(日) 00:16:12.28ID:1+6iz56B
あららw "_" をスペースに読み換えて頂戴

$ echo " foo bar "_____________" baz qux"
_foo_bar___baz_qux
0870デフォルトの名無しさん
垢版 |
2020/03/15(日) 12:24:19.50ID:ekOFLY9+
exprの正規表現関連の機能って便利だな。
恥かしながらPOSIXで定義されているとは思わず,
ずっとBash拡張だと思って利用を避けてきてたわw

sedだと変数の値に対しての操作が一発でできない(printf '%s' "$var"なんかを噛ませないといけない)
から、「変数に対して,指定した位置の文字を抜きだす」くらいの単純作業なら,
sedよりexprで処理した方がコマンドの個数も少なくなるし,よさげ。
0871デフォルトの名無しさん
垢版 |
2020/03/15(日) 13:45:49.67ID:4Gm4pJRZ
>>870
exprは外部コマンド、bashとは無関係
sedで変数もうさも、sedの代わりにexprも意味がわからない。
使い方が違うコマンド
0872デフォルトの名無しさん
垢版 |
2020/03/15(日) 17:46:54.09ID:ekOFLY9+
>>871
Bashとは無関係とはいっても
echoみたいにPOSIXでは「外部コマンド」とされてるけど
Bashでは組み込みコマンドで,かつ独自の拡張機能が備わっている。
みたいな場合も考えられる。
0877デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:19:50.83ID:GTp/Qp/S
exprぐらいシェルのビルトインになっていてもおかしくない。ある意味思い込み
exprの正規表現関連はbashの拡張だと思っていた。exprがbashのビルトインしくはbashのオマケ外部コマンドなのが必須=完全な思い込み
というだけだろ。言いたいことはそこじゃないだろに、読み取ってやれよw
0879デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:30:33.87ID:7377Zo4Z
>>877
だからbashの拡張だと思っていたと言ってるから
そもそも外部コマンドだ。と言ってるだけなんだが
0880デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:35:36.36ID:GTp/Qp/S
>>879
>>878

そこは蛇足
exprの正規表現関連はPOSIXじゃないと利用を避けてきたわ
で済むだけ。外部コマンドとか蛇足もいいとこな話だろう
0881デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:42:53.24ID:7377Zo4Z
蛇足って話をするのなら、外部コマンドに反論すること自体が蛇足

そんなどうでもいいことじゃなくて、
sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ
0882デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:48:02.29ID:GTp/Qp/S
思い込みの理由を述べただけと読んでやれよ。なんでそうも噛み付いているの?

sedにネタ元渡すためにはとかじゃないの?echoでもいいんじゃないの?ソコは
exprは対象を引数として渡せるぐらいの意味、動作及び返り値が単純だから変数をちょっとイジるくらいならsedよりもって話じゃないの。俺はそう読み取ったけど

なんでそうも強く噛み付いているの?
0883デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:50:35.45ID:7377Zo4Z
> なんでそうも強く噛み付いているの?

噛み付いてないけど?俺はexprは外部コマンドと言っただけ
それ以外のことを言ってない。
過剰に反応してるのはお前では?
0884デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:53:20.23ID:GTp/Qp/S
蛇足なことが続くなと思ったからだけど。蛇足な理由を言っただけだけど?
>>881なんて明らかに噛み付いているだろうにw 特に後半とか。よく言うよ
0885デフォルトの名無しさん
垢版 |
2020/03/15(日) 22:59:01.24ID:7377Zo4Z
後半?これ?蛇足(bash拡張かどうか)じゃなくて本筋の話をしろとしか書いてないが?

> sedでprintf '%s' "$var"とか言う意味不明な点を説明しろよ
> 変数の値に対しての操作が一発でできないのは「外部コマンド」ならどれも一緒だろ
0886デフォルトの名無しさん
垢版 |
2020/03/15(日) 23:07:40.57ID:9BnnGhWf
無茶苦茶だなとしか言いようがない
で、その応えは>>882で納得したのかね?合っているのか知らんけど、俺は一応そうは読めたからなあ、「意味不明な点を[説明しろよ]」とか何様なんだか何噛み付いているのかとしか思えない
0891デフォルトの名無しさん
垢版 |
2020/03/15(日) 23:52:26.22ID:Uvpryj8C
>>870 を読んだ限りでは
「そうか、誤解してたのか。でもその誤解はもう解けたんだな。」
くらいにしか思わないけどなあ。
知らないみたいだから教えてやろうみたいな考えにはならないけどなあ。
0892デフォルトの名無しさん
垢版 |
2020/03/16(月) 05:03:15.13ID:OSNWgEHh
シンタックスエラーになるのに、問題なく実行できる例

shopt -s expand_aliases
alias loop=for
loop i; do
 echo "$i"
done

だからなんだって言われても困るけどwww
0893デフォルトの名無しさん
垢版 |
2020/03/16(月) 05:05:37.60ID:OSNWgEHh
キーワードを全部置き換えれば対象可能かな?

shopt -s expand_aliases

alias loop=for
alias begin=do
alias end=done

loop i; begin
 echo "$i"
end
0894デフォルトの名無しさん
垢版 |
2020/03/17(火) 01:19:59.84ID:tnhbC/l2
まだ初歩的なシェルスクリプトしか書けないがbashで一番変態的な記法ってなによ
空白を入れないfoo=barの時点で妙だし配列が括弧だらけでマンドクセとは思うが
0895デフォルトの名無しさん
垢版 |
2020/03/17(火) 02:44:04.56ID:DZYZalLc
さあなぁ、シェルスクリプトのコマンド=外部コマンド
だからファイル名につけられる文字や名前はすべて外部コマンド名として許されるべきだろうから
そうすると、やたらとコマンドを増やすわけにはいかないんだよね。

ABC = 123 とか書くと、ABCコマンドがあったらどうするんだ!?ってなるわけで、
ABC=123という風にファイル名にイコール使わないんじゃね?という前提にした
という理由があるから、そうなってるのわかるしなぁ。

ABC[123]とかいう外部コマンドだって作ろうと思えば作れるし

${aaaなんとか}シリーズが多いのも、既存の文法の拡張だけでやりたいからだろうし、
理由がわかれば、なっとくできるからなぁ。

んで、シェルスクリプトではそれ以外の拡張はしづらい運命にあるから、
逆に変態的な記法ってないで。変態な記法を作ろうと思っても作れない。
0896デフォルトの名無しさん
垢版 |
2020/03/17(火) 02:51:08.61ID:DZYZalLc
シェルスクリプトの欠点?というわけでもないが、
仕様としてコマンド置換は最後に連続する改行が消えるから
var=$(func 1 2 3) みたいな形で、便利な関数を追加するのが
難しいんだよね。最後の改行が消えるから

いろんな機能が${varなんとか}の形で提供されてるのは、
これなら変数の代入だから最後の改行が消ないから

変態的な記法というならこれかなぁ、配列もそうだし
何でもかんでも${varなんとか}という形で機能拡張が行われてる
最近の ${parameter@operator} とかね
0897デフォルトの名無しさん
垢版 |
2020/03/17(火) 14:49:49.69ID:+LpQdzFa
>>896
連続する改行が消えるのは、個人的には寧ろありがたい(整形しなくて済む)のだけれど
正確な出力が要求される場合には(例えば元のデータを可能な限り復元するとか)
面倒な仕様かもね。
0899デフォルトの名無しさん
垢版 |
2020/03/18(水) 01:29:14.04ID:9x4eFjJt
>>894
関数を一行で書く時の空白と;が割と初見殺し
func(){ echo foo;}
波括弧が予約語なんで開き括弧の空白と閉じ括弧の;が必須
改行時は不要だから結構ハマったわ
0900デフォルトの名無しさん
垢版 |
2020/03/19(木) 09:42:42.24ID:+0MAARlE
exprについて教えてください。
現在tarで圧縮したファイルの末尾に数字をつける処理を使っています。
A=tarファイル名
B='expr = $A + 1'
tar czvf B 対象ファイル名
上の処理で実行すると、[整数でない引数]と表示されてしまい数字が付かないtarが出るのですが何故でしょうか。
0902デフォルトの名無しさん
垢版 |
2020/03/19(木) 10:02:09.16ID:QNV2kCYN
tarファイル名 が [整数でない引数] だからというその表示のまま
他にもツッコミどころがありすぎ
0903デフォルトの名無しさん
垢版 |
2020/03/19(木) 10:09:58.74ID:JDU05jIv
expr の四則演算は、整数しか使えないのかも。
こういう感じ

echo `expr 100 + 20`
#=> 120

まあ、expr で検索して!
0906デフォルトの名無しさん
垢版 |
2020/03/19(木) 12:30:37.63ID:awkeHjZR
>>902
数字じゃないとダメってことですか?
調べたのですが、普通に同じような書き方でテキストファイルに数字つけてる方がいたので参考にしたのですが…。
0908デフォルトの名無しさん
垢版 |
2020/03/19(木) 14:30:55.18ID:awkeHjZR
>>907
その例でいうと"11"が不明なのです。
tarを作成する際に同じ名前のtarがすでにあった場合は数字をつけたいんですよね。
すでに同一ファイル名があったら1をつける。
同一ファイル名1があったら2に変えるみたいな…。
名前の重複を避けたいのです
0909デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:05:23.65ID:JDU05jIv
名前が重ならない、temp ファイルを使えば?
mktemp コマンドを利用して、ユニークな名前の一時ファイルを作成する

それか、ファイル名に、タイムスタンプを含めれば?

1 とか、2 を付けるのは難しい。
1があれば、2にして、
2もあれば、3にして、

こういうループは難しい
0911デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:43:33.78ID:A3B3oNfE
>>908
プログラミング的なスクリプトを書かないとだめだろう
通番をつけるのは今何がつけられていて
その中での最大が何でそれにプラス1するって処理が必要で
複雑になるから通番なしのものがあれば
日時入れるのが妥当なのではないかな
0912デフォルトの名無しさん
垢版 |
2020/03/19(木) 15:44:22.95ID:A3B3oNfE
ちなみにwgetであればオプションにもよるけど
ダウンロードしようとしてるファイルがすでにあれば
通番をつけるようになってるけどtarとかでは聞かない
0914デフォルトの名無しさん
垢版 |
2020/03/19(木) 18:00:54.20ID:fgd/sgV0
ttps://qiita.com/tomiokario/items/a0b635d09995bb74503b

これを参考にしたのかな? まあ足してるの整数同士だけど。このまま試してみればいい
じゃん。ただ、機能するけどちょっと直さないと名前がおかしくなると思うたぶん。
0916デフォルトの名無しさん
垢版 |
2020/03/19(木) 18:49:11.91ID:CK8P50/C
ID:awkeHjZR が参考にしたのだろ
既存の最大の次でもない、単にあったら次だな、今までのレスからは
誰もが使うのだったら既存の最大の次の方が望ましいだろけど
0917デフォルトの名無しさん
垢版 |
2020/03/19(木) 19:05:06.03ID:CK8P50/C
ああ、最大にはなってるのか。いちおう
間に欠番があってはとか、というよりちょっとアレだなという、「大幅に違う」か(?)
0919デフォルトの名無しさん
垢版 |
2020/03/19(木) 19:20:02.01ID:awkeHjZR
>>914
それを参考にしました。
よく見たら整数通しでしたね。
申し訳ありません…
0920デフォルトの名無しさん
垢版 |
2020/03/19(木) 22:46:59.86ID:0V5Z+nsf
A=tarファイル名
B="$A"
if [ -e "$B" ]; then
e="${B##*.}"; [ "$e" = "$B" ] && e='' || e=".$e"
B="${B%.*}"

x=0
for f in "$B"*$e; do
v="$(expr "${f%.*}" : '.*[^1-9]\([1-9][0-9]*$\)')"
[ "$v" -gt "$x" ] 2> /dev/null && x=$v
done
B="$B$((x+1))$e"
fi
echo tar czvf "$B" 対象ファイル名

Aが存在しない場合はそのまま、存在する場合は連番付きの最大+1
Aは拡張子付いていてもいい
風な
0921デフォルトの名無しさん
垢版 |
2020/03/19(木) 23:10:29.22ID:0V5Z+nsf
Aに拡張子ない場合、 for直下に
[ "$e" = '' ] && [ "${f##.*}" = "$f" ] && continue
とか必要か
拡張子抜きの名前の最大の場合はこれはいらず
for f in "$B"*; do
でいいはず
拡張子無いのだけを抽出するGLOBってあったかな?
0926デフォルトの名無しさん
垢版 |
2020/03/20(金) 11:04:41.59ID:Cf4Df32C
ユーザ名パスワード受け取って、シェルスクリプト内でloginさせるような使い方って普通?

docker login -n ユーザ名 -p パスワード
docker run イメージ
みたいな
0928デフォルトの名無しさん
垢版 |
2020/03/20(金) 15:01:17.57ID:b2ihZgLg
>>926
そういうのはCredential Storeを使う

シェルスクリプトのことだけで言えば
echoさせずにパスワード入力させてそれをreadするのが普通
コマンドに渡すやり方だと最低でも履歴に残らないような対処が必要
0930デフォルトの名無しさん
垢版 |
2020/03/20(金) 22:01:17.87ID:PR7Jj0ZL
>>925
そうじゃなくて、POSIXで正規表現が使えるコマンドは
expr、grep、awk があるが、例えば BREに対応と言いつつ
BRE以上のものにまで対応していて、どこまで対応してるのか
完全に一致しているのか改変されているのか、
拡張オプションが有るのか、バラバラと言うこと
0933デフォルトの名無しさん
垢版 |
2020/03/21(土) 09:14:24.32ID:Nklv0DXu
>>927
Windows 10, WSL, Ubuntu 18.04 で、
which mktemp
/bin/mktemp

でも、一時ファイルのパーミッションが、700 になるなど、ややこしくて使えない!
単純にそのディレクトリ内で、ユニークなファイル名がほしいだけ
0934デフォルトの名無しさん
垢版 |
2020/03/21(土) 10:15:51.52ID:aSsBDGSZ
>>927
普通はmktempやろ

>>933
何がややこしいのかわからん。700で困るんか?
ディレクトリ内で、ユニークなファイル名が欲しいだけなら700で何も問題ないだろ
お前がパーミンションを理解してないだけ
0936デフォルトの名無しさん
垢版 |
2020/03/21(土) 10:24:42.26ID:HMPQgip5
>>934
テンポラリを表す省略形のことだろ

そのディレクトリは/tmpではないとこじゃね。PWDとか指定したのとか。できるけど
ファイル名だけもらっても実際にはファイル作ってるけど。単に作った直後に消してるだけ、まあ問題になりそうにないけど
700が困るのはさっぱりわからんな
0937デフォルトの名無しさん
垢版 |
2020/03/21(土) 11:01:46.98ID:tuOdrSqm
ファイル作らずに(コマンド実行時点で)一意なファイル名が欲しいだけならオプション付きで実行すればいいだけじゃね?
0938933
垢版 |
2020/03/21(土) 11:20:35.77ID:Nklv0DXu
644 はよく見るけど、

700 はよく見るパーミッションじゃないから、困らないのかなと思って
0939デフォルトの名無しさん
垢版 |
2020/03/21(土) 11:48:36.74ID:tuOdrSqm
>>938
見たことあるものを見たことある方法でしか使えないお前は困るかもしれないが、普通の知識や技能のあるlinuxユーザは困らない。
0940デフォルトの名無しさん
垢版 |
2020/03/21(土) 12:21:57.49ID:HMPQgip5
>>937
mktemp内で一度フィルを作って、ファイル名だけくれのオプションだったらそれを消す
ということをしてるだけということね

>>938
644で言えば、6の部分がお前、44はお前じゃない誰か用
700で7がお前なんだから何も困らない、お前じゃない誰かが困るかもだがテンポラリなんてお前しか使わないだろ(700というより600だろ。ファイルでなくてディレクトリなら700だろけど)
0941デフォルトの名無しさん
垢版 |
2020/03/21(土) 12:35:34.94ID:HMPQgip5
00で困るような使い方(他に渡すとか)するにしてもお前のファイルなんだからchmodでも自分でしとけというとこやな
0942デフォルトの名無しさん
垢版 |
2020/03/21(土) 13:00:59.59ID:kuk28tWG
な?言ったとおりだっただろ?
>>938はパーミッションを分かってないだけだって

> 700 はよく見るパーミッションじゃないから、困らないのかなと思って

このパーミッションでOKかどうかっていうのは、
よく見るかどうかで決めるもんじゃないだろ
レビューでこのパーミッションはあまり見かけいないから困るだろ
とか指摘されたらぶっ○したくなるわw
0943デフォルトの名無しさん
垢版 |
2020/03/21(土) 13:06:44.26ID:kuk28tWG
昔ウェブサービスでユニークなファイルを作るべき処理で
オレオレで年月日時分秒とかのファイルにして
アクセス多数で重複ファイルがでてトラブった会社あったなぁw

mktempにファイルを作らせないと
真にユニークな名前なんて作れねーんだよ
もしくは頑張ってmktempと同等のことをするとかな
そのためにはmktempがなぜそうしているかの理由を調べないといけない
0944デフォルトの名無しさん
垢版 |
2020/03/21(土) 13:42:32.99ID:ys6caT0H
うちになんでもかんでもシェルスクリプトでやろうとする人がいるんですが
どうすればやめさせられますか?
GUI以外でシェルスクリプトでこんなことやるなっていうのを具体例付きでを教えて下さい
それを根拠に理論武装してあいつをぶちのめしてきますので
0945デフォルトの名無しさん
垢版 |
2020/03/21(土) 13:55:11.55ID:VWAuyUcc
自分もなんでもかんでもシェルスクリプトでできるような知識を持つことだな
そんな誰か頼りではなくて
なんでもかんでも自分でもできるがしないじゃないとぶちのめせないだろ
0946デフォルトの名無しさん
垢版 |
2020/03/21(土) 14:08:20.00ID:FH3PvP3D
>>944
シェルスクリプトではなくプログラミング言語を使った方がいいケースがこれまでにもあったということだろ。それならそのケースについて他の方法でやった方が良い理由を具体的に説明すればいいんでないの?
0947デフォルトの名無しさん
垢版 |
2020/03/21(土) 14:33:14.95ID:Nklv0DXu
x=x
a=
b=

if [ $a = $b ]; then # 構文エラーw
fi

空文字で構文エラーになるから、下のように双方に、1文字ずつ追加して比べるw
面倒くさい

if [ $a$x = $b$x ]; then
echo $a$x #=> x
fi
0948デフォルトの名無しさん
垢版 |
2020/03/21(土) 17:00:58.81ID:EuPu7JS3
単にシェルでのコマンドに引数を与える時の一般規則
xなどつけるのが嫌なら "で囲めばいいだけだろ
0949デフォルトの名無しさん
垢版 |
2020/03/21(土) 17:17:50.80ID:57M5Xw8A
>>947
[ "$a" = "$b" ]
とすればいいだけ。
ちなみに
a="("
b="("
↑みたいな一見展開されたらヤバそうな記号でも
引用符で囲んでやれば単なる文字列として解釈される。
0951デフォルトの名無しさん
垢版 |
2020/03/21(土) 20:36:22.88ID:57M5Xw8A
>>950
100行以上のシェルスクリプトを書くのはやめとけってことは
1行に1000文字くらい詰めて99行にしたらいいのかな?(難癖)
0952デフォルトの名無しさん
垢版 |
2020/03/21(土) 21:07:17.99ID:9LT6s2kW
# This gives a "too many arguments" error as f* is expanded to the
# contents of the current directory
if [ "filename" == f* ]; then
echo "Match"
fi
とかどういう層向けのなんだろな。なんか上にいるのと同じレベル向けとしか思えない
echo "filename" == f* ]
などとまったく同じなのに、[ ] が何か特別(スクリプト構文?)とでも思ってしまう割と最近始めましたな人用かと思ってしまうな
0954デフォルトの名無しさん
垢版 |
2020/03/22(日) 00:45:59.87ID:7aOor4nW
>>951
100行以上って理由がわからんよね
どんな言語だって1つの関数が100行超えるようならやめるべきだし
超えるなら別関数(別コマンド)にすればいいのはシェルスクリプトでも同じ
0955デフォルトの名無しさん
垢版 |
2020/03/22(日) 05:06:02.12ID:5UlsRo7e
>どんな言語だって1つの関数が100行超えるようならやめるべきだし

これもよくわからんけどなあ
最初に一回だーっと降りてくるだけの処理を
こまこまこまこま関数に分けたがる奴はなんなん?と思う
シェルスクリプトなんか大体そういう処理だけだろ?
0956デフォルトの名無しさん
垢版 |
2020/03/22(日) 05:49:25.01ID:7aOor4nW
>>955
え?シェルスクリプトで外部コマンド使わんの?

最初に一回だーっと降りてくるだけの処理でも
その中の一部を外部コマンドとか関数にするでしょ?
再利用するとか、そこだけ実行できるようにするために。
0957デフォルトの名無しさん
垢版 |
2020/03/22(日) 05:55:46.13ID:7aOor4nW
あと「関数や処理が長くなったら分けるよね」という
技術的な話に対して「分ける」or「分けない」とは無関係な
「俺はシェルスクリプトで長い処理は作らない」という
個人的な話をごちゃまぜにしないでくれ

「分けるよね?」の答えにはなってないから。
0958デフォルトの名無しさん
垢版 |
2020/03/22(日) 07:35:58.24ID:5UlsRo7e
>>956
引用部分をちゃんと読んでくれよ
あんたが書いた文だぞ?

>>957
>「分けるよね?」の答えにはなってないから。

長さじゃ分けない。
0960デフォルトの名無しさん
垢版 |
2020/03/22(日) 09:08:29.58ID:c5TE3idF
>どんな言語だって1つの関数が100行超えるようならやめるべきだし
を何度読んでも、そのとおりとしか?
0961デフォルトの名無しさん
垢版 |
2020/03/22(日) 10:24:47.84ID:I5Su+SV6
GoogleのStyle Guideには100行超えるようなスクリプトを書いてるなら
今すぐもっと構造化された言語で書き直すべきって書いてる

>If you are writing a script that is more than 100 lines long,
>or that uses non-straightforward control flow logic,
>you should rewrite it in a more structured language now.

関数の長さじゃなくスクリプトの長さの話
似てるけど持ってる意味合いが違う
0962デフォルトの名無しさん
垢版 |
2020/03/22(日) 12:56:41.04ID:tFupwLj7
シェルスクリプトも十分構造化されてると思うんだけどねぇ。
まあ,Pythonとかに比べれば,メッソドや継承とかそういう概念が備わってない意味では低級だけど,

「シェルスクリプトで巨大なプログラムを書くべきでない理由」として
「シェルスクリプトは*構造的*でないから」ってのはちょっと頂けない。
シェルスクリプトには構造化プログラミングを支援する機能(函数定義,局所変数)が備わってる以上,
構造化されてないシェルスクリプトがあったならそれは書いた人間の責任であって,
もっと言うとそういうシェルスクリプトを書くような人間は,
Pythonであっても,用意されたオブジェクト指向の機能なんて使わずに,ひたすら手続き的なプログラムを書くだろう。
0963デフォルトの名無しさん
垢版 |
2020/03/22(日) 13:04:15.24ID:c5TE3idF
>>962
そういうことだよね。
シェルスクリプトで書いたそのコードを
他の言語で書いたところで、ロジックが同じなら行数も同じ
0964デフォルトの名無しさん
垢版 |
2020/03/22(日) 14:10:38.21ID:An20OwGu
>>952
懇切丁寧な解説が初心者向けじゃないなら何なのさ
常識しか載ってなくてつまらなかった?
0966デフォルトの名無しさん
垢版 |
2020/03/22(日) 14:32:07.41ID:Hw+To0D5
結論、初心者も視野に大いに入っている規約。ある意味初心者に合わせた
だから、100行についてあれこれ議論してもしょうがないよ、Googleにコード提供するわけでもなし変だと思うならふーんと無視だなw
0967デフォルトの名無しさん
垢版 |
2020/03/22(日) 15:21:02.01ID:I5Su+SV6
>>962
同じロジックでも行数は全然違ってくるよ
shやbashには型がないのと原始的エラーハンドリング機構しかないのが大きい

他にも高階関数がまともに書けないし
一般的な言語に用意されてる便利メソッドもないし
モジュール化機能も関数とファイル以外に無い

読みやすさ、メンテしやすさ、テストのしやすさの点から
シェルスクリプトの限界を認識して節度を持って使おうねってのが
Googleのガイドの意図だと思う
0969デフォルトの名無しさん
垢版 |
2020/03/22(日) 15:48:56.43ID:c5TE3idF
>>967
型がないのは他にも有るだろ
エラーハンドリングも例外がない言語はいくらでもある
高階関数はevalで関数をよびだすことができるので同等のことは出来る
メソッドはオブジェクト指向じゃないから関数として
外部コマンド=シェルスクリプトの関数なんだからたくさんある
モジュール化機能って関数とファイル以外に何が必要なんだ?

> シェルスクリプトの限界を認識して
その限界の理由がはっきり書かれてない。

読みやすさが悪い、メンテしやすさが悪い、テストのしやすさが悪い
という"結論"を言ってるが理由がない
0970デフォルトの名無しさん
垢版 |
2020/03/22(日) 16:56:26.48ID:I5Su+SV6
>>969
>型がないのは他にも有るだろ
例えば?

>エラーハンドリングも例外がない言語はいくらでもある
最近の言語で例外もパターンマッチもないのはGoくらい
Goはそれもあって同じことする場合でも他言語よりも行数が多くなりがち
それでも型と多重代入があるからシェルスクリプトよりはマシ

>高階関数はevalで関数をよびだすことができるので同等のことは出来る
それがまともに書けるという認識なら何を言っても無駄っぽいね
どうぞシェルスクリプトで頑張ってください
0971デフォルトの名無しさん
垢版 |
2020/03/22(日) 17:17:48.98ID:I7uR5y3I
>>969
機能がある/ない、できる/できないの2択の話でなくて、規模が大きくなったり構造が複雑になったらそれに適した使いやすい言語を使うと良いというだけの話だろうに。
0972デフォルトの名無しさん
垢版 |
2020/03/22(日) 17:52:07.84ID:9SijoV71
シェルスクリプトの可読性・保守性について問題ないと思ってる人ってシェルスクリプト以外でコード書いてないのだろうとしか思えない
0974デフォルトの名無しさん
垢版 |
2020/03/22(日) 22:29:55.52ID:c5TE3idF
>>970
> 例えば?
Perl

> 最近の言語で
いきなり言い訳から入るスタンスかw C言語もないですよね

> それがまともに書けるという認識なら
反論できてないじゃんw

>>971
そこに行数は関係ないよね。やってることが同じなら他の言語に変えても同じこと
0975デフォルトの名無しさん
垢版 |
2020/03/22(日) 22:31:28.16ID:c5TE3idF
>>972
言語で何かが標準サポートされないと
可読性や保守性を保てないんでしょ?

可読性や保守性なんて言語関係ないのに
自分に能力がない理由を言語のせいにするな
0976デフォルトの名無しさん
垢版 |
2020/03/22(日) 23:46:42.00ID:I5Su+SV6
>>974
>Perl
Perlには型あるよ
型の有無も分からないレベルなら比較しても意味ないから
もう少しプログラミング言語を勉強してから出直してくれ
0977デフォルトの名無しさん
垢版 |
2020/03/23(月) 00:00:17.14ID:FfORFm5F
>>976
配列とか数値なら、シェルスクリプトにもありますよw

man basnより

declare [-aAfFgilrtux] [-p] [name[=value] ...]
-a 各 name は配列変数です (前述の 配列 を参照)。
-A 各 name は連想配列変数です (前述の 配列 を参照)。
-i 変数を整数として扱います。
0982デフォルトの名無しさん
垢版 |
2020/03/23(月) 10:39:17.98ID:iyDg9ARV
>>977
>配列とか数値なら、シェルスクリプトにもありますよw

型がどういうものか何も知らないんだな
マジでもう少し勉強したほうがいいよ

結局シェルスクリプトしかできなくて他の言語使えと言われると困るから
「シェルスクリプトでもできるもん」て必死に言い訳してるだけ
VBAしかできないVBAerと同じで完全に老害だぞ
0983デフォルトの名無しさん
垢版 |
2020/03/23(月) 10:58:57.53ID:pXU5nyzo
あくまで「効率的に」できるかどうかの話をしているはずなのになぜか言語仕様上できるかで語るからおかしなことになる
0984デフォルトの名無しさん
垢版 |
2020/03/23(月) 12:00:16.76ID:nemSJghh
「(俺はシェルスクリプトしか書けないから)シェルスクリプトで書くのがもっとも効率的だ」
0985デフォルトの名無しさん
垢版 |
2020/03/23(月) 12:53:13.68ID:SU+/TFOc
>>982
ある言語に型がある、って、どういう挙動をしたらそう言えるの?
Bashでは事実「これは整数だよ」と(少なくともプログラマに対して)そう言えるんだけど、それじゃだめなの?
逆にPythonは変数宣言する時に型を明示しなくてもいいけど
一般に「型を持つ」って言われるよね。
0987デフォルトの名無しさん
垢版 |
2020/03/23(月) 13:17:16.43ID:xNveXtQI
比較検討の対象範囲が狭い人が堕ちる地獄だね
傍から見ると、視認可能な穴に自ら飛び込んでいるように映る
0988デフォルトの名無しさん
垢版 |
2020/03/23(月) 13:55:21.04ID:1yvBsEB/
>>982
声が震えてるぞw

知らないんだな(くっ何も言い返せない)
捨て台詞かよwww
自称知ってるお前さん、ちゃんと説明してみぃ?
0989デフォルトの名無しさん
垢版 |
2020/03/23(月) 13:56:23.56ID:1yvBsEB/
>>983
効率的に出来なかったら何がだめなのか?
今の話に「効率」がどう関係するのか?
説明は?
0990デフォルトの名無しさん
垢版 |
2020/03/23(月) 14:38:42.12ID:OwPrjqjt
>>932
> 型がどういうものか何も知らないんだな
> マジでもう少し勉強したほうがいいよ

説明なしに相手をディスるだけのレスはやめとけ
マウント取れないし、捨て台詞的で負けを認めたと取られかねない
仮にマウント取れても所詮匿名の掲示板なんで dat 落ちすればそれまで


>>989
> 今の話に「効率」がどう関係するのか?

話の発端は「もっと構造化された言語で書き直すべき」でしょ?
揚げ足取りするなとは言わんが本題を忘れるほど熱中すんな
0991デフォルトの名無しさん
垢版 |
2020/03/23(月) 14:41:24.44ID:cOy+SXou
>>990
シェルスクリプトが得意な分野
(コマンドの組み合わせで行う処理)は
シェルスクリプトが一番効率がいいんですよ。

他の言語で同じことを書いたら行数が増えます。
例えばsed
0993デフォルトの名無しさん
垢版 |
2020/03/23(月) 17:22:17.80ID:gNyotYW5
>>982
予め断っておくが,
俺自身は「シェルスクリプトは万能」だなんて思ってない。
でも,プログラミング言語においてどういうものを「型」といって
どういうものを「型」と言わないのかを知りたい。
少なくともBashのdeclare組み込みコマンドには型機能が備わってるように見えるんだけど……
https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-declare
例えば「整数」として取り扱う場合には算術演算が記述できる,空だけど配列変数として指定できる,
みたいな機能って,「型」って言わないの?
0994デフォルトの名無しさん
垢版 |
2020/03/24(火) 01:28:15.59ID:dWYBHKWQ
>>947
それ、スペースの入り方によってはうまくいかんよね。
やっぱ普通にダブルクォーテーションで括った方が良いのでは?
0995デフォルトの名無しさん
垢版 |
2020/03/24(火) 22:04:54.75ID:/ZNMWK8v
シェルスクリプトで完結することはシェルスクリプトでやったほうがいいと思うわ。
プログラミング言語みたいにいちいち環境を構築しなくていいからね。
0996デフォルトの名無しさん
垢版 |
2020/03/25(水) 08:34:13.83ID:OJUUwfHr
>>991
sed楽だなー
改行も当然消せるよな、あれ、なんか面倒くせーぞ
そういう時はtr使うのか、なーんだよ
みたいな事がよくある
0998デフォルトの名無しさん
垢版 |
2020/03/25(水) 09:59:10.25ID:C+CVbv8A
>>997
シェルスクリプトでコードが大きくなったら別言語でやる
というのは、単にシェルスクリプトをちゃんと勉強してないからだと思う

もともとシェルスクリプトでは実装が難しい問題であれば
最初からシェルスクリプトは使わない。例えばバイナリファイルとして
特定の位置のデータを読み書きするとか

でも最初にシェルスクリプトでやろうと思った時は、
シェルスクリプトでやるのが適した問題だったのだろう。
その後、やっぱり他の言語で〜って言い出す時は、
シェルスクリプトで作る能力がないことの言い訳だと思う
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 152日 10時間 16分 29秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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