シェルスクリプト内でコマンドを実行し、それを変数に保存したいが望ましくない新しいシェルが開きます。この問題を解決する方法はありますか?これは私のスクリプトです。
#!/bin/bash
V1=`<any_command>` #The shell should not open a new shell
V2=`<another_command>` #The shell should not open a new shell
以下のシェルスクリプトを実行して、同じシェルで実行できます。
. ./Script.sh
ただし、シェルスクリプトに変数に格納されるコマンドがある場合は、
V1=`<any_command>`
これはまだ私が望んでいない新しいシェルを開きます。
答え1
コマンドの出力を変数に保存すると、その変数からコマンドが実行されます。サブシェル。これを避けることはできません。シェルのコンテキスト(変数、リダイレクトなど)の変更を維持し、出力をキャプチャするには、スクリプトを別々に設定する必要があります。
1つの方法は一時ファイルを使用することです。これは移植可能であり(一時ファイルの生成方法がPOSIXではないことを除いて、すべてのPOSIX shで機能します)、非侵害的です(any_command
ブラックボックスとして扱うことができ、変更する必要はありません)。
unset tmp1
trap 'rm -f "$tmp1"' EXIT INT TERM HUP
tmp1="$(mktemp)"
any_command >"$tmp1"
V1=$(cat "$tmp1")
rm "$tmp1"
一時ファイルの使用を避ける移植可能ですが、干渉する方法は、その出力が変数に収集されるany_command
ように一時ファイルを変更することです。これを行うには、各外部コマンド呼び出しをこの変数に関連付ける必要があります。これは、関数呼び出しがある場合に特に問題になります。関数のコードを変更する必要があるからです。例:
f () {
echo "$1"
a=$((a+$1))
echo "$2"
}
V1=$(f 4 2)
に変更される予定です。
f_into_V1 () {
V1="${V1}${1}"
a=$((a+$1))
V1="${V1}${2}"
}
f_into_V1 4 2