Shell (OS)

Topics about Shell of OS

Create a Topic

Topics

シェルスクリプトで壊さずに全ての引数を別コマンドに引き渡す書き方

223 views Post
wakairo @wakairo
Last edited

基本はダブルクォーテーション付きの"$@"

シェルスクリプトに渡された全ての引数を、そのシェルスクリプト内で別のコマンドに引き渡す場合は"$@"を使います。 例えば、以下のように記述します。

grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a ~/foo.log

"$*"$@(ダブルクォーテーションなし)を使うと、'foo bar'のようなスペースを含む引数がスペースで分割されて壊れてしまいます。

shコマンドに渡すときはsh -c '..."$@"...' -- "$@"

1つの実行コマンドしか受け付けないsudosshdocker runなどで、 複数コマンドの実行などの複雑な処理を行いたいときに活躍するのがsh -c '...'です。

シェルスクリプト内でsh -c '...'にすべての引数を渡したいときは、sh -c '..."$@"...' -- "$@"と記述します。 例えば、以下のように記述します。

sudo sh -c 'grep -n cat "$@" | sed "s/cat/__CAT__/g" | tee -a /var/log/foo.log' -- "$@"

先頭のいくつかの引数を取り出して残りを渡す場合(おまけ)

検索ワードのような「固定の引数」と、複数のファイルのような「可変長の引数」が混在しているケースです。 これらをまとめてsudosshdocker runなどに投げたい場合は、 -cオプションの文字列内でshiftを使います。

以下は、第一引数が検索文字列、第二引数がその検索文字列を置き換える先の文字列、 第三引数以降はこの検索と置換の対象となるファイル(複数個指定可)となっている例です。

sudo sh -c 'pattern="$1"; replace="$2"; shift 2;
            grep -n "$pattern" "$@" |
            sed "s/$pattern/$replace/g" |
            tee -a /var/log/foo.log' -- "$@"
0
Raw
https://www.techtips.page/en/comments/1083
❤️2
😄1
🔧1
💯1

CIを示す環境変数はCI?

2610 views Post
wakairo @wakairo

テストがCI (Continuous Integration) のシステム上で実行されていることを示すための環境変数の名前は、「CI」がデファクト・スタンダードになっているみたいです。

ちなみに、CIという名前の環境変数を知ったのは、Railsガイドを読んでいたら出てきたためです。そこで、自分が名前を知っているいくつかのCIについて既定の環境変数について確認したところ、確かにCIという名前の環境変数が定義されていました。

参考:各CIの既定の環境変数

0
Raw
https://www.techtips.page/en/comments/62