X



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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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/
0753デフォルトの名無しさん
垢版 |
2022/06/25(土) 19:49:57.18ID:zmRipdPc
予約語が特殊な意味を持つのは
コマンドの最初に使ったときだけ
わからんかねぇw
0758デフォルトの名無しさん
垢版 |
2022/06/27(月) 15:46:57.73ID:CskE0rDG
外出しの関数ファイルってどんな名前にしてる?
特に拡張子
0759デフォルトの名無しさん
垢版 |
2022/06/27(月) 16:49:42.17ID:qAroFeWq
関数が書いてあってsourceで読み込むファイル?
名前は何が聞きたいのか知らんけど拡張子は
POSIX準拠で作るときは.shで、bash用なら.bashかな
0760デフォルトの名無しさん
垢版 |
2022/06/27(月) 18:23:34.81ID:CskE0rDG
>>759
そそsourceで読み込むやつ
やっぱそんな感じだよね

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

シェル内で変数定義(例えばTEST="test")して
Java(jar)プログラムを呼び出してその中で環境変数(TEST)を
取得すると値"test"が得られます
シェル内の変数とは環境変数と同義なのでしょうか?
単なるスコープの違いでしょうか?
0768デフォルトの名無しさん
垢版 |
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);
 }
}
0769デフォルトの名無しさん
垢版 |
2022/07/02(土) 15:46:05.19ID:5r3z96xh
そのシェル以外のどこかでexportされてる可能性もなくはない
0770デフォルトの名無しさん
垢版 |
2022/07/02(土) 15:52:50.74ID:UMJkSd0D
>>768
sample.bash を起動するシェルで unset TEST してから実行してみて
docker で試したけどちゃんと null が出力されたよ
0774デフォルトの名無しさん
垢版 |
2022/07/02(土) 18:48:20.54ID:s0/GJKKm
しかし普通はそんなのが定義されていたからって
だからなんだ?っていう話なんだよな
0775デフォルトの名無しさん
垢版 |
2022/07/12(火) 23:34:22.21ID:gA1pIjpV
引数解析にgetoptsってどう思う?
0776デフォルトの名無しさん
垢版 |
2022/07/13(水) 12:19:30.78ID:EtP8dxEe
Ruby では、コマンドライン引数の処理に、OptionParser を使って、

short/long option を定義していく
0778デフォルトの名無しさん
垢版 |
2022/07/13(水) 12:47:37.07ID:C1CGdRc+
>>776が見えない
0780デフォルトの名無しさん
垢版 |
2022/07/13(水) 14:41:02.34ID:7GbSF+de
見えないというのなら見えるようにしてあげよう

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

short/long option を定義していく
0784デフォルトの名無しさん
垢版 |
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"}
0785デフォルトの名無しさん
垢版 |
2022/07/13(水) 19:41:24.35ID:8ZGfs65M
>>780も見えなくした
0786デフォルトの名無しさん
垢版 |
2022/07/14(木) 16:46:11.67ID:mBJkiOUt
>>783
分かった
ありがとう
0789デフォルトの名無しさん
垢版 |
2022/07/21(木) 12:16:57.01ID:T68Jlsts
realpathコマンドは、Windowsだと何に相当しますか?

シンボリックリンクとか仮想ドライブ経由の実ファイルを特定する方法は、Linuxだとちゃんとあるけど、Windowsはどうしてるんだろ?
0790デフォルトの名無しさん
垢版 |
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が設定されてるのが出るんだけど
0791デフォルトの名無しさん
垢版 |
2022/07/26(火) 20:23:32.74ID:Yo0JxkCi
自己解決しました
trap~の行を先頭に持って行ったら上手く行きました
0793デフォルトの名無しさん
垢版 |
2022/07/27(水) 02:31:59.58ID:8I1dQN/H
トラップ一家物語って子どもの頃は怖かった
マリア?だっけが怒られるシーンとか苦手
0795デフォルトの名無しさん
垢版 |
2022/07/28(木) 20:48:38.50ID:oYIQQ6EM
MariaDBは新規に採用されることはもうないだろうな。
0796デフォルトの名無しさん
垢版 |
2022/08/20(土) 12:16:27.18ID:/HP/Kkeq
exec cmd1 | cmd2

cmd1 | exec cmd2 ってどっちが親のプロセスになるかってだけで同じだよね
どっちのほうがいいとかってあったりする?
0798デフォルトの名無しさん
垢版 |
2022/08/20(土) 14:20:29.69ID:yCCCo4Qv
>>797
安価間違ってますよ
0799デフォルトの名無しさん
垢版 |
2022/08/20(土) 14:21:03.89ID:kiVzxibA
>>789
自動補完しろ
0800デフォルトの名無しさん
垢版 |
2022/08/20(土) 15:34:56.76ID:l3DwVL0Z
800
0802デフォルトの名無しさん
垢版 |
2022/08/22(月) 23:52:48.15ID:4DKxAEVF
bashの変数展開って可読性低いかな
0803デフォルトの名無しさん
垢版 |
2022/08/23(火) 12:11:27.31ID:ZigpqJDA
PATH=$ADD_PATH:$PATH
でPATHにすでに$ADD_PATHが含まれてない場合にだけ追加するやり方ない?ループとか回さずにいい感じにやるやり方
0805デフォルトの名無しさん
垢版 |
2022/08/23(火) 13:32:35.69ID:IsFqNvj1
こんなのもあるのか
www.rapidee.com/en/command-line
0806デフォルトの名無しさん
垢版 |
2022/08/23(火) 16:25:42.99ID:QjLy6Z4J
>>803
パスの前後に:をつけてパスの前後に必ず:が付いた状態でgrepかけるのはダメ?
if ! grep -q ":${ADD_PATH}:" <<< ":${PATH}:" ; then
PATH="${ADD_PATH}:$PATH"
export PATH
fi
0807デフォルトの名無しさん
垢版 |
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}"
0808デフォルトの名無しさん
垢版 |
2022/08/24(水) 15:25:47.26ID:pB12lFr9
てrst
0809デフォルトの名無しさん
垢版 |
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"
0811デフォルトの名無しさん
垢版 |
2022/09/30(金) 13:44:24.20ID:Yhp7EPAh
シェルが一番楽でいい
大好き
0812デフォルトの名無しさん
垢版 |
2022/09/30(金) 20:48:28.54ID:lIBPtEW1
Twitterの#シェル芸とか、うんことか変な吹き出しとか
おっさん臭キツイんだけど、あれ何が楽しくてやってるの?
0813デフォルトの名無しさん
垢版 |
2022/09/30(金) 22:18:24.47ID:6qvEDMgz
シェル芸と言えば、USP 研究所の上田隆一。
シェルスクリプトを芸にまで高めた香具師

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

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

これが間違ってる
シェル芸=シェルスクリプト芸じゃないぞ
0816デフォルトの名無しさん
垢版 |
2022/10/01(土) 00:37:08.33ID:nJiCANZy
つか、シェル芸って、シェルスクリプトの機能ってほとんど使わんやん
パイプぐらいでしょ?
0817デフォルトの名無しさん
垢版 |
2022/10/01(土) 01:49:51.63ID:WNV5xseU
何を以てシェル芸というのか
0819デフォルトの名無しさん
垢版 |
2022/10/01(土) 02:14:51.81ID:WNV5xseU
>>818
ワンライナー縛りだったのか
0820デフォルトの名無しさん
垢版 |
2022/10/01(土) 03:05:59.90ID:r/3KV4QL
>>818
上田さんが書いたページですか?
0821デフォルトの名無しさん
垢版 |
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原理主義とは真っ向から対立してる
0822813
垢版 |
2022/10/01(土) 09:15:00.12ID:WF3iEAg3
上田は、シェル芸の定義まで作っていたのかw

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

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

例えば、csv を使うのなら、-rcsv とする。
だから、awk はいらない
0841デフォルトの名無しさん
垢版 |
2022/10/04(火) 03:06:20.40ID:F9I3VOct
rubyを使うとかアホらしい
そのモジュールにバグとかあったらどうするんだ?

俺が作ったcsvライブラリを使え
awkで作った
0842デフォルトの名無しさん
垢版 |
2022/10/04(火) 03:08:24.97ID:F9I3VOct
俺が作ったcsvパーサーをインストールされば
rubyをインストールしないですむ
俺が作ったcsvパーサーはGitHubでスター68個もある
0843デフォルトの名無しさん
垢版 |
2022/10/04(火) 03:10:11.52ID:F9I3VOct
俺が作ったcsvパーサーなら、ファイルを適切なところにコピーするだけで動く
rubyのインストールは難しい。誰にでもできるような作業じゃない
0844デフォルトの名無しさん
垢版 |
2022/10/04(火) 03:13:47.12ID:F9I3VOct
俺が作ったcsvパーサーはコメント除いて200行ちょっとしかない
たった200行書くだけでrubyは不要になる
200書く方がインストールよりも簡単だ
0846デフォルトの名無しさん
垢版 |
2022/10/04(火) 06:08:41.35ID:d4cMYyPK
何かワロタw
0848デフォルトの名無しさん
垢版 |
2022/10/04(火) 15:36:06.28ID:VPNCWU/y
というと?
0849デフォルトの名無しさん
垢版 |
2022/10/04(火) 16:05:16.77ID:d0x64lde
Rubyのインストールが難しいとか言ってるやつの書いたCSVパーサーww

使ってるやつ絶対アホ
0850デフォルトの名無しさん
垢版 |
2022/10/04(火) 16:14:37.74ID:LlVt6c8r
ダブルクォーテーション内のコンマ改行、エスケープ文字、空白、空行、末尾コンマ、行ごとの列数ブレの扱いや、エンコード、読み込みバッファの使い方とかかしら
■ このスレッドは過去ログ倉庫に格納されています