Bashで変数を一時的に宣言します。

Bashで変数を一時的に宣言します。

たとえば、Bashスクリプトファイル(Bash関数ではない)でBashで変数を宣言するには、次の手順を実行し、スクリプトx=yファイルで変数を使用したら、次の手順を実行しますunset x

5分後に変数を1行に設定解除する方法(関数を使用せず)はありますか? 1つの可能なアプローチは次のとおりですx=y && echo "unset x" | at now + 5 minutes

この特別なケースでは、端末から直接スクリプトファイルを実行しました。コピーして貼り付けるそのコンテンツはGitHubからターミナルに流れます。これは次のものです購入私は仮定する」。


GitHubを使用していることを考えると、別のオプションは次のとおりです。オリジナル次のように別のシェルを使用してGitHubから直接スクリプトファイルを作成しますbashが、この方法は不可論的ではないため、気に入りませんuser/repo/branch/path/file

wget -O - https://raw.githubusercontent.com/<username>/<repo>/<branch>/<path>/<file> | bash

答え1

atジョブは他のコンテキストで実行され、現在のシェルには影響しないため使用できません。

しかし、私たちも同様のことができます。このコードは、私たちが捕捉してアクションを取ることができる警告信号をトリガーします。

#!/bin/bash

x=100

trap 'unset x' SIGALRM

mypid=$$

( /bin/sleep 3 ; kill -ALRM $mypid) &

for a in 1 2 3 4 5 6
do
  echo Now x=$x
  sleep 1
done

この例は、必要に応じて遅延を選択できる3秒しか使用しないソリューションを示しています。

実行中:

Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=

1行で簡単に作成できます;...

答え2

確かに:

trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &

これはUSR1信号にトラップを設定し(セミコロンチートを使用して1行に配置します)、sleepコマンドとkillコマンドをバックグラウンドジョブに結合します。タスクが完了すると、トラップを実行している現在のシェルにUSR1信号を送信します。トラップが解放され、xトラップが削除されます。

機能がありません!

答え3

修正された質問の場合、スクリプトではなくコマンドラインに基づく最も簡単な解決策は、次を使用することです。サブシェルあなたの仕事をしなさい。

例えば

$ bash
$ x=100
$ echo $x
100
$ exit
$ echo $x

$

bashこのシェルを実行して呼び出す間に設定したすべての変数はexit忘れられます。

wget ... | bashこれは、「貼り付け」/入力コマンドを切り取ることができることを除いて、ウィジェットの仕組みと非常によく似ています。

答え4

実際に最も簡単な方法は、おそらく最初に変数宣言を持つ複合コマンドを使用することです。

コマンドラインの先頭で変数を宣言すると、そのコマンドの範囲内でのみ一時的に定義されます。

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y bash -c 'echo $x'
y
madumlao@lezard:~$ echo $x
foo

ご覧のとおり、変数宣言のある行はその行の環境でのみ変数を設定します。

以下は機能しません。

madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y echo $x

madumlao@lezard:~$ echo $x
foo

2行目の$ xは、実際の割り当て前にコマンドライン解析中に解析されるため、予期せず空になります。

関連情報