(そのまま)出力ファイル内のスクリプトから一部を書き出すことができる小さなスクリプトを作成しようとする
ソースファイルのテキスト
echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt
望ましい出力:
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
私が得ているものは:
yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&
CentOS 7を使用する最小限の新規インストール完全なスクリプト/テキストに適用されるソリューションを探して、行ごとの変更はありません。sedを使用しても実行できると思います...
バックティックをエスケープする必要があります(`):
#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt
私はこの方法を複数行に使用することを好みます:
#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
展開を防ぐために一重引用符を使用します。
echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt
詳細は 二重引用符と単一引用符の違い を参照してください。
テキストに単一引用符が含まれている場合、上記は機能しない可能性があります。その場合、 here doc を使用する方が安全です。たとえば、次の行を挿入すると、上記が壊れます:var='something'
。
ヒアドキュメントを使用すると、次のようになります。
cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
ちょうど遅い追加:
echo 'string' >> output
コマンドはシンプルで素晴らしいです。ただし、「...:Permission denied」エラーとSudo
を組み合わせたエラーが表示される場合があります。
最近、sudo echo 'string \n other string \n' > /path/to/file
私にとって最も効果的なもの:printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file
実際に文字列をstdoutに出力するのもおまけなので、ファイルに書き込まれた内容を確認できます。
Chepnerに感謝
私が見つけた最良の解決策は:
echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output
このソリューションでは、すべてのテキストが変更なしで出力ファイルに送られ、カラー定義も変更なしで機能します。