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

■ このスレッドは過去ログ倉庫に格納されています
2021/10/05(火) 22:49:30.91ID:KsbWuyFp
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し
間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。

前スレ: シェルスクリプト総合 その36
https://mevius.5ch.net/test/read.cgi/tech/1614212414/

関連スレ
・【Bash】Windows Subsystem for Linux【WSL】11
https://mao.5ch.net/test/read.cgi/linux/1627507889/
・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/
・過去UNIXで使われていた ksh というシェルについて
https://mevius.5ch.net/test/read.cgi/unix/1582358403/
・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net
https://mevius.5ch.net/test/read.cgi/unix/1443103705/
・おまえら! shell は何を使っているんですか?
https://mevius.5ch.net/test/read.cgi/unix/1012330865/
742デフォルトの名無しさん
垢版 |
2022/06/22(水) 23:59:58.34ID:qmaAVV4a
なんだそれ
2022/06/23(木) 00:51:47.61ID:p4V7vEeM
>>734
どんなリネームかによるけど、renameコマンドは?
2022/06/24(金) 22:25:26.43ID:ah9fFKb9
for n in { 1 2 3 }
do
echo $n
done
ってバグ?
745デフォルトの名無しさん
垢版 |
2022/06/24(金) 22:30:30.37ID:wjFt6G0b
手元のshellで気に入らない動作でもしたのか?
誰かが書いたコードがおかしい話か?
2022/06/24(金) 23:20:53.20ID:K5vj26OZ
ループに{}も含めたいのならバグじゃないし
含めたくないならバグかもしれない
知らんがな
2022/06/25(土) 00:54:30.97ID:3Gjf2Ej1
バグだったみたいです
2022/06/25(土) 01:42:22.54ID:+sGuzAtV
波括弧って文法上意味を持つ(フォークしないグルーピング)から含まれないのは正しい挙動だろう
2022/06/25(土) 10:28:24.73ID:zmRipdPc
え?バグダッドが見たいだって?
2022/06/25(土) 10:29:40.74ID:zmRipdPc
>>748
波括弧はただの予約語やで
2022/06/25(土) 16:56:56.58ID:+sGuzAtV
>>750
よくわからん指摘
予約語か文法として意味持つかは直交する話でしょう
2022/06/25(土) 19:46:30.70ID:zmRipdPc
>>751
その他の予約語 if

お前 echo if が、文法上ifという意味を持つなんて思うの?w
2022/06/25(土) 19:49:57.18ID:zmRipdPc
予約語が特殊な意味を持つのは
コマンドの最初に使ったときだけ
わからんかねぇw
2022/06/25(土) 21:07:44.33ID:K9JamG/I
えっ?
2022/06/25(土) 21:39:41.82ID:RwCs863z
man bashにも、{ }には注意しろ、て書いてあるくらいやからな。
2022/06/26(日) 12:28:30.09ID:HMqwJiMU
>>753
いかれてやがる
2022/06/26(日) 19:26:23.55ID:7NgSBfAB
お前が無知なだけやろw
{ } は文法上は特別な意味を持たない
758デフォルトの名無しさん
垢版 |
2022/06/27(月) 15:46:57.73ID:CskE0rDG
外出しの関数ファイルってどんな名前にしてる?
特に拡張子
2022/06/27(月) 16:49:42.17ID:qAroFeWq
関数が書いてあってsourceで読み込むファイル?
名前は何が聞きたいのか知らんけど拡張子は
POSIX準拠で作るときは.shで、bash用なら.bashかな
760デフォルトの名無しさん
垢版 |
2022/06/27(月) 18:23:34.81ID:CskE0rDG
>>759
そそsourceで読み込むやつ
やっぱそんな感じだよね

前に参画してたプロジェクトでは.prfだったから最初?ってなった
ちなみに変数外出しするなら?
2022/06/27(月) 20:23:09.07ID:qAroFeWq
変数だけ区別する必要ないやろ?
.shか.bash
2022/06/28(火) 01:11:34.56ID:Dv09yGDf
コマンドとしては使えないスクリプトファイル、ということで、拡張子を別にしたい気持ちはわかる。
検索しやすくなるしな。
2022/06/28(火) 05:39:12.64ID:L08FVbEp
関数しか書いてないやつはコマンドとして使えないんだから
それと同じでいいやん
764デフォルトの名無しさん
垢版 |
2022/06/28(火) 10:28:28.56ID:ucMrCo9H
>>762
なるほどそういう考えか
765デフォルトの名無しさん
垢版 |
2022/07/01(金) 00:50:47.17ID:oYJ8x66X
独自拡張子は嫌われる
2022/07/02(土) 11:14:35.24ID:EoiiwDBr
bashというかシェル全般について質問です

シェル内で変数定義(例えばTEST="test")して
Java(jar)プログラムを呼び出してその中で環境変数(TEST)を
取得すると値"test"が得られます
シェル内の変数とは環境変数と同義なのでしょうか?
単なるスコープの違いでしょうか?
2022/07/02(土) 12:12:57.61ID:UMJkSd0D
どっかで export TEST されてるんじゃ
2022/07/02(土) 15:06:57.46ID:EoiiwDBr
>>767
語弊があったかもしれませんが
シェル内で変数定義とJavaプログラムの呼び出しをしています
具体的には以下のような感じです

・sample.bash
#!/bin/bash
TEST="test" # この変数が環境変数と同義?
/usr/bin/java -jar Sample.jar
exit 0

・Sample.jar (Sample.java)
public class Sample {
 public static void main(String[] args) {
  String str = System.getenv("TEST"); // 値"test"が取得可能
  System.out.println(str);
 }
}
769デフォルトの名無しさん
垢版 |
2022/07/02(土) 15:46:05.19ID:5r3z96xh
そのシェル以外のどこかでexportされてる可能性もなくはない
2022/07/02(土) 15:52:50.74ID:UMJkSd0D
>>768
sample.bash を起動するシェルで unset TEST してから実行してみて
docker で試したけどちゃんと null が出力されたよ
2022/07/02(土) 16:06:22.74ID:0FvUmWjS
UNIXという生き方
2022/07/02(土) 16:07:36.00ID:EoiiwDBr
>>769
>>770
すみません見落としている箇所があって
きちんとexportしていました
そりゃそうですよね…
2022/07/02(土) 16:12:42.46ID:UMJkSd0D
>>772
ええんやで
解決したようでよかった
2022/07/02(土) 18:48:20.54ID:s0/GJKKm
しかし普通はそんなのが定義されていたからって
だからなんだ?っていう話なんだよな
775デフォルトの名無しさん
垢版 |
2022/07/12(火) 23:34:22.21ID:gA1pIjpV
引数解析にgetoptsってどう思う?
2022/07/13(水) 12:19:30.78ID:EtP8dxEe
Ruby では、コマンドライン引数の処理に、OptionParser を使って、

short/long option を定義していく
2022/07/13(水) 12:39:57.76ID:Tiof6JBH
そうなんだすごいね
778デフォルトの名無しさん
垢版 |
2022/07/13(水) 12:47:37.07ID:C1CGdRc+
>>776が見えない
2022/07/13(水) 14:35:32.25ID:4m9BBmhO
そういう人は多い
どこにでも現れるのでね
2022/07/13(水) 14:41:02.34ID:7GbSF+de
見えないというのなら見えるようにしてあげよう

ルビーでは、コマンドライン引数の処理に、おぷしょんぱーさー を使って、

short/long option を定義していく
2022/07/13(水) 17:17:56.15ID:ygLQXjBv
見えるようになってない
2022/07/13(水) 17:39:24.41ID:SQcVdjvN
なんで見えないのにレスできるんだよwww
2022/07/13(水) 18:23:16.73ID:ccIVitkd
>>775
好きにすればいいと思う
2022/07/13(水) 18:48:04.93ID:EtP8dxEe
Ruby のoptparse なら、
ruby ./a.rb -a -b1 --foo --bar x

require 'optparse'

# ARGV.replace %w(-a -b1 --foo --bar x)

opt = OptionParser.new
p params = opt.getopts( ARGV, "ab:", "foo", "bar:" )

#=> {"a"=>true, "b"=>"1", "foo"=>true, "bar"=>"x"}
785デフォルトの名無しさん
垢版 |
2022/07/13(水) 19:41:24.35ID:8ZGfs65M
>>780も見えなくした
786デフォルトの名無しさん
垢版 |
2022/07/14(木) 16:46:11.67ID:mBJkiOUt
>>783
分かった
ありがとう
2022/07/14(木) 16:48:02.99ID:rMT+3vzc
どうしたまして
2022/07/14(木) 17:15:45.36ID:mlhFFI9d
short/longと前置/後置の両方サポートしたければ
getoptもgetoptsもダメだよね?
2022/07/21(木) 12:16:57.01ID:T68Jlsts
realpathコマンドは、Windowsだと何に相当しますか?

シンボリックリンクとか仮想ドライブ経由の実ファイルを特定する方法は、Linuxだとちゃんとあるけど、Windowsはどうしてるんだろ?
790デフォルトの名無しさん
垢版 |
2022/07/26(火) 20:15:56.25ID:Yo0JxkCi
trapコマンドなるもの知ったので試そうと以下のシェルを実行したんだが上手く行かない
どうしてだろう

<test.sh>
#!/bin/bash
sleep 15 && echo "15 seconds have passed"
trap 'echo SIGINT' SIGINT

$ ./test.sh

15秒経つ前にVSCodeからCtrl + Cしても音沙汰無し(念のためteratermからもやってみたけど同じ)

15秒待てばechoされるのは確認済み
最後に「trap -p」を追加してみるとちゃんとSIGINTが設定されてるのが出るんだけど
791デフォルトの名無しさん
垢版 |
2022/07/26(火) 20:23:32.74ID:Yo0JxkCi
自己解決しました
trap~の行を先頭に持って行ったら上手く行きました
2022/07/27(水) 01:33:17.01ID:IYeKVuXU
トラップ?いいか、物語
793デフォルトの名無しさん
垢版 |
2022/07/27(水) 02:31:59.58ID:8I1dQN/H
トラップ一家物語って子どもの頃は怖かった
マリア?だっけが怒られるシーンとか苦手
2022/07/27(水) 05:21:39.36ID:IYeKVuXU
そういやデブだっていじめられてたっけ?

マリアはデブ。MariaDB
795デフォルトの名無しさん
垢版 |
2022/07/28(木) 20:48:38.50ID:oYIQQ6EM
MariaDBは新規に採用されることはもうないだろうな。
2022/08/20(土) 12:16:27.18ID:/HP/Kkeq
exec cmd1 | cmd2

cmd1 | exec cmd2 ってどっちが親のプロセスになるかってだけで同じだよね
どっちのほうがいいとかってあったりする?
2022/08/20(土) 14:20:05.28ID:kiVzxibA
>>769
どちらも子プロセスだアホ
親プロセスはそれを呼び出したシェルカシェルスクリプトだ
798デフォルトの名無しさん
垢版 |
2022/08/20(土) 14:20:29.69ID:yCCCo4Qv
>>797
安価間違ってますよ
799デフォルトの名無しさん
垢版 |
2022/08/20(土) 14:21:03.89ID:kiVzxibA
>>789
自動補完しろ
800デフォルトの名無しさん
垢版 |
2022/08/20(土) 15:34:56.76ID:l3DwVL0Z
800
2022/08/20(土) 15:44:54.21ID:VTC7uJpL
801(やおい)
802デフォルトの名無しさん
垢版 |
2022/08/22(月) 23:52:48.15ID:4DKxAEVF
bashの変数展開って可読性低いかな
803デフォルトの名無しさん
垢版 |
2022/08/23(火) 12:11:27.31ID:ZigpqJDA
PATH=$ADD_PATH:$PATH
でPATHにすでに$ADD_PATHが含まれてない場合にだけ追加するやり方ない?ループとか回さずにいい感じにやるやり方
804デフォルトの名無しさん
垢版 |
2022/08/23(火) 13:24:30.27ID:IsFqNvj1
https://stackoverflow.com/questions/17086292/how-to-insert-a-new-path-into-system-path-variable-if-it-is-not-already-there
805デフォルトの名無しさん
垢版 |
2022/08/23(火) 13:32:35.69ID:IsFqNvj1
こんなのもあるのか
www.rapidee.com/en/command-line
2022/08/23(火) 16:25:42.99ID:QjLy6Z4J
>>803
パスの前後に:をつけてパスの前後に必ず:が付いた状態でgrepかけるのはダメ?
if ! grep -q ":${ADD_PATH}:" <<< ":${PATH}:" ; then
PATH="${ADD_PATH}:$PATH"
export PATH
fi
2022/08/24(水) 12:04:37.37ID:mIEON09S
[[ :$PATH: != *:$ADD_PATH:* ]] && PATH="$ADD_PATH${PATH:+:$PATH}"

[ "$PATH" != "$ADD_PATH" ] && [ "$PATH$PATH$PATH" = "${PATH#$ADD_PATH:}${PATH#*:$ADD_PATH:}${PATH%:$ADD_PATH}" ] && PATH="$ADD_PATH${PATH:+:$PATH}"
808デフォルトの名無しさん
垢版 |
2022/08/24(水) 15:25:47.26ID:pB12lFr9
てrst
809デフォルトの名無しさん
垢版 |
2022/08/24(水) 15:29:23.30ID:pB12lFr9
ほらよ。お前ら自分でコードもかけんのか?

prepend_path() {
case ":$PATH:" in
*:"$2":*) return 0
esac
PATH="$2${PATH:+:}$PATH"
}

prepend_path "$ADD_PATH"
2022/09/30(金) 01:19:18.32ID:hEL3H+Kq
シェルショッカーのせいのでこのスレ廃れたな
811デフォルトの名無しさん
垢版 |
2022/09/30(金) 13:44:24.20ID:Yhp7EPAh
シェルが一番楽でいい
大好き
2022/09/30(金) 20:48:28.54ID:lIBPtEW1
Twitterの#シェル芸とか、うんことか変な吹き出しとか
おっさん臭キツイんだけど、あれ何が楽しくてやってるの?
2022/09/30(金) 22:18:24.47ID:6qvEDMgz
シェル芸と言えば、USP 研究所の上田隆一。
シェルスクリプトを芸にまで高めた香具師

でも、上田の本を見たら、解答がRuby などのスクリプト言語でも書いてあるw
814813
垢版 |
2022/09/30(金) 22:22:22.63ID:6qvEDMgz
シェル芸で、ここはRuby の1 Liner を使ってとか、

シェル芸には、Rubyなどのスクリプト言語の1 Liner も含むw
2022/09/30(金) 22:38:49.73ID:6fU78nEj
> シェルスクリプトを芸にまで高めた香具師

これが間違ってる
シェル芸=シェルスクリプト芸じゃないぞ
2022/10/01(土) 00:37:08.33ID:nJiCANZy
つか、シェル芸って、シェルスクリプトの機能ってほとんど使わんやん
パイプぐらいでしょ?
817デフォルトの名無しさん
垢版 |
2022/10/01(土) 01:49:51.63ID:WNV5xseU
何を以てシェル芸というのか
2022/10/01(土) 01:53:22.04ID:A++1DWcf
ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8
819デフォルトの名無しさん
垢版 |
2022/10/01(土) 02:14:51.81ID:WNV5xseU
>>818
ワンライナー縛りだったのか
820デフォルトの名無しさん
垢版 |
2022/10/01(土) 03:05:59.90ID:r/3KV4QL
>>818
上田さんが書いたページですか?
2022/10/01(土) 03:56:20.81ID:nJiCANZy
>>820
> 上田さんが書いたページですか?
本人がwikipediaに書いたのかもねw

つか、本人のブログへのリンクあるじゃん
https://b.ueda.tech/?page=01434

> シェル芸の定義バージョン1.1
> マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、
> あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。
> あるいはそのときのコマンド入力のこと。
>
> 要は
> Unix系OSのシェル上でのワンライナーのことです。勝手に名前つけてすんません。

ソースコードを残さない時点でシェルスクリプトじゃないし、
これが定義ならシェルからワンライナーで実行するならperlとかも使っていい
POSIX原理主義とは真っ向から対立してる
822813
垢版 |
2022/10/01(土) 09:15:00.12ID:WF3iEAg3
上田は、シェル芸の定義まで作っていたのかw

まあ、しゃーない。
シェル芸を生み出したのは上田だから
2022/10/01(土) 09:52:04.30ID:vUFg+rJu
シェル芸って昔からあるワンライナーの日本語訳みたいなもんでしょ?
上田が生み出したとは言えないのでは
824デフォルトの名無しさん
垢版 |
2022/10/01(土) 10:26:42.87ID:SMOLsqD3
なんだ?上田ってやつはワンライナーを言い換えた程度で
wikipediaのページまで作ってるのかw
2022/10/01(土) 10:44:12.58ID:a2GTR0qK
その手のワンライナーがスイスイ書けるならそれでいいがワンライナーにするために考え込むぐらいなら普通に複数行使って書いた方が早いし使い回ししやすい
2022/10/01(土) 10:57:25.49ID:SMOLsqD3
> コマンド入力一撃で終わらすこと。

試行錯誤で何度も実行してるよねw
2022/10/01(土) 17:43:09.08ID:0xrmLtr7
普通にスクリプト書いて終わりでいいじゃん
2022/10/01(土) 22:13:37.09ID:WF3iEAg3
シェル芸は、雑誌で連載していた人気企画だったのに終わってしまった

今でも、勉強会などでやっているのかも
2022/10/01(土) 23:27:02.91ID:SMOLsqD3
今は手作業じゃなくて自動化の時代ですしw
2022/10/02(日) 00:38:08.91ID:WZvawmk5
ワンライナーはともかくシェル芸やってる人って
競技プログラミングやってみるみたいなもので
現実の問題を解くというより、問題のための問題を
解くって感じだから実用的じゃないよね
2022/10/02(日) 12:49:06.04ID:nQhJJvDz
15年位前まで仕事でシェルスクリプト触ってたけど
ワンライナーの人は難読化させてたように思うね
自身しかわからないようにして仕事がなくならないようにしてた
832デフォルトの名無しさん
垢版 |
2022/10/02(日) 13:20:01.30ID:QRKSlI6k
最近はワンライナーもpythonで書いてるわ。
2022/10/02(日) 23:04:22.94ID:P9RAxpp0
ワンライナーなら、PythonよりはPerlやろ。
2022/10/03(月) 02:57:52.90ID:bidh+76+
Pythonの文法でワンライナーって可能なのか?
ワンライナーならPerlとRubyだろうな
一行でコードを書ける
2022/10/03(月) 03:17:23.26ID:VpzdjDDF
引数で入力テキスト取れるんだからそりゃ書けるけど、インデントと改行文字埋め込みが辛い
あとperlみたいにfeature全部盛りオプションがないのでボイラープレートが割と要る
836デフォルトの名無しさん
垢版 |
2022/10/03(月) 16:27:05.78ID:M4csbtG9
awkとか使うと一行になっちゃう
2022/10/03(月) 17:26:07.03ID:bidh+76+
ならねーだろ。つか一行100文字超えるなや
2022/10/03(月) 17:46:22.23ID:ZyVxlvNn
自分勝手すぎ
2022/10/03(月) 18:10:34.89ID:pcuzjq2H
Ruby の1 liner では、
-r で、モジュールを読み込める。require

例えば、csv を使うのなら、-rcsv とする。
だから、awk はいらない
2022/10/03(月) 20:56:25.38ID:fL6GSL1h
rubyしか使いません使いたくありませんって言ってるだけだな
2022/10/04(火) 03:06:20.40ID:F9I3VOct
rubyを使うとかアホらしい
そのモジュールにバグとかあったらどうするんだ?

俺が作ったcsvライブラリを使え
awkで作った
2022/10/04(火) 03:08:24.97ID:F9I3VOct
俺が作ったcsvパーサーをインストールされば
rubyをインストールしないですむ
俺が作ったcsvパーサーはGitHubでスター68個もある
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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