我有这个代码
TOKEN=$(cat ./config/token)
echo "$TOKEN"
cat > variables.env <<EOF
TOKEN=`echo "$TOKEN"`
EOF
我正在尝试获取文件的内容,并将其输出以某些文本的前缀为前缀。控制台中的第一个echo
呼应了我想要的输出,保留了空格和新线。
但是,在新文件中,输出只是原始字符串的第一行,而我希望使用第一个echo
在控制台中看到的相同输出。
使用 printf %q
(以ksh或bash的速度)以始终评估其字面价值的方式来逃避内容:
printf 'TOKEN=%qn' "$(<./config/token)" >variables.env
$(<file)
是KSH和BASH扩展程序,可作为$(cat file)
的更有效的替代品(因为常规命令替代需要分配子过程,设置FIFO并产生/bin/cat
的外部副本,而$(<file)
表格则简单告诉外壳直接读取文件)。
这样的方式包含包含其他敌对字符串(例如$(rm -rf ~)
)或可以简单地扩展为变量($$
)的内容的内容将被排放为文字内容。
提供一个明确的示例:
printf '%sn' "first line" "second line" >token # write two lines to the file "token"
printf 'TOKEN=%qn' "$(<token)" >variables.env # write a shell command which assigns those
# two lines to a variable to variables.env
source variables.env # execute variables.env in the current shell
echo "$TOKEN" # emit the value of TOKEN, as given in the current shell
...当用bash运行时,会发出确切的输出:
first line
second line
...写下以下内容(使用Bash 3.2.48;可能随其他版本而变化)至variables.env
:
TOKEN=$'first linensecond line'
无用的echo
这就是您可以写的:
cat > variables.env <<EOF
TOKEN=${TOKEN}
EOF
您正在以一种非常复杂的方式进行操作,有更轻松的方法
sed '1s/./TOKEN=&/' file > newfile
将在第一行中插入TOKEN=
。这具有不修改空文件的附加好处(原始文件中至少应该存在一个字符)。如果不是打算,您可以使用无条件插入。
您可以做:
echo "TOKEN=" > newfile && cat ./config/token >> newfile
-
>>
附加到文件。