スクリプトでシェルを変更する方法

スクリプトでシェルを変更する方法

シェルをkshからbashに変更してファイルを取得したいです.kshrc。次のコマンドラインを順番に実行したいと思います。

bash
. ~/.kshrc
clear 

誰でも私を助けることができますか?

ベストアンサー1

まず対話的に実行してから、スクリプトで実行してみましょう。 kshrcファイルの最初の行がそうでない場合、または同様の場合は、#~/usr/bin/env ksh質問#!/usr/bin/kshに入力した内容は対話的に機能します。だから私はkshrcファイルの最初の行をスキップしてファイルの残りの部分を実行しようとしているとします。

たとえば、次が $HOME/.kshrc の完全な内容であるとします。

#!/usr/bin/env ksh
# this is my kshrc file
KSH_RED="\033[1;31m"
KSH_RESET="\033[00m"
KSH_SENTINEL="${KSH_RED}Hello from KSHRC${KSH_RESET}"

センチネル変数を使用して、ファイルが実行されているかどうかを示します。隠しコードを使用するには、上記のコマンドを$ HOME / .kshrcファイルに追加する必要があります。あるいは、上記のコマンドをkshrc2ファイルに配置し、コードの非表示を適切に変更することもできます。

$HOME/.kshrc に上記のコマンドがあるとし、新しい Korn シェルを起動します。 Kornシェルで次のコマンドを対話的に試してみましょう。

echo $KSH_SENTINEL
KSH_SENTINEL=""
echo $KSH_SENTINEL

tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
bash
. /tmp/kshrc.bash
rm /tmp/kshrc.bash
echo $KSH_SENTINEL

上記は、kshrcセットの環境変数KSH_SENTINELを使用して対話型Bourne-againシェルに残ります。また、私たちが望んでいないbashrcファイルセットの環境変数もあります。 Kornシェルプロンプトで次のコマンドを実行すると、bashrcの代わりに/tmp/kshrc.bashファイルを使用してBourne-againシェルに入ることができます。

KSH_SENTINEL=""
tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
echo "rm -f /tmp/kshrc" >> /tmp/kshrc.bash
bash -rcfile /tmp/kshrc.bash
echo $KSH_SENTINEL

これまで、私たちはインタラクティブなBourne-againシェルに入り、非常に単純なkshrcファイルに基づいて環境を設定できました。一時ファイル/tmp/kshrc.bashを使用してこれを実行しますが、このファイルは最初に取得したときに削除されます。

もちろん、bashは、より複雑なkshrcファイルのいくつかのksh構文またはコマンドのために輻輳する可能性があります。ただし、環境変数を設定してkshrcファイルにエイリアスを作成すると、これまでに行った操作を使用できます。 kshrcのbash互換部分のみを実行する必要がある場合は、コメントを使用してこれらの部分を説明できます。その後、awkなどを使用してこれらの部分を/tmp/kshrc.bashファイルにコピーできます。

それでは、これらの概念を使用してKornシェルスクリプトを作成しましょう(元の質問と同じ)。スクリプトは Korn シェルから始まり、kshrc ファイルからコマンドを抽出し、bash コマンドを追加し、kshrc+bash コマンドを実行して、Korn シェルに戻ります。このkshスクリプトを「bash_my_korn.ksh」と呼びます。これはバージョンです

#!/usr/bin/env ksh

#
# Say hello with the print command (ksh only)
print "Hello from $0"

#
# Set a variable for the temporary file
TMP_FILE="/tmp/kshrc.bash"

#
# Unset the sentinel
KSH_SENTINEL=""
print "Korn sentinel is $KSH_SENTINEL"

#
# Assemble the bash script in 2 sections
# Section 1:

print "#!/usr/bin/env bash" > $TMP_FILE
tail -n +2 $HOME/.kshrc >> $TMP_FILE

#
# Section 2 is the bash commands that we want to
# execute after the kshrc commands are executed
cat >> $TMP_FILE <<-EOS

echo "Hello from the Bourne-again shell"

if [[ -z "\$KSH_SENTINEL" ]] ; then
    echo "Bash can NOT see the sentinel variable"
else
    echo -e "Bash can see sentinel \$KSH_SENTINEL"
fi
print "Bash shell does not know the print command"

echo "Goodbye from Bourne-again shell"
EOS

#
# The bash command file now exits.  There are several ways to execute it.
print
print "Method 1, without the bashrc file"
bash --norc $TMP_FILE

print
print "Method 2, requires the script be executable"
chmod u+x $TMP_FILE
$TMP_FILE           # the bash command is on the first line of the script

#
# Now finish the Korn shell script
print
print "Goodbye from $0"

#
# Clean up ?
rm -f $TMP_FILE

上記のスクリプトのコメントがこれを説明してください。アイデアは、kshrcコマンドとbashコマンドを含む単一のbashスクリプトを組み合わせてから、単にスクリプトを実行することです。例kshスクリプトには複数の印刷コマンドが含まれており、どの部分が実行されているかを確認できます。スクリプトは自分で削除できますが、スクリプトを作成したKornシェルからもスクリプトを削除することをお勧めします。

いくつかのコメントを申し上げます。まず、--norc通常のbashrcファイルの実行を避けるためにオプションを使用してbashを起動できます。次に、catbashスクリプトにコマンドを追加できますが、bashコマンドに環境変数が含まれている場合は、上記のようにKornシェルが変数を拡張しないようにドル記号の前にバックスラッシュを配置する必要があります。第三に、このデモは、独自のソリューション開発を開始するのに役立つ概念証明と見なされるべきです。

おすすめ記事