从在 bash 中生成脚本并将其保存到需要 sudo 的位置,我们有这个方法,我喜欢:
sudo tee "$OUTFILE" > /dev/null <<'EOF'
foo
bar
EOF
Run Code Online (Sandbox Code Playgroud)
但是,我想使用这种方法附加到现有文件 $OUTFILE。上述方法覆盖现有文件 $OUTFILE。
在以下命令中,cat 获取 here-doc 的内容并将其重定向到名为 conf 的文件:
cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
Run Code Online (Sandbox Code Playgroud)
如何理解这里的命令顺序?是否bash首先处理其他所有内容(此处为文档部分),并作为最后一步,它看起来像> conf部分?
我使用的Makefile默认步骤是打印其他选项的帮助文档。EOF如果我可以添加一个部分而不是多个,那就太好了echo。是否可以EOF像Makefilebash 脚本一样使用它?
我想对 sed 命令使用 here-doc 并提供要读取的文件和输出文件。
我已经查看了Advanced Bash Scripting guide中的Here-Documents,但它没有提到使用 here-doc 时关于常规参数的任何内容。甚至有可能吗?
我想实现以下目标:
#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt
sed $IN << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT
> $OUT;
Run Code Online (Sandbox Code Playgroud)
任何帮助都非常感谢。
巧合的是,我不得不使用我的 ATA-ID-to-device-name 脚本(在这里找到:https : //serverfault.com/questions/244944/linux-ata-errors-translating-to-a-device-name/ 426561#426561 ) 在只读 /分区上。如果你好奇,它是一个 Ubuntu 恢复控制台,它可以让你访问你的/分区,但默认情况下它会以只读方式挂载。我对此很高兴,因为否则我可能永远不会发现我的脚本由于特定行而在 R/O 系统上表现得很奇怪,这个:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Run Code Online (Sandbox Code Playgroud)
这并不会在没有写权限的工作。不过,我不会认为它会失败。但显然<<<操作员确实需要将一些临时文件写入某个地方。
但是有没有办法绕过临时文件的创建,或者,有没有办法指定文件的写入位置?在 Ubuntu 恢复控制台中,有——奇怪的是——对/run目录的写权限,如果我能以某种方式“告诉”read将临时文件写入其他地方而不是平常,那就可以了。
我正在连接到 oracle 数据库并触发查询并将输出分配给变量但是当我回显变量的值时,它没有被正确打印。
count=`sqlplus -s $configuser/$configpass@$ORACLE_SID <<END
set pagesize 0 feedback off verify off heading off echo off;
select max(cust_id) from cutomers
exit;
END`
echo $count
Run Code Online (Sandbox Code Playgroud)
查询在数据库上触发时返回正确的结果。但是“计数”变量的值不正确。
在这个脚本中,我最终将“$1”保存到 /test 文件中。
#!/bin/bash
cat > /test << 'EOF'
$1
EOF
Run Code Online (Sandbox Code Playgroud)
事实是..我需要保持
'EOF'
Run Code Online (Sandbox Code Playgroud)
为“EOF”,因为我的论点($1)包含美元符号。
但我需要保存该参数而不是 1 美元
以下代码是用于安装 Apache 的脚本。当从包装它的 heredoc 块 (APACHE) 执行它时,我就地运行这个脚本。
请注意,在这个 APACHE heredoc 中,我有一个内部 heredoc (MOD_REWRITE),我可以将其称为“次要”或“内部”heredoc。
还请注意,除了内部heredoc的代码外,APACHE内部的所有代码都是缩进的(列表)。
bash /dev/fd/10 10<<'APACHE'
# Setup basics:
apt-get update -y && apt-get upgrade -y
apt-get install tree zip unzip
a2enmod mcrypt && a2enmod mbstring
# Setup LAMP environment with enabled mod rewrite:
echo -e "\07" && echo -e "\077" # Insert password.
apt-get install lamp-server^ -y
a2enmod rewrite
cat <<MOD_REWRITE >> /etc/apache2/apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
MOD_REWRITE
systemctl restart apache2.service …Run Code Online (Sandbox Code Playgroud) 想象一下,你有一个愚蠢的脚本 test.sh ,参数被传递给它,看起来像这样:
bash test.sh arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)
test.sh 是一个显示其命令行的愚蠢脚本:
#!/bin/bash
echo "$0 $*"
Run Code Online (Sandbox Code Playgroud)
我想使用 bash heredoc << 将脚本提供给 bash 来做同样的事情。所以我试过这个:
#!/bin/bash
echo "$0 $*"
Run Code Online (Sandbox Code Playgroud)
但它失败并出现错误
bash: arg1: No such file or directory
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
在这个答案中,How does "cat << EOF" work in bash? 在 Stack Overflow 上,我得到了前两点。但我没有得到第三点Pass multi-line string to a pipeline in Bash
将多行字符串传递到 Bash 中的管道
Run Code Online (Sandbox Code Playgroud)$ cat <<EOF | grep 'b' | tee b.txt foo bar baz EOF
因为它有 3 个单词,2 个管道字符。然后我不知道如何解释它。