新しいシェルを開かずにシェルスクリプトからコマンドを実行する方法

新しいシェルを開かずにシェルスクリプトからコマンドを実行する方法

シェルスクリプト内でコマンドを実行し、それを変数に保存したいが望ましくない新しいシェルが開きます。この問題を解決する方法はありますか?これは私のスクリプトです。

#!/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

おすすめ記事