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

■ このスレッドは過去ログ倉庫に格納されています
2020/03/23(月) 01:12:30.31ID:TYte82vJ
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
2020/08/05(水) 16:06:44.71ID:RWwgydsE
>>743
知らんがな。
未対応なものがあったとしても、カーネルにもOSにも関係ない。
2020/08/05(水) 16:21:27.81ID:L2ar51Hq
カーネルやOSで"対応していない"から
ソフト側で対応するしかなくなって
結果対応してるソフトが大幅に減ってる
2020/08/05(水) 16:33:14.08ID:RWwgydsE
>>747
カーネルやOSは、文字コードを限定していない。
アプリはアプリなので、まったく別の話。
2020/08/05(水) 19:47:59.44ID:L2ar51Hq
>>748
Linuxはそうだね。だからLinuxはSJIS等に対応していない。
WindowsはOSがAPIを提供している。
2020/08/05(水) 19:57:21.12ID:Mw508nfj
>>749
glibc
2020/08/05(水) 20:01:03.00ID:L2ar51Hq
glibcはC言語用ライブラリに過ぎない
2020/08/05(水) 20:02:17.75ID:M377peH6
ここ一生文字コードの話してんな…
2020/08/05(水) 20:29:25.50ID:RWwgydsE
>>749
抽象度の高い数学は、現実の物理の計算に対応してないってことだな。w
また、Windowsの多くのAPIは、DLLで提供されてるただの関数でしかない。

まあ、もうええ。
2020/08/05(水) 20:30:18.97ID:RWwgydsE
>>752
文字コードの話は鬼門だからね。。。
2020/08/05(水) 20:32:14.77ID:xVHqlCRp
キチガイは無意味なことに異常に拘るからな
2020/08/05(水) 20:39:40.85ID:L2ar51Hq
>>753
> また、Windowsの多くのAPIは、DLLで提供されてるただの関数でしかない。

それをいうなら、
Windowsの多くのAPIは、OSで提供されてるただの関数でしかない。
だろ?

今はOSが対応しているかどうかの話をしてるんだから
2020/08/05(水) 21:05:44.83ID:Mw508nfj
もうなんでもありやな。
Windowsってスゲー!w
2020/08/05(水) 21:07:02.99ID:Mw508nfj
いやある意味マジで凄い,とも言えるな。
Linuxだと集客力がなさすぎて,ある程度論理的思考ができる人間しか寄せ付けないけれど,
Windowsには(謎の)集客性があるから,[検閲されました]。
2020/08/05(水) 21:12:27.34ID:L2ar51Hq
> [検閲されました]。

これ面白いと思って書いてんの?
2020/08/05(水) 21:30:49.87ID:xVHqlCRp
>>758
>>683,685,686
で、終わってる話だな。都合が悪くなったら訂正できずに話を逸らして持論を喚いてるだけの
論理的なんてあるわけがない。異常な執着さだけだな
2020/08/05(水) 22:59:53.29ID:ilbg2XF8
日本語の設定表記ってjaなのかJPなのか分からなくなるわ
2020/08/05(水) 23:11:03.71ID:Mw508nfj
>>761
「日本語」がja
「日本国」がJP
2020/08/06(木) 00:08:14.61ID:pS9zPYMv
ja_JP
en_US

この2つが頭に入ったらどっちがどっちか迷うことはなくなったな。
「US」が絶対に「国」だから。w
764デフォルトの名無しさん
垢版 |
2020/08/06(木) 04:06:10.65ID:cHZDAcP7
>>685
んなもんシェルがlocale対応してないだけの問題じゃん。
2020/08/06(木) 06:19:58.08ID:hlsSANZk
ではシェルがlocaleに対応していたらSJIS対応になるのだろうか?
もちろん違う。なぜならlocaleがSJISに対応してないからだ
2020/08/06(木) 08:08:10.25ID:v5q+3Q4z
結局最初の質問に対する答えとしては,
いまどきのマトモなOSは,
端末上の文字表示に既定でUTF-8を採用していて,
その場合はコマンド名に非ASCII文字を用いても問題は生じない。
でいいのかな?
2020/08/06(木) 08:15:03.38ID:hlsSANZk
>>766
「端末上の文字表示に既定でUTF-8を採用しているものを
まともなOSという定義にしたい」というお前の願望やろ?w
2020/08/06(木) 09:06:38.59ID:hTdGagRd
× localeがSJISに対応してないから
○ シェルのlocale対応が中途半端だから
2020/08/06(木) 09:09:57.95ID:mDao40Cq
>>766
そう考えて差し支えないし、大抵はロケール対応してるから他の文字コードでも同様に非ASCII利用可(SJISも可)
2020/08/06(木) 10:08:45.34ID:9YoRhsMg
そういえば、昔のCygwin、output-metaがoffだったな
2020/08/06(木) 11:58:34.79ID:RYGFOdbJ
シェルはOSの一部。WindowsのシェルもOSの一部
2020/08/06(木) 12:36:15.57ID:v5q+3Q4z
荒しは黙ってNG
2020/08/06(木) 13:00:47.50ID:Dywe59yG
メガネは身体の一部。
2020/08/06(木) 13:07:28.07ID:RYGFOdbJ
>>773
体を手に入れたらメガネが付いてるわけじゃないからなぁw
2020/08/06(木) 13:31:59.57ID:9YoRhsMg
メガネは顔の一部です♪
2020/08/06(木) 16:26:05.72ID:v5q+3Q4z
メガネは顔の一部じゃない あなたは私のすべてじゃない
2020/08/10(月) 16:59:38.66ID:BcFTAJq0
zshって:コマンドが遅いと思ったら、:という名前の関数を定義できるから
何もしないコマンドではなく関数呼び出しのようになってるんだろうな
めんどくさいね
778デフォルトの名無しさん
垢版 |
2020/08/10(月) 17:59:39.62ID:IQ3fIsH1
絵文字→数値文字参照に変換したいんだけどシェルだけじゃ無理?
たとえば「😀」であったら「&# 128512;」みたいな
nkfで数値文字参照→絵文字の逆パターンはできるっぽいけど
2020/08/10(月) 18:12:59.63ID:jBTjAApo
printf '&#%d;' \'
2020/08/10(月) 18:18:15.92ID:BcFTAJq0
>778
できるよ

#!/bin/bash
unk="??" # ← うんこの絵文字
printf '%x' "'$unk" # 1f4a9

ただしbashのようにUnicode対応してるシェルじゃないと駄目
dashのように対応してないシェルだと1バイトずつの処理になるからから
UTF-8 → コードポイントへの変換処理を自前でやる必要がある

あと文字ではなく文字列の場合は1文字ずつループする必要があるね
これもbashだったら簡単だけど、dashとかだと苦労する。
dash等の場合パフォーマンスの点からodコマンドで
8進数化して処理したほうが速いかもしれない
どちらにしろまあ手間がかかる
2020/08/10(月) 18:25:22.89ID:HYtJuMAc
こんにちは

PowerShellだと自作のhoge.ps1ファイルを実行すれば
hoge.ps1に定義していた関数が使えるようになりますが

Macで同じように自作のpiyo.shに書いて,ターミナルから実行して,
piyo.shに定義していた関数をその後も有効にすることはできないでしょうか

PowerShellと同じ感覚でtest.shに

#!/bin/bash
function hello(){
echo "Hello, World!
}

と書いて実行したら,ターミナル上でその後も関数helloが有効になると思っていたのですが・・・
初心者(今日からはじめました)のでなにもわかってないと思いますが
782デフォルトの名無しさん
垢版 |
2020/08/10(月) 18:27:22.34ID:IQ3fIsH1
>>779
>>780
おお、できた!
printfで完結するんだね
メインのシェルはbashだから大丈夫
ありがとう!
2020/08/10(月) 18:31:59.86ID:BcFTAJq0
>>781
source(または . コマンド)で読み込む

シェルスクリプトを「実行」した場合は
新たにプロセスが作られて実行される。

今使ってるシェルでつかえるようにするには
現在のシェルに読み込まなくてはいけない
それがsourceコマンド

でもまあ個人的には外部シェルスクリプトにするほうが
便利な気もするけどな
2020/08/10(月) 18:36:45.96ID:HYtJuMAc
ありがとうございました!
2020/08/10(月) 18:36:55.03ID:BcFTAJq0
printf '%x' "'$unk" # 1f4a9

ところでこの シングルクォート を頭につけるって
仕様どこのバカが考えたんだろうな?
このせいで最初の一文字しか変換できず
文字列を文字コードにすることができなくなってる

フォーマット書式を拡張して、例えばこんなふうにしていれば
文字列を全体を変換するとかできただろうに。今からでも遅くはないが
printf '%@x' "$unk"
2020/08/10(月) 18:49:27.63ID:BcFTAJq0
ちゃんとテストしてないけど、文字列全部をコードポイントにする方法

while [ "$str" ]; do
 printf '%x ' "'$str"
 str=${str#?} # 頭一文字を削除
done

多分動くと思うけどprintfを文字の数だけ実行しないといけないのがダサい(遅い)
bashだったら、頭から文字を削らなくても ${str:N:1} でできるはず
どちらにしろprintfの実行回数は減らせないが

ここから絵文字のみをコードポイントにするには
コードポイントの判定が必要になるので・・・
codepoint=$(printf '%x' "'$str")
これはサブシェル使ってるから更に遅くなる(ため息)
パイプ使って処理するのがまだましかねぇ

while [ "$str" ]; do
 printf '%x\n' "'$str"
 str=${str#?} # 頭一文字を削除
done | while IFS= read -r codepoint; do
 # そのまま出力するか、実体参照で出力するか判定して切り分ける
done

めんどくせーなw
2020/08/10(月) 19:09:20.89ID:t4rZM551
だったらPerlを使えば。
2020/08/10(月) 19:10:29.77ID:BcFTAJq0
>>787
そのネタは飽きた
2020/08/10(月) 20:01:35.10ID:jBTjAApo
いつものRubyおじさんは盆休みか
2020/08/10(月) 21:47:25.96ID:H4x6U7o8
そういう場合はバラすコマンドを書くんだよ
printfなんて引数が書式から溢れたら繰り返すという独特の仕様なんだし
2020/08/10(月) 22:04:46.97ID:wrD0HyDw
>>790
そうすると今度は引数が多すぎますってなるんだよな
また全てを実体参照にしないなら、書式も動的に組み立てる必要がある
一体どのアルゴリズムが一番速いのか?
なかなかうまく行かないもんだよね
2020/08/10(月) 23:58:47.58ID:t4rZM551
>>791
行にばらしてから、xargsでまとめればなんとか?

なお、速さを心配するならPerlで!
2020/08/11(火) 06:27:29.80ID:imudTDmO
👨‍👨‍👧‍👧
2020/08/11(火) 14:02:41.21ID:oiMKju9F
>>782
一応純POSIXでもできる。
https://gist.github.com/cmplstofB/0b0ce2bf052b3bb64d091fc83504fc32#file-u8dec-sh
2020/08/11(火) 15:00:36.80ID:6EF+liXG
>>794
シェルつーか、sedやな。w
2020/08/11(火) 17:50:39.44ID:K2Zt4r5r
printfもシェルつーかprintfコマンドやな。という言い方もできる
ほとんどはprintfはビルトインコマンドだからシェルの一部と言えるが
なんとmkshではビルトインではないのだ
だからprintfを多用するとmkshでは遅くなる
2020/08/11(火) 18:15:17.47ID:lw0B26+i
速度速度言うなら...w
まあ、マジでそう思わないこともない
2020/08/11(火) 18:20:09.85ID:K2Zt4r5r
言語(ツール)を選ぶ理由は速度が第一じゃないからね

なにか理由があって言語(ツール)を選ぶ
その上で(極端に)遅くなる場合ってのは
知っておいたほうがいい

無知で極端に遅くしておいて、自分が悪いのに
言語(ツール)のせいにするのは愚か者
2020/08/11(火) 22:40:08.94ID:wY/KrlTt
一人で妄想して馬鹿にしてる感じ、誰のことを言っているのだが
2020/08/11(火) 22:47:03.84ID:ZSHW8utc
誰も聞いてないことをで自己満してる
承認欲求が激しいんだろうな
2020/08/12(水) 00:31:12.05ID:EZbfglBp
外部コマンドをビルトイン化できるらしいがどんな用途で使うんだ
日頃使ってるechoは速度重視だからシェルに内蔵してるってのは分かるが
2020/08/12(水) 01:05:34.01ID:IJKCUlyt
>>801
細かい用途はいくつか思いつくし、思いついてるだろうけど
使うか?って聞かれたら使わないだろうなって思うものばかりだよ
2020/08/12(水) 06:01:38.86ID:IJKCUlyt
lessコマンドひでぇw

-? -# -~ -" とかいうオプションがあるw
2020/08/12(水) 11:54:29.64ID:dh92Tz6A
.shファイルの実行はずっと脳死で「sh test.sh」とかでやってたけどそれだとPOSIXの関係で目的通り動いてくれないコマンドもあるのか
ログイン時のデフォルトシェルがbashでもshで叩いてしまうと意味がないと
これからは「bash test.sh」 とかでやるようにするけどshで叩く癖が抜けるまでしばらくかかりそう…
2020/08/12(水) 12:35:47.57ID:RMBTHnXK
>>804
chmod +xして#!をちゃんと書いたら?
わざわざshやらbashやらから打ち込まなくても。
2020/08/12(水) 13:23:38.06ID:dh92Tz6A
>>805
実行権ってそんな便利なことができるのか
今までよく分からなかったからスルーしてたorz
#!もちゃんと書いてshとか抜きで無事実行できました
ありがとう
2020/08/12(水) 15:14:39.87ID:obuPMR8V
スレチでしたら申し訳ないです
どこで質問したらいいのか分かりませんでした

curlで取得したhtmlソースからページのタイトルを取得したいです

curl "https://ja.wikipedia.org/wiki/"; | nkf -w | grep -oP '(?<=<title>)(.+)(?=</title>)'

こんな感じで<title>タグに挟まれた文字列を正規表現で抽出すればできそうなのですが、wiki等の一部サイトではgrepで抽出できません
googleやyahooはできました

文字コードがShift-JISなのが問題だと思いますがnkfで変換してあるのになぜできないのかわかりません

どうすれば抽出できますか?
2020/08/12(水) 15:43:49.03ID:bbgn0zyb
curl -Ls 'https://ja.wikipedia.org/wiki/' | ...

で良いんじゃない
2020/08/12(水) 16:10:52.81ID:HozojyCs
pup使うとCSSセレクター使えるから簡単だよ

curl -Ls "https://ja.wikipedia.org/wiki/"; | pup ‘title text{}’
810デフォルトの名無しさん
垢版 |
2020/08/12(水) 18:12:06.06ID:6RKl90uC
ファイル名が「20200812.txt」と、日付が入っているとします。
7日前の古いファイルを削除したいと思い、

oldfile=`date -d "7 day ago" +'%Y%m%d'`
rm -f /home/test/public_html/$oldfile.txt

としたのですが、「20200805.txt」が削除されません。

oldfile=20200805
rm -f /home/test/public_html/$oldfile.txt

というように直接日付を書けば削除されます。
何が原因でしょうか?(パーミッションは問題ないです)
811デフォルトの名無しさん
垢版 |
2020/08/12(水) 18:17:55.09ID:hhSLRkul
$oldfileの中身確認した時点でわかるだろ・・
2020/08/12(水) 18:20:34.06ID:6RKl90uC
echo `date -d "7 day ago" +'%Y%m%d'`
というコマンドを実行すると、「20200805」となります。
なので、$oldfileに代入されていると思うのですが、
なぜかシェルスクリプトからは実行されない?みたいです。
なので、書き方が悪いと思っているのですが・・・
2020/08/12(水) 18:27:02.02ID:RMBTHnXK
>>810
olddateは正しいとして。

パーミッションは本当に適切か?
そのファイルまでのディレクトリは全部見えるか?
親ディレクトリにwは付いてるか?

ユーザーは違わないか?
もしcronなどから実行してたら、実際のユーザーが違うかも?
2020/08/12(水) 18:37:18.23ID:6RKl90uC
>>813
>>810の、下の書き方(日付を直接書く)場合だと削除されるので、
パーミッションやらユーザーやらは正しいと思います。
2020/08/12(水) 18:57:36.02ID:o8GAAC7N
共に、
echo rm -f /home/test/public_html/$oldfile.txt

echo rm -f /home/test/public_html/$oldfile.txt | od
で出して同じか見てみ。違うんだろうとしか思えんけど
2020/08/12(水) 20:47:24.78ID:RMBTHnXK
そもそも、エラーメッセージは出てないんか?
パスがないとかパーミッションがないとか。
2020/08/12(水) 21:57:38.22ID:obuPMR8V
>>808
>>809
Lオプションでできました
pupの情報もありがとうございます
2020/08/13(木) 05:33:16.94ID:b3k2BUbg
oldfile=`date -d "7 day ago" +'%Y%m%d'`
echo $oldfile
20200806

# -x は、16進数。big endian で表示する
echo $oldfile | od -x --endian=big
3230 3230 3038 3036 0a00

0a00 が入っている!
2020/08/13(木) 05:43:37.21ID:b3k2BUbg
>>807
Ruby なら、静的なページを、Nokogiri で、スクレイピングできる。
ただし、Ajax を使う動的なページは、sleep するか、Selenium Webdriver を使う

require 'nokogiri'

html = `curl http://www.example.com/`

doc = Nokogiri::HTML( html )

elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
2020/08/13(木) 05:48:49.75ID:AjBI18lb
0a 付けてるのは echo
-x
16 進 short として出力する。 -t x2 と等価。
short として出力するためにpaddingとしての 00
echo 20200806 | od -x --endian=big
しても同じだろうが
2020/08/13(木) 05:54:05.59ID:AjBI18lb
>>819
>>809と違いはなさげ。pupというのを新しく入れるのが障壁でないようだし
他人にシェルスクリプトのスレでRubyを勧めるぐらいなら、お前は基本的なことを勉強するのが先だw
822818
垢版 |
2020/08/13(木) 07:27:56.07ID:b3k2BUbg
漏れは、Windows 10, WSL, Ubuntu 18.04 だけど、

which pup
無し

apt-cache show pup
パッケージ pup が見つかりません

oldfile=`date -d "7 day ago" +'%Y%m%d'`

echo $oldfile | od -x --endian=big
3230 3230 3038 3036 0a00

echo $oldfile.txt | od -x --endian=big
3230 3230 3038 3036 2e74 7874 0a00

確かに、0a00 は、echo が付けているだけだった
2020/08/13(木) 08:14:35.56ID:r+Myq/6D
> rm -f /home/test/public_html/$oldfile.txt
>
> としたのですが、「20200805.txt」が削除されません。

-f つけなければなにかわかるだろ
2020/08/13(木) 10:30:46.90ID:u1yLpjcC
>>810
上の方法でもこっちでは成功したから、
なんか全く別の所でひっかかってる気がするんだけど
とりあえず
rm ~/"public_html/$(date -d '7 days ago' +'%Y%m%d')"
こうしてみて。
2020/08/13(木) 11:03:45.75ID:HLH3bdVq
>>823
エラーがなくなるだけだろ。
2020/08/13(木) 11:07:31.64ID:i+RlWr/H
>>825
そう考えてるなら理解力がない
827810
垢版 |
2020/08/13(木) 11:42:16.52ID:1yPigLiW
>>810です。みなさん色々ありがとうございます。
原因はわかりませんが、以下のコマンドで削除されました!

oldfile=`date -v-7d +"%Y%m%d"`
rm -f /home/test/public_html/$oldfile.txt

サーバーはFreeBSDなのですが、
サーバー的な問題があったのかもしれません
2020/08/13(木) 12:20:55.98ID:i+RlWr/H
ほらみろ-fをなくしたらわかる話だっただろうが
2020/08/13(木) 16:42:10.47ID:UJyiXERu
>>822
パッケージに無くても入れらるんだぞ。パッケージになないようだけどな

>確かに、0a00 は、echo が付けているだけだった
0a な。 00 を付けてるといえば付けてるのは od な
2020/08/13(木) 19:04:38.45ID:/leUQEag
while ここでbreak使うのはOkなのだろうか?; do
:
done
2020/08/15(土) 08:39:14.46ID:Ob8esEzA
継続行の後にコメントってかけないの?
2020/08/15(土) 13:15:03.53ID:sQULdK+x
書けたとしても書かない方がいいだろうな
可読性が下がるから
2020/08/15(土) 17:32:34.73ID:ODJGcA2C
>>831
書けるんじゃないの?
2020/08/15(土) 19:07:09.82ID:Ob8esEzA
え?どうやって?

foo \ # comment
foo # commnet \

どっちも無理なんだけど?
2020/08/15(土) 20:54:12.94ID:ODJGcA2C
>>834
前者は継続行ではなくエスケープ。
後者は、その次に続く。
2020/08/15(土) 22:14:34.07ID:Ob8esEzA
>>835
そんなことは聞いてないよ
2020/08/15(土) 22:15:49.30ID:/M/D7F5G
printf “―-こんにちわ―-“

みたくprintfにハイフンから始まる文字列を出力させようとするとエラー出るんですけどどうにかならいですかね?
echo使えば解決ですけど
2020/08/15(土) 22:17:46.31ID:Ob8esEzA
print '%s'
2020/08/15(土) 22:19:39.71ID:qj/CORtd
>>837
printf -- “―-こんにちわ―-“
2020/08/15(土) 22:23:58.73ID:/M/D7F5G
>>838
>>839
おー、これでできました
ありがとうございます!
2020/08/15(土) 22:33:10.73ID:ODJGcA2C
>>836
じゃあ継続行を勘違いしてるんやろ。
2020/08/15(土) 23:01:28.72ID:Ob8esEzA
>>841
すみませんが、質問内容は最初に書いたとおり
「継続行の後にコメントってかけないの?」です
2020/08/15(土) 23:36:06.37ID:8MGPAd1y
以下のようなヒアドキュメントを使用して、sshコマンドで複数コマンドの出力結果をすべてファイルに出力したい場合、どのようにしたら可能でしょうか?

ssh -t -t ユーザ@IP <<EOC
 コマンド1
 コマンド2
 コマンド3
 exit
EOC

ちょっと試す環境が無いのですが、以下のように1行目をリダイレクトすれば可能でしょうか?
ssh -t -t ユーザ@IP <<EOC >>出力ファイル
2020/08/16(日) 00:19:03.11ID:YKxJCnVG
>>842
commandline \
# 継続行の後。

書けるやろ。
ほかの解釈があるか?
2020/08/16(日) 00:19:53.88ID:YKxJCnVG
>>843
環境がないのになぜ聞く?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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