シェルスクリプト総合 その37
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
・「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/ >>750
よくわからん指摘
予約語か文法として意味持つかは直交する話でしょう >>751
その他の予約語 if
お前 echo if が、文法上ifという意味を持つなんて思うの?w 予約語が特殊な意味を持つのは
コマンドの最初に使ったときだけ
わからんかねぇw man bashにも、{ }には注意しろ、て書いてあるくらいやからな。 お前が無知なだけやろw
{ } は文法上は特別な意味を持たない 外出しの関数ファイルってどんな名前にしてる?
特に拡張子 関数が書いてあってsourceで読み込むファイル?
名前は何が聞きたいのか知らんけど拡張子は
POSIX準拠で作るときは.shで、bash用なら.bashかな >>759
そそsourceで読み込むやつ
やっぱそんな感じだよね
前に参画してたプロジェクトでは.prfだったから最初?ってなった
ちなみに変数外出しするなら? 変数だけ区別する必要ないやろ?
.shか.bash コマンドとしては使えないスクリプトファイル、ということで、拡張子を別にしたい気持ちはわかる。
検索しやすくなるしな。 関数しか書いてないやつはコマンドとして使えないんだから
それと同じでいいやん bashというかシェル全般について質問です
シェル内で変数定義(例えばTEST="test")して
Java(jar)プログラムを呼び出してその中で環境変数(TEST)を
取得すると値"test"が得られます
シェル内の変数とは環境変数と同義なのでしょうか?
単なるスコープの違いでしょうか? >>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);
}
} そのシェル以外のどこかでexportされてる可能性もなくはない >>768
sample.bash を起動するシェルで unset TEST してから実行してみて
docker で試したけどちゃんと null が出力されたよ >>769
>>770
すみません見落としている箇所があって
きちんとexportしていました
そりゃそうですよね… しかし普通はそんなのが定義されていたからって
だからなんだ?っていう話なんだよな Ruby では、コマンドライン引数の処理に、OptionParser を使って、
short/long option を定義していく 見えないというのなら見えるようにしてあげよう
ルビーでは、コマンドライン引数の処理に、おぷしょんぱーさー を使って、
short/long option を定義していく 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"} short/longと前置/後置の両方サポートしたければ
getoptもgetoptsもダメだよね? realpathコマンドは、Windowsだと何に相当しますか?
シンボリックリンクとか仮想ドライブ経由の実ファイルを特定する方法は、Linuxだとちゃんとあるけど、Windowsはどうしてるんだろ? 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が設定されてるのが出るんだけど 自己解決しました
trap~の行を先頭に持って行ったら上手く行きました トラップ一家物語って子どもの頃は怖かった
マリア?だっけが怒られるシーンとか苦手 そういやデブだっていじめられてたっけ?
マリアはデブ。MariaDB MariaDBは新規に採用されることはもうないだろうな。 exec cmd1 | cmd2
と
cmd1 | exec cmd2 ってどっちが親のプロセスになるかってだけで同じだよね
どっちのほうがいいとかってあったりする? >>769
どちらも子プロセスだアホ
親プロセスはそれを呼び出したシェルカシェルスクリプトだ PATH=$ADD_PATH:$PATH
でPATHにすでに$ADD_PATHが含まれてない場合にだけ追加するやり方ない?ループとか回さずにいい感じにやるやり方 こんなのもあるのか
www.rapidee.com/en/command-line >>803
パスの前後に:をつけてパスの前後に必ず:が付いた状態でgrepかけるのはダメ?
if ! grep -q ":${ADD_PATH}:" <<< ":${PATH}:" ; then
PATH="${ADD_PATH}:$PATH"
export PATH
fi [[ :$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}" ほらよ。お前ら自分でコードもかけんのか?
prepend_path() {
case ":$PATH:" in
*:"$2":*) return 0
esac
PATH="$2${PATH:+:}$PATH"
}
prepend_path "$ADD_PATH" Twitterの#シェル芸とか、うんことか変な吹き出しとか
おっさん臭キツイんだけど、あれ何が楽しくてやってるの? シェル芸と言えば、USP 研究所の上田隆一。
シェルスクリプトを芸にまで高めた香具師
でも、上田の本を見たら、解答がRuby などのスクリプト言語でも書いてあるw シェル芸で、ここはRuby の1 Liner を使ってとか、
シェル芸には、Rubyなどのスクリプト言語の1 Liner も含むw > シェルスクリプトを芸にまで高めた香具師
これが間違ってる
シェル芸=シェルスクリプト芸じゃないぞ つか、シェル芸って、シェルスクリプトの機能ってほとんど使わんやん
パイプぐらいでしょ? ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8 >>820
> 上田さんが書いたページですか?
本人がwikipediaに書いたのかもねw
つか、本人のブログへのリンクあるじゃん
https://b.ueda.tech/?page=01434
> シェル芸の定義バージョン1.1
> マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、
> あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。
> あるいはそのときのコマンド入力のこと。
>
> 要は
> Unix系OSのシェル上でのワンライナーのことです。勝手に名前つけてすんません。
ソースコードを残さない時点でシェルスクリプトじゃないし、
これが定義ならシェルからワンライナーで実行するならperlとかも使っていい
POSIX原理主義とは真っ向から対立してる 上田は、シェル芸の定義まで作っていたのかw
まあ、しゃーない。
シェル芸を生み出したのは上田だから シェル芸って昔からあるワンライナーの日本語訳みたいなもんでしょ?
上田が生み出したとは言えないのでは なんだ?上田ってやつはワンライナーを言い換えた程度で
wikipediaのページまで作ってるのかw その手のワンライナーがスイスイ書けるならそれでいいがワンライナーにするために考え込むぐらいなら普通に複数行使って書いた方が早いし使い回ししやすい > コマンド入力一撃で終わらすこと。
試行錯誤で何度も実行してるよねw シェル芸は、雑誌で連載していた人気企画だったのに終わってしまった
今でも、勉強会などでやっているのかも ワンライナーはともかくシェル芸やってる人って
競技プログラミングやってみるみたいなもので
現実の問題を解くというより、問題のための問題を
解くって感じだから実用的じゃないよね 15年位前まで仕事でシェルスクリプト触ってたけど
ワンライナーの人は難読化させてたように思うね
自身しかわからないようにして仕事がなくならないようにしてた ワンライナーなら、PythonよりはPerlやろ。 Pythonの文法でワンライナーって可能なのか?
ワンライナーならPerlとRubyだろうな
一行でコードを書ける 引数で入力テキスト取れるんだからそりゃ書けるけど、インデントと改行文字埋め込みが辛い
あとperlみたいにfeature全部盛りオプションがないのでボイラープレートが割と要る Ruby の1 liner では、
-r で、モジュールを読み込める。require
例えば、csv を使うのなら、-rcsv とする。
だから、awk はいらない rubyしか使いません使いたくありませんって言ってるだけだな rubyを使うとかアホらしい
そのモジュールにバグとかあったらどうするんだ?
俺が作ったcsvライブラリを使え
awkで作った 俺が作ったcsvパーサーをインストールされば
rubyをインストールしないですむ
俺が作ったcsvパーサーはGitHubでスター68個もある 俺が作ったcsvパーサーなら、ファイルを適切なところにコピーするだけで動く
rubyのインストールは難しい。誰にでもできるような作業じゃない 俺が作ったcsvパーサーはコメント除いて200行ちょっとしかない
たった200行書くだけでrubyは不要になる
200書く方がインストールよりも簡単だ 押しが強いのばかりだな。なんでお前らそんなのきもいのか とはいえCSVの扱い方っていうのはまあまあのバカ発見器だと思う Rubyのインストールが難しいとか言ってるやつの書いたCSVパーサーww
使ってるやつ絶対アホ ダブルクォーテーション内のコンマ改行、エスケープ文字、空白、空行、末尾コンマ、行ごとの列数ブレの扱いや、エンコード、読み込みバッファの使い方とかかしら ■ このスレッドは過去ログ倉庫に格納されています