
コンピュータのプロセッサ数をチェックし、それに応じて別のスクリプト内のプロセッサ番号の参照をすべて変更するスクリプトを作成しました。まず、それをコピーしてターミナルに貼り付けてテストしました。スクリプト全体をコマンド ラインにコピーすると、動作します。しかし、スクリプトとして実行すると、途中で失敗します。
これがスクリプトです (扱いにくいことは承知していますし、もっと簡単な方法で実行できることは間違いありませんが、これは頭に浮かんだ簡単なスクリプトです。このスクリプトのより良いバージョンと修正があれば、とても助かります!)
#!/bin/sh
# This part works both in the script and when pasting into the terminal.
echo | nproc > ~/tmp/ProcessorNumber.txt
echo | perl -pi -e 's/processors=1/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=2/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=3/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=4/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=5/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=6/processors=8/g' ~/Scripts/test.sh
echo | perl -pi -e 's/processors=7/processors=8/g' ~/Scripts/test.sh
# This part of the script isn't working when run as script
# but is working when pasted into the command line.
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 1 ))
then
echo | perl -pi -e 's/processors=8/processors=1/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 2 ))
then
echo | perl -pi -e 's/processors=8/processors=2/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 3 ))
then
echo | perl -pi -e 's/processors=8/processors=3/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 4 ))
then
echo | perl -pi -e 's/processors=8/processors=4/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 5 ))
then
echo | perl -pi -e 's/processors=8/processors=5/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 6 ))
then
echo | perl -pi -e 's/processors=8/processors=6/g' ~/Scripts/test.sh
else
echo | ""
fi
if (( $(head -n1 ~/tmp/ProcessorNumber.txt) == 7 ))
then
echo | perl -pi -e 's/processors=8/processors=7/g' ~/Scripts/test.sh
else
echo | ""
fi
答え1
代わりに次のスクリプトを試してください:
#!/bin/sh
sed -i -e "s/processors=[0-9]\+/processors=$(nproc)/g" ~/Scripts/test.sh
sed
ストリームエディタです。-i
スイッチは、すべての変更をその場で実行するように指示します-e
が、オプションで、次の引数がsed
スクリプトであることを示します。