探検


シェルスクリプト質問スレ

2019/04/12(金) 20:22:09.78ID:ga+nyK60
シェルスクリプトに関する質問スレです。
2login:Penguin
垢版 |
2019/04/13(土) 08:00:52.24ID:mHs4A1+v
宿題は自力でやること
2019/10/27(日) 23:06:44.49ID:Q9HmdE9E
質問お願いしましす。

リモートで最新の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)

うまくいくようにアドバイスなどいただけるとうれしいです。
女子高生です。
4login:Penguin
垢版 |
2019/10/27(日) 23:07:33.30ID:Q9HmdE9E
上げさせてください。
2019/10/27(日) 23:37:34.99ID:KbsZ4Niq
こっちでやれ
シェルスクリプト総合 その32
https://mevius.5ch.net/test/read.cgi/tech/1571929725/
6login:Penguin
垢版 |
2019/10/28(月) 12:28:06.90ID:GFu2H5Oy
>>3
>質問お願いしましす。

お願いされても...特に質問はありません
2019/10/28(月) 15:42:25.73ID:p0ChFQHF
>>6
もげろ!
2019/10/29(火) 02:44:55.55ID:CaAjlyZm
お願いされたから反応したのに、もげろってどういうことよ
9login:Penguin
垢版 |
2020/04/17(金) 21:01:57.77ID:ueg9oyq0
ビデオ(Totem)で曲4つをループして聴くシェルスクリプトを作ったのですが、1曲目だけで終わってしまいます。
以下ソースです

#!/bin/bash
while true
do
/usr/bin/totem /home/hiromitsu/ミュージック/music/album1/無題のフォルダー/WinterSong.ogg ;
/usr/bin/totem /home/hiromitsu/ミュージック/music/album1/無題のフォルダー/世界中の誰よりきっと.mp3 ;
/usr/bin/totem /home/hiromitsu/ミュージック/music/album1/無題のフォルダー/サイレント・イヴ.ogg ;
/usr/bin/totem /home/hiromitsu/ミュージック/music/album1/無題のフォルダー/Itsuka no Merry Christmas.mp3
done
どこがいけないんでしょうか・・・?
2020/04/18(土) 02:06:12.81ID:jLP8+C0w
日本語のパス・ファイル名は、使えるの?
.ogg/.mp3 も、両方とも使えるの?

それと、あちこちに、echo `date`
を入れて、時刻を見た方がよい

do
echo `date`
/usr/bin/totem 何々

echo `date`
/usr/bin/totem 何々

echo `date`
done
2020/09/25(金) 17:01:00.14ID:rcXzyqi8
#cat test.sh
line=aaa,bbb,ccc
arr=($(IFS=,; echo $line))
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

#sh test.sh
aaa
bbb
ccc

と期待通りを結果を得られるのですが、これを

# line=aaa,bbb,ccc
# arr=($(IFS=,; echo $line))
# echo ${arr[0]}
aaa bbb ccc
# echo ${arr[1]}

# echo ${arr[2]}

#

と1行ずつTeratermに張り付けて実行すると期待する結果を得られません。
なにが違うのでしょうか。
12login:Penguin
垢版 |
2020/11/28(土) 15:04:57.14ID:MDlmtOMg
bash(1)にはgotoという文言は見えないが、gotoに類した命令ある?
2020/11/28(土) 15:46:36.13ID:MhK0ESFR
そういやシェルスクリプトにgotoがないっていうのは
シェルスクリプト(のオリジナル)が作られた時期から見て
先見の明を持ってるんじゃねーか?
当時の言語はgotoはあって当然だったと思うんだが
2020/11/28(土) 16:07:55.28ID:YtZOOFJV
シェルスクリプトは完全逐次処理やろ。
gotoを実装するのはかなり難しいと思うが。
先見の明よりも、たんに面倒だったのでは。
15login:Penguin
垢版 |
2020/11/28(土) 20:19:08.21ID:e4eFQGLq
逐次処理って、DOSのBATファイルじゃあるまいし。
つか、BATにすらGOTOあるのに。
2020/11/28(土) 21:21:02.92ID:H/pve6/s
gotoなんてラベルの場所に飛ぶだけじゃん
2020/12/04(金) 02:23:12.31ID:mk+BcjcR
また先頭から読み直すの?
当時のメモリの量を知らないわけでもあるまいに
18login:Penguin
垢版 |
2020/12/04(金) 02:40:48.92ID:PAEzIreY
>>17 の意味を、誰か説明してくれ。
2020/12/04(金) 13:13:09.69ID:ywaWilQb
メモリは使ったら無くなるんですよ?
再起動しなければどんどん減っていきます。

と言ってるんだろ
2020/12/04(金) 23:02:19.60ID:mk+BcjcR
大容量16KBのメモリしかないシステムでgotoを実現しようと思ったら
スクリプトファイルを読み直す以外の対応はできないだろ
その間にファイルが書き換わっていたらどうすんの?
とか考えもせずに簡単とか言い出すようなバカには理解できなかったか
2020/12/04(金) 23:14:30.81ID:+G9n1HNW
gotoなんてアセンブラで2〜4バイト程度で実現できるやろ
16KBなんて広大だ
2020/12/04(金) 23:32:43.90ID:29P9oGAn
>>21
お花畑で裏山。w
2020/12/05(土) 02:05:42.72ID:Ts+UhpZc
MSXは16KBの機種もあってgotoがあるBASIC搭載ですが
スクリプト?読み直す?何を言ってるんでしょうか?
2020/12/05(土) 02:27:41.94ID:aPsfjGiM
スクリプトスレで「スクリプト?」とか言い出すようなお爺ちゃんは黙っててくれよ
25login:Penguin
垢版 |
2020/12/05(土) 03:09:07.89ID:s8sjtagm
>>20
だから何が言いたいんだ?
例えば、大容量640KBのメモリしかないDOSのBATファイルならスクリプトファイルを読み直してるんだろ。動作中にファイルが書き換わってたら、変わったように動作するんだから。
そんなの実現方法の一つに過ぎんだろ。
2020/12/05(土) 04:50:25.04ID:aPsfjGiM
>>25
君みたいながさつな人間にはそんな仕様で問題ないのかもしれんが
sh作った人はそうじゃなかったってことだよ
2020/12/05(土) 09:01:53.70ID:Ts+UhpZc
>>25
お前はバッチファイル特有の話をしただけだったってことが真相かw
28login:Penguin
垢版 |
2020/12/05(土) 10:16:37.06ID:s8sjtagm
>>26
sh作った人の志向であったというなら、ハナからそう言えばいい。
小メモリだとGOTOを実装できないなどという、知ったかぶりにも満たない妄言は要らない。
2020/12/05(土) 22:26:18.30ID:gKsDqE5D
>>28
とりあえず、gotoを追加するパッチでも提出してこいよ?
2020/12/06(日) 00:58:26.39ID:cfA/TiGD
>>29
breakとかcontinueがそれ
gotoの乱用を防ぐために、ループの開始と終わりにしか
gotoできないようになってる
2020/12/06(日) 01:03:45.60ID:pAeBLops
>>30
それこそ、知ったかぶりにも満たない妄言なんしゃねえの?w
2020/12/06(日) 01:52:29.29ID:cfA/TiGD
>>31
どういう意味?
breakとかcontinueは実際にジャンプしてるんだが?
33login:Penguin
垢版 |
2020/12/06(日) 01:56:35.20ID:/kQnwSfL
>>31
>>30 の言うことは正しい。
そもそも、WHILE、FOR は GOTO [後方] の亜種だし、IF THEN は本質的に IF GOTO だ。
つまり、GOTO が技術的理由で実現できなければ、全てのフロー制御は実現できない。というか、GOTO 機能自体は単なるマシン語命令なので、実現できない理由は特に無い。
言語の基礎知識レベルの話だが、これ等が知ったかぶりや妄言に聞こえるようでは、救いようが無いね。
2020/12/06(日) 02:08:08.39ID:cfA/TiGD
GOTO禁止ブームや構造化プログラミングがでたのっていつなんだろう?
シェルスクリプトにGOTOがないのはその話を踏まえた上の設計だよね?
2020/12/06(日) 02:08:31.12ID:jGLSVz7n
スクリプト言語の制御構造をマシン語命令とか言うバカ、初めて見た
2020/12/06(日) 02:09:38.25ID:cfA/TiGD
1968年か

1968年の投書「goto文は有害」
https://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
2020/12/06(日) 02:11:28.22ID:cfA/TiGD
最初のシェルは1971年だから、やっぱりGOTO有害論のあとか
https://ja.wikipedia.org/wiki/Thompson_Shell
2020/12/06(日) 02:16:15.15ID:pAeBLops
>>37
しかし、「有害論」の影響なのかどうかはわからない。
その後でも、gotoのある言語もない言語もあるわけで。
2020/12/06(日) 02:30:39.96ID:cfA/TiGD
> Thompson Shell のデザインは、Multics の模倣を意図したものだった。
> プログラムの分岐処理で欠かせない if や goto といった語ですら、別々のコマンドとして実装されていた[1]。

って書いていたから当時はまだgotoあったんだな
改良するにつれてなくしたと
2020/12/06(日) 02:33:16.62ID:cfA/TiGD
POSIXシェルの前身であるBourne Shellでようやくgotoが消えたっぽい
https://ja.wikipedia.org/wiki/Bourne_Shell
41login:Penguin
垢版 |
2021/06/06(日) 22:12:52.88ID:EGRoOpIk
標準出力の速度を制限したり、通信速度を表示するコマンドってありますか?
42login:Penguin
垢版 |
2021/06/07(月) 02:12:34.71ID:a9qe7L9c
マルチは死ねば良いのに
43login:Penguin
垢版 |
2021/06/07(月) 11:25:30.38ID:vEYRV92+
>>42
ありがとうございましたーーーー!
2021/06/15(火) 12:05:40.24ID:WDa66Wnu
標準入力をreadして変数に溜め、望みの時間sleepして標準出力にechoするだけのwhileループじゃん
2021/06/18(金) 16:00:55.53ID:bouE9vru
テキスト行の末尾に改行があればそのまま、なければ改行を追加、みたいなフィルタはどう書くのが簡単?

sed -z ...でできるんだけど、実はもっとあっさり!だったりしないかな。
2021/06/18(金) 16:13:51.93ID:xODAv2nB
>>45
改行のない行の末尾って何よ。
2021/06/18(金) 17:47:38.78ID:bnil1fLC
$ cat sample.txt
(snip)
This line is end of file.[EOF]



$ cat sample.txt
(snip)
This line is end of file.
[EOF]

にしたいってことじゃね?
2021/06/26(土) 13:29:06.46ID:3hhiwe6I
cat aaa | awk '1'

これなら、sedよりあっさり?
とは言えないか。
2021/07/03(土) 19:05:53.16ID:QPB5ysNZ
行末に改行があろうがなかろうが改行文字(\n)を削除してから
行末文字($)を改行文字(\n)で置き換える(行末に改行文字を追記する)
cat sample.txt | tr --delete '\n' | sed 's/$/\n/'
2021/07/03(土) 22:59:15.09ID:EIKNeueg
よくこんな暗号みてぇなもん覚えられんなw
2021/07/03(土) 23:33:42.29ID:jCdyWCtw
インタラクティブにシステムコール呼べたら楽かなと思ってbashのヒアストリングをgccに食わせたんだけど
gcc -o ${blob} <<ccode
\#include <...>
...
${fun}(${argv})
ccode
ld:/dev/fd/nn見つからないよ
collect2: ld returned 1

gccがldを非同期実行し、fdが回収された後にもldが動いてるのかと思い
(gcc ... & 1s)のように遅らせてもダメな謎
とりあえずmktempで動きはするけど、中間ファイル要らないクリーンなやり方ないかな

大体こんな雰囲気

code=$(mktemp --suffix \.c)
blob=…
(include/漁って型取得、引数成形)
IFS=, declare argv="$*"
cat <<c >|${code}
\#include <...>
...
${fun}(${argv})
...
c

gcc ${code} -o ${blob}
rm -rf ...
2021/07/04(日) 18:31:48.85ID:kHg5RL8R
単にgccが標準入力をソースコード扱いしたりはしないってだけでは
/usr/lib/gcc/中略/cc1なら標準入力を取るけどこのパスの特定は面倒だし、素直に中間ファイル作ったほうが良さげでは
perlとかpythonで済むならそっちでも
53login:Penguin
垢版 |
2021/07/05(月) 04:04:46.24ID:mQ20rymu
>>52
ファイル作ると監視システムに見つかるから、
それを避けたいって話じゃないの?
54login:Penguin
垢版 |
2021/07/05(月) 19:18:48.07ID:Pk2boC0r
>>49
「行末に改行があろうがなかろうが」
すまん意味がわからん。
テキストファイルはCRLFかLFの改行コードを入れて
初めて行末になるもんだと思ってたが、
それ以外の行末もあんの?
2021/07/05(月) 19:33:04.73ID:AjlMGFnC
>>54
ファイル終端
2021/07/05(月) 19:43:42.34ID:DgsJIMGq
ファイル末尾と言いたかったんじゃないの。
>>45はバグった仕様書を書くとタイプ。>>49は腐った仕様書に疑いを挟まずコーディングするタイプ。
2021/07/05(月) 20:37:17.76ID:AjlMGFnC
>>56は理解力がゼロなタイプ。w
2021/07/07(水) 16:25:53.24ID:ITjV3pwU
>>52
返信遅くなってごめん

進捗
プロトタイプはマクロだらけの生ヘッダよりman 2/3から抽出してテキストに纏めると楽にできた
手間は掛かったけどシェルから色々実験できて楽しい、見返りはあった
特定の変数に入れて返されるエラーコードはハードコードして拾うしか無さそうだけど、そこまではいいかな…

フロントエンドのgccでなく直接cc等呼ぶのも試してみる、ありがとう
2021/07/07(水) 16:38:49.73ID:L74nIjWf
>>53
個人PC上での個人的な便利ツールなのでそこまで考えてないです
たまにrm失敗するので何らかのデーモンが見に来てるとは思いますが、呼ぶたびに前回のtmpをsuffixで識別&一掃してます…
60login:Penguin
垢版 |
2021/07/21(水) 12:49:56.05ID:pz8Jt368
あるフォルダが存在するか否かによって分岐させたく

if [ -d ./$DIR]; then
hogehoge

という形でスクリプトを書いているのですが
現状~/shell_scriptにパスを通してここにそのスクリプトを置いて実行しているので~/shell_scriptに$DIRが存在するかで判定されてしまいます

これをなんとか実行するディレクトリでフォルダの有無を確認するようにしたいのですが何かいい方法はないでしょうか
2021/07/21(水) 13:01:20.15ID:rGKkhVvF
./$DIRで既にカレントディレクトリからの相対のはずなので、どこかでcdしていなければ
スクリプトの置き場所が影響するなんてないはずだけど
わざわざ ~/shell_script に移動してから実行とかしてない?
62login:Penguin
垢版 |
2021/07/21(水) 13:07:40.35ID:pz8Jt368
即レスありがとうございます
純粋にフォルダの指定方法が間違っていただけでした
ありがとうございます
2021/07/29(木) 16:33:07.23ID:wWzOvGhA
環境変数指定のコマンドラインについて質問。

ENV=VALUE cmdline1
ENV=VALUE cmdline2

これをまとめたくて、次のようにするとエラー。

ENV=VALUE ( cmdline1 ; cmdline2 )

しかたがないので、次のようにしてます。

ENV=VALUE bash -c 'cmdline1 ; cmdline2'

なんかわかりにくいし、コマンドラインのクォートが面倒でもあるし、イヤな感じ。
もっときれいな書きかたはありませんか?
2021/07/30(金) 03:08:07.29ID:Ju9d/5Jx
( ENV=VALUE; cmdline1; cmdline2 )
2021/07/30(金) 11:42:44.94ID:nK/W8CHf
>>64
たしかに。w
そう書いたときもあったのに、なぜかなんか別物あつかいでした。
ありがとう。
2021/08/01(日) 13:30:05.46ID:yremFR/t
#!/bin/sh -xってやると評価結果とかが色々表示されるけど、
スクリプトの中で別のスクリプト呼んでるような時に
その呼ばれたスクリプトも含めて色々表示させる方法ってありますか

そのスクリプトにいちいち-x付けてると面倒だし消し忘れとかもあるかなと

/bin/shを、/bin/sh -xして動かすようなものにしてみたけど
全てのシェルスクリプトの動作が変わり、OSがおかしくなって後悔した
2021/08/02(月) 04:10:48.82ID:4HLiG8xo
簡単な方法は思いつかないけど…

MY_DEBUG みたいな適当な環境変数でも使って、呼ばれるスクリプトの冒頭で

if [[ -n MY_DEBUG ]]; then set -x; fi

みたいにするとか。
2021/08/02(月) 04:32:43.59ID:FScFnmXW
なんでそんなにデバッグコードを仕込みたくないのか分からんが、どうしてもと言うなら
sed -f inject_debug_cmd.sed production_code.sh | sh -s

ファイル全部-xデバッグはちょっとアウトプット多すぎて辛いと思うけど
変な動きしてるブロックを囲んで、単語分割が予想通りかくらいしか確かめるくらい
まあそこが一番のハマりどころだから重宝するが
2021/08/02(月) 04:41:51.79ID:FScFnmXW
最終的に残らなければいいだけなら、デバッグコードの行末にでも#dbgみたいなタグ付けといて、edでインプレースに消せばいいと思うけど
ソースツリー全体のシバンを消し忘れたくないだけならfind -name \*.shとかで列挙してデストロイ
レスを投稿する


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