シェル変数の切り替え/マクロ/xargsなど

シェル変数の切り替え/マクロ/xargsなど

だから私はクロスコンパイルをたくさんし、しばしばこのようにタイピングしたりしました。

FOO=bar command --some-args
BAZ=qxt other-command --other-args

しかし、実際のシェル変数は非常に長く、入力するのが面倒です。 Bashは動的言語ではないため、バックティックは機能しません(FOO = barコマンドを実行しようとしました)。 xargsは間違っていますが、コマンドが評価される前に同様の操作を実行することをお勧めします。環境変数に必要なシェル変数を設定すると、コマンドの前にバックティックと同じ問題が発生します。毎回明示的にenvを変更すると、質問を入力して楽しさも加わります。私の将来の環境を汚染します。 pushenvとpopenvに似たものはありますか?

短いハンドルで必要なすべてのシェル変数を保存して検索して、次のことを行う方法はありますか?

shellvars1 command --some-args
shellvars2 other-command --other-args

シェル変数のさまざまな組み合わせは大きくても制限されているため、ヘルパースクリプトにオフロードする方法がある場合は、一度に入力できますが、それを行う方法はありません。

ボーナスポイント:bashにはtcshに似た機能はありますか?

!24:s/FOO/BAZ/

これも役に立ちます(ただしそれほど多くはありませんが)。私は主にスペルミスで超自然的な力を誇示する機会を取り除きたかった。

答え1

シェル変数が何であるかについて少し混乱しているようです。投稿のすべての変数はシェル変数ではなく環境変数です。シェル変数を設定します。

foo=bar

環境変数を設定するには、次の手順に従ってください。

export FOO=BAR

(またはcシェルのsetenv)。しかし、

FOO=BAR command

直観に反して、割り当ては以前とは異なる意味を持ち、環境変数はコマンド環境でのみ設定されます。つまり、この単純なスクリプトは必要なタスクを実行する必要があります。

#!/bin/bash
VAR1=VAL1 ... VALN=VARN "$@"

追加の質問については:私はbashがこれを行うことはできないと思いますが、zshは素晴らしくそれをすることができます。両方

^FOO^BAR

そして

!!:s/FOO/BAR/

特定の例では、同じ効果で次のことを行います。

!24:s/FOO/BAR/

答え2

エイリアスに変数の代入を入れることができます。

alias shellvars1='FOO=bar '
alias shellvars2='BAZ=qxt '

変数の末尾のスペースは、エイリアス拡張のために後続の単語も考慮するようにシェルに指示します。たとえば、がエイリアスの場合をa実行します。somecommand --optionshellvars1 shellvars2 a wibbleFOO=bar BAZ=qxt somecommand --option a

機能を使用することもできます。割り当てが固定されている場合はエイリアスを使用し、さらに柔軟性(条件付き割り当てなど)が必要な場合は関数を使用してください。

shellvars1 () {
  local tmp=2
  FOO=$((tmp + tmp)) "$@"
}
shellvars1 mycommand

変数を関数のローカル変数として設定することもできます。変数が関数に対してローカルの場合、exportディレクティブもその関数の範囲に制限されます。

shellvars1 () {
  local FOO=bar
  export FOO
  "$@"
}

関連情報