TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
Google NaCl プログラミング 2mol
【JavaScript系】 NILScript 【AutoHotkey風】
【信者】C++の問題点【アンチ】
簡単なプログラム言語って何?
テストを書いてからリファクタリングなんてのは幻想
【wasm】ブラウザでC++。Emscriptenを語ろう
【Java】DIコンテナって本当に便利か?
【Delphi】Embarcaderoオッチャ その33【C++ビルダ】
【コメント】doxygen【コンソメ】
Excel VBA 質問スレ Part56

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


1 :2019/10/25 〜 最終レス :2020/03/24
シェルスクリプトに関する総合スレッドです。

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

シェルスクリプト総合 その31
https://mevius.2ch.sc/test/read.cgi/tech/1565446670/

2 :
・特記なき場合、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でそれらしい単語による簡単な検索もできます
・ワイルドカードは正規表現ではありません
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな

3 :
関連スレ

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

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

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

zsh その7
https://mevius.2ch.sc/test/read.cgi/unix/1337844883/

【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.sc
https://mevius.2ch.sc/test/read.cgi/unix/1443103705/

4 :
隣で仕事してる他社のチームが、新人にコマンドプロンプトのことをMS-DOSって教えてて笑える

5 :
業界内で技術用語を正確に把握している人が果たして何人いるんだろうか?

6 :
コマンドプロンプトのことをなんと教えるか?

× MS-DOSのようなもの
○ ハドソンのゲーム、バニーガール殺人事件のようなもの
https://middle-edge.jp/articles/bFwpM

7 :
Win9xまではコマンドプロンプトのアイコンがMSDOSだったんだぜ

8 :
あれって MS-DOS プロンプトって名前じゃなかった?
Windows NT の方はコマンドプロンプト。

9 :
先輩がコマプロとか言っててキモかったな(´・ω・`)

10 :
そういう誰も効かない変な略し方ってどうやって生まれるんだろうね?
俺の知り合いは、AMDをアーマーデーとか言ってた。なんで伸ばすん?

11 :
ドイツ語読みだとしてもマーがおかC

12 :
そういえばもうDOSプロンプトって言い方しなくなったな

13 :
XP以降しか使ったことがないって人も増えたからね

14 :
MS-DOS の話をしても現在の Windows で再現できないという理由で嘘つき呼ばわりされる。

15 :
TRUE=$([ 0 = 0 ];echo $?)
FALSE=$([ ! $TRUE ];echo $?)

FLAG=$TRUE or $FALSE


↑クソコード

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

たったこれだけのコードに、こんだけのツッコミができるとはw

16 :
TRUE=0
FALSE=1

と書いたほうが遥かにマシだが、
これでも、[ $TRUE ] も [ $FALSE ] も共に 0(成功)を返すので
なんだかなーって感じw

17 :
>>15は [ ! $TRUE ] ← こういうコードを書いてますが、
つまりこういうことですよ

FLAG=$FALSE

if [ $FLAG ]; then
 echo ここが実行されるwww
fi

18 :
変数($FLAG)に、0 or 1 を入れてる人は、

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

if [ $FLAG -eq $TRUE ]; then とか
if [ $FLAG -ne $TRUE ]; then って書かないといかん

19 :
if $FLAG ; then

書き方も知らんらしいw

20 :
0: コマンドが見つかりません

www

21 :
https://stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script

22 :
>>21
Mikuの回答とやらで混乱しすぎててわろたw

ま、普通考えて、変数の内容を実行するのは危険だわな

23 :
いつものとっちゃんが来てたのか

24 :
0: コマンドが見つかりません
を確かめようと、WSLで実行したらエラー無く実行されたw

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

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

ちなみに1はないのでエラーになる

25 :
>>9
DECのVAX上で動くシェルスクリプトのようなものでコマプロってあったな
先輩からはコマンドプロシジャーの略って聞いたけど
今調べると「DCL および MCR コマンド言語インタプリタ」って言うのっぽい
適当にぐぐって出てきたPDFに載ってるそれらしい用語だけどさ
20年以上前の話だ、なつかしい・・・

26 :
質問スレでこっちでやれってレスもらったのできました。
そのまま同じ書き込みします。

リモートで最新の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)
うまくいくようにアドバイスなどいただけるとうれしいです。

27 :
rm以降をクウォートしてないからじゃないの?

28 :
ssh host 'ls -1t /home/app/'${var}'/*.log | tail -n +2 | xargs rm -f'
とか

29 :
クォートと中なら、平気、なの

30 :
この程度でいちいちbash依存しないでほしい
set -- 201909 201910
for var in $@

31 :
for loop の場合、デフォルトでは "$@" が対象になるので
for var;do ... ;done
と書ける

32 :
>>27
クォートしても同じでした。
ls: /home/app/201909/*.log: No such file or directory
>>28
リモート側が
/dev/tty を読み込むために開けませんでした: そのようなデバイスやアドレスはありません
を返してきました。
>>30
ハゲろ!

33 :
>>26
ssh host 'rm -f $(tail -n+2 $(ls -1t /home/app/'"${var}"'/*.log))'
ってやればいいと思うけど
>>28の人が書いたようにパイプ使ったほうが読みやすい

34 :
$HOME/.ssh/config に RequestTTY とか書いてない?

35 :
考えてくれて、レスをくれてありがとうございます。
>>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を書いてます。
取り急ぎ報告します。エラーについては調べてみます。

36 :
bash: /bin/rm: 引数リストが長すぎます
についてはしかたないので>>28さんのパイプを使うことにしました。

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

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

とりあえず当初の目的は達成できました。
みんな親切にありがとうございます。

37 :
curl ja.wttr.in/tokyo
curl cheat.sh/ls
これ以外に端末で使える便利サイトってある?

38 :
宣伝おつ

39 :
sshを複数回動かすよりも一回で全部やらせちゃった方が効率良いような気がするんだ

40 :
なにそれ、よさそう。
でもわたしの頭ではどうしたらよいものやら。。

41 :
forのループごとsshで引き渡せばいいじゃん。1行の長いシェルスクリプトってことね。

42 :
まだ帰宅していないので考えただけですが、
ls | tail | rm したいディレクトリが11個あって、
ディレクトリのpwdは/home/'"$var"'/'"$i"'/ みたいに2箇所変数にしてます。
それをssh1行でループを送れるバエた方法があるますか?

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

44 :
ヒアドキュメントにすればいいんじゃない

#!/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

45 :
と思ったけど、リモートホストのどこかにスクリプトファイルを置いて

ssh host /path/to/script

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

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

なんでこのメッセージが表示されるんだろう…やっぱり pseudo tty を
使ってるよね

46 :
CI/CD で使う、Task Runner みたいな方が良いかも

Ruby なら、Rake を使った、Capistrano とか、
Thor とか

47 :
rubyはけっこうです

48 :
> ヒアドキュメント
> リモートホストのどこかにスクリプト
なるほど!それならわたしでも理解できます!

> 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が出ます。

49 :
sshで接続する先のサーバに予めシェルスクリプト送り込んでおいてsshで実行だけするという手もあるな。
あまりにも長くて複雑な場合はその方が楽だと思う。

ただし、送り込んでから実行するまでの間に何者かによって別のファイルに置き換えられてしまったら終わりなのでその心配のない環境でしかできない。

50 :
うう。リロードし忘れて書いたら既に同じようなのが書かれている。orz

51 :
やり方は忘れたが、ローカルでgzにしたものをワンライナーで
送ってリモートに保存せずに実行っていうのをやったことがある気がする
かもしれないけど、保存していたかもしれない

52 :
環境構築のChef は、サーバーに、Ruby をインストールする。
そこで、サーバーに、Ruby Script を転送して、Rubyで実行する

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

他にも、Capistrano, Terraform などもある

53 :
>>52
きたーーー!!!

54 :
cshで書いたスクリプトの途中でキーから入力をしたいんですが
なんという命令で実現できますか?

55 :
set key_input = $<

56 :
>>55
サンクス(´・ω・`)

57 :
aliasってxargsじゃ使えないけど使えたらまずいんだろうか
関数ならexportすればできるけどさ

58 :
>>57
まずいとかいうわけじゃなくて、xargsは外部コマンドだよ。
例えば、俺がC言語であるプログラムを作ったとする。
俺のプログラムから、親プロセス(シェル)がなにかもわからないのに、
そのシェルで定義したメモリ内部のものを呼び出せるわけがない

59 :
関数も無理やろ?

60 :
たたbashに関数をexportできる機能があるってのは不思議なんだよなw

まあなんか変なことしてるんだろう。で気にしてなかったけどさ、
少し試してみたら、bashからbashを起動したときには使えるが、
zshだと使えないし、bash→dash→bashの流れでも使えない。
どういう仕組なんだろう?

61 :
echo 'Hello World' | xargs -I@ bash -c $'shopt -s expand_aliases;alias p="echo";\n p @'

62 :
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で見た

63 :
macては動かないのでwindows使ってくださいみたいな暴論

64 :
>>60
export -f は環境変数に
BASH_FUNC_関数名%%=関数を文字列
を設定してるだけだからじゃね。bashは起動時に環境変数にそゆのがあったら関数とし展開するから使える、その他はそんな環境変数知らんから単なる環境変数のままな感じな
dashは起動すると、その環境変数が引き継がれないからそこで断ち切られる感じかな
関数にしろaliasにしろサブプロセスに引き継ぐという考え自体がイレギュラーな感じだな

65 :
>>64
やっぱり環境変数経由なのか?
でもちゃんと確認したんだけどなw

まさかbash以外の外部コマンドを実行するときに削除してるとか?
そしてbashの中からexport -pとかしたときは省いてるとか?

66 :
>>65
bash -> zsh -> bash
で、bashでは関数になってるけど。zshでも環境変数には存在する
環境変数の引き継ぎってどうなってたかなあ

67 :
なんかもろにそれっぽいのがあった。dashは一般的でないような名前のは削除するらしい
https://unix.stackexchange.com/questions/498905/why-is-my-bash-func-foobar-environment-variable-unset-in-shell-subprocesses

68 :
ようやく見れたw
envで見れるね。export使ってた。

69 :
この変数使えば、なにか面白いことできそう。
ってか、xargsの引数にできないか?

70 :
bashを介せば

71 :
alias xargs='xargs '
echo *txt | xargs ll
.basurcの登録分はこれでもいける

72 :
uucpとかって今時どういう活用法あるかな?

73 :
TrailBlazer でも手に入れたのか

74 :
kill とtrapでソフトタイマ作ってみた。需要あるかな

75 :
sleepと何が違うん?

76 :
SECONDSとの比較だからずれの蓄積がない。
平行処理が出来る。

77 :
ずれの蓄積に関しては、sleepでも補正していけばなんとかなるので。
並行処理はまあそうだね。需要あるんじゃない?
コード見てなにかに使えそうなら使うかも
どこまで作り込んでるのかしらないが

78 :
シグナル発生をバックグランドで動かしシェルスクリプトのプロセスに送るのがかなめ。

79 :
うん。それはわかるw
前に条件を満たすまで無限ループ+タイムアウト機能ってのを実装したことがあるから
結局複雑な割にタイムアウトすることはまず無いので廃止したけどさ

80 :
もしここに書いたらレビューするかもね
内容が気に入ればだけど

81 :
いっぺんにアップできないから小出し。
#! /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 &

82 :
for ((aa = 0; aa < MAX_TIMER; aa++)); do
tim_flg[$aa]=0;
tim[$aa]=0;
#echo ${tim_flg[*]}
done;

83 :
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

84 :
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;
終わり

85 :
なんか動いてるけど、何やってるのかわからんなw
とりあえずCTRL+Cで停止しなかった。

86 :
動作を確認するためタイマーのカウントとセットを繰り返しています。
終了するためにはSIGKILLを与えてください。

87 :
しばし読んでみたけど、やっぱりわからんw

これ指定したn秒ごとにシグナル送るんじゃないのか?
tim配列とかtim_flgの意味がさっぱりだ

88 :
簡単な所から。まずシグナルはSIGはいらんぞ。
bash限定ならそれでもいいがPOSIX的には無いほうが正しい。
INTはCTRL-Cなので、USR1またはUSR2、もしくはSIGHUPとかの方が良い。
セミコロンはC言語じゃないんだから行を継続しないときにはつけないのが一般的

89 :
各タイマが0になったらなんかをちょっとやり、またタイマをセットするというプログラムです

tim配列はタイマ本体です。tim_flg配列はタイマ使用/不使用のフラグです。

90 :
やっと理解したが、これ説明なしに理解するの大変だぞw
本質的じゃないコードが複雑でそっちのほうが多すぎる。

91 :
tim_flgの意味がないな。いや意図は想像できる。(というか>>89に書いてあるか)
サンプルとしてはノイズにしかなってないので理解ができない。

92 :
宿題の添削をしてやるとか親切たなw

93 :
目的は、bash依存すんな。って言うことだったんだがなw
流石にbash依存してる部分が、本質的じゃない所ばかりだとやる気が。
バッサリ削ったら簡単に、bash依存なくせるんでどうしようかなと思いながらレス待ちw

94 :
bash依存しまくりで
https://wandbox.org/permlink/EHSiHk726Bn4qvVO

95 :
あんまりソフトタイマに有用性を感じてもらえないようで残念でした。

96 :
timeoutでやっつけ

97 :
>>95
タイマに有用性がないんじゃなくて
君が作ったスクリプトに有用性がなかったんだよ

98 :
>>94
めんどくせーから、もうそれでいいやw
その程度でbash依存するな
https://wandbox.org/permlink/Uh4eQX682YzoK8rn

99 :
おれおれかよ

100 :
Wgetであるサイトの特定のディレクトリ配下の特定のファイルを
ダウンロードしたくて下記のコマンドを書いてもルートのindex.html
しかダウンロードしてくれません。

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

wget -r -A Download拡張子 -I /Downloadディレクトリ URL


100〜のスレッドの続きを読む
ふらっと C#,C♯,C#(初心者用) Part127
Excel Python 質問スレ
Objective-C [ObjC part:9];
MVVMについて語ろう
***Javaのオススメ入門書*** 『創るJava』 3.0
Visual Studio 2017 Part7
[RPA]PC自動化技術総合スレ[効率化] Part.5
Gitをより良くするための運用ガイドライン作成スレ
【最強CUI】PowerShell -Part 2
NetBeans Part7
--------------------
艦隊これくしょん/艦これオンリー★314
東北の山を語ろう☆13 [無断転載禁止]&#169;2ch.net
■□■□チラシの裏17578枚目□■□■
【準備中】何にでも中をつけよう【営業中】
【PS3/VITA】大戦略 大東亜興亡史3
Oracle 質問総合スレ9
月イチ登場でも大丈夫 〜鬱井8人目〜
【PEUGEOT】206スレッドPart56【プジョー】
あんなに美味しい韓国料理を嫌いになって食べるな、って?絶対に無理だわwww ★39
ロックマン こだわりプレイ
【2281】プリマハム【凪様】
水泳をやっている、やっていた有名人
【バンダイスピリッツ】30 MINUTES MISSIONS 8MM【30MM】
スプラトゥーン動画投稿者ID無しスレ🌽187粒目
【初心者】サーフボード相談室【初級・中級】
【都の西北】早稲田大学野球部【競技の使命】
棋戦情報総合スレッド 206
【PSVita】PlayStationVita 総合 Part 1335
【minne】ハンクラ作品売買サイト総合 73【Creema】
The Last of Us Part2がゲームのゴア表現の限界に挑む!
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼