Linux “怎么做?”;猫<&书信电报;EOF";在bash工作?
我需要编写一个脚本来向程序输入多行输入(Linux “怎么做?”;猫<&书信电报;EOF";在bash工作?,linux,bash,scripting,heredoc,Linux,Bash,Scripting,Heredoc,我需要编写一个脚本来向程序输入多行输入(psql) 通过谷歌搜索,我发现以下语法是有效的: cat << EOF | psql ---params BEGIN; `pg_dump ----something` update table .... statement ...; END; EOF cat这称为herdoc格式,用于向标准输入中提供字符串。有关更多详细信息,请参阅 从manbash: 这里有文件 这种类型的重定向指示shell从中读取输入 直到一条线的电流源 仅包
psql
)
通过谷歌搜索,我发现以下语法是有效的:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
cat这称为herdoc格式,用于向标准输入中提供字符串。有关更多详细信息,请参阅
从manbash
:
这里有文件
这种类型的重定向指示shell从中读取输入
直到一条线的电流源
仅包含单词(无尾随)
空白)是可见的
所有读到该点的行都将用作
命令的标准输入
此处文件的格式为:
<<[-]word
here-document
delimiter
这称为herdoc格式,用于将字符串提供给标准输入。有关更多详细信息,请参阅
从manbash
:
这里有文件
这种类型的重定向指示shell从中读取输入
直到一条线的电流源
仅包含单词(无尾随)
空白)是可见的
所有读到该点的行都将用作
命令的标准输入
此处文件的格式为:
<<[-]word
here-document
delimiter
猫猫在您的例子中,“EOF”被称为“Here标签”。基本上,在您的例子中,“EOF”被称为“Here标签”。基本上posix7
kennytm引用了ManBash的话,但其中大部分也是POSIX7::
重定向运算符“POSIX 7”
kennytm引用了ManBash的话,但其中大部分也是POSIX7::
重定向操作符“使用tee而不是cat
不完全是对原始问题的回答,但我还是想分享一下:我需要在一个需要根权限的目录中创建一个配置文件
以下内容不适用于该情况:
$ sudo cat <<EOF >/etc/somedir/foo.conf
# my config file
foo=bar
EOF
$sudo cat使用T形三通代替cat
不完全是对原始问题的回答,但我还是想分享一下:我需要在一个需要根权限的目录中创建一个配置文件
以下内容不适用于该情况:
$ sudo cat <<EOF >/etc/somedir/foo.conf
# my config file
foo=bar
EOF
$sudo cat这不一定是对原始问题的回答,而是分享我自己测试的一些结果。这:
<<test > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
test
这不一定是对原始问题的回答,而是分享我自己测试的一些结果。这:
<<test > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
test
值得注意的是,这里的文档也在bash循环中工作。
此示例显示如何获取表的列列表:
export postgres_db_name='my_db'
export table_name='my_table_name'
# start copy
while read -r c; do test -z "$c" || echo $table_name.$c , ; done < <(cat << EOF | psql -t -q -d $postgres_db_name -v table_name="${table_name:-}"
SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'public'
AND table_name =:'table_name' ;
EOF
)
# stop copy , now paste straight into the bash shell ...
output:
my_table_name.guid ,
my_table_name.id ,
my_table_name.level ,
my_table_name.seq ,
export postgres\u db\u name='my\u db'
导出表\u name='my\u table\u name'
#开始复制
而read-rc;做测试-z“$c”| echo$table|u name.$c;完成<值得注意的是,这里的文档也在bash循环中工作。
此示例显示如何获取表的列列表:
export postgres_db_name='my_db'
export table_name='my_table_name'
# start copy
while read -r c; do test -z "$c" || echo $table_name.$c , ; done < <(cat << EOF | psql -t -q -d $postgres_db_name -v table_name="${table_name:-}"
SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'public'
AND table_name =:'table_name' ;
EOF
)
# stop copy , now paste straight into the bash shell ...
output:
my_table_name.guid ,
my_table_name.id ,
my_table_name.level ,
my_table_name.seq ,
export postgres\u db\u name='my\u db'
导出表\u name='my\u table\u name'
#开始复制
而read-rc;做测试-z“$c”| echo$table|u name.$c;对上述答案做了一点扩展。尾随的
将输入定向到文件中,覆盖现有内容。但是,一个特别方便的用法是双箭头>
,它将新内容添加到文件末尾,如:
cat <<EOF >> /etc/fstab
data_server:/var/sharedServer/authority/cert /var/sharedFolder/sometin/authority/cert nfs
data_server:/var/sharedServer/cert /var/sharedFolder/sometin/vsdc/cert nfs
EOF
cat/etc/fstab
数据服务器:/var/sharedServer/authority/cert/var/sharedFolder/sometin/authority/cert nfs
数据服务器:/var/sharedServer/cert/var/sharedFolder/sometin/vsdc/cert-nfs
EOF
这扩展了您的fstab
,而无需担心意外修改其任何内容。对上述答案进行了一点扩展。尾随的
将输入定向到文件中,覆盖现有内容。但是,一个特别方便的用法是双箭头>
,它将新内容添加到文件末尾,如:
cat <<EOF >> /etc/fstab
data_server:/var/sharedServer/authority/cert /var/sharedFolder/sometin/authority/cert nfs
data_server:/var/sharedServer/cert /var/sharedFolder/sometin/vsdc/cert nfs
EOF
cat/etc/fstab
数据服务器:/var/sharedServer/authority/cert/var/sharedFolder/sometin/authority/cert nfs
数据服务器:/var/sharedServer/cert/var/sharedFolder/sometin/vsdc/cert-nfs
EOF
这扩展了您的fstab
,而无需担心意外修改它的任何内容。长话短说,EOF
标记(但也可以使用不同的文字)是一种heredoc格式,允许您以多行形式提供输入。
许多困惑源于cat
的实际工作原理。
您可以将cat
与>
或>
一起使用,如下所示:
[n]<<word
here-document
delimiter
$ cat >> temp.txt
line 1
line 2
当手动写入控制台时,cat
可以通过这种方式使用,但如果我想以更具声明性的方式提供输入,以便工具重用,并保留缩进、空白等,则不方便。
herdoc允许定义整个输入,就像您不是在使用stdin
而是在单独的文本编辑器中键入一样。这就是第条的意思:
它是源代码文件的一部分,被视为
单独的文件
长话短说,EOF
标记(但也可以使用不同的文字)是一种heredoc格式,允许您以多行形式提供输入。
许多困惑源于cat
的实际工作原理。
您可以将cat
与>
或>
一起使用,如下所示:
[n]<<word
here-document
delimiter
$ cat >> temp.txt
line 1
line 2
当手动写入控制台时,cat
可以通过这种方式使用,但如果我想以更具声明性的方式提供输入,以便工具重用,并保留缩进、空白等,则不方便。
herdoc允许定义整个输入,就像您不是在使用stdin
而是在单独的文本编辑器中键入一样。这就是第条的意思:
它是源代码文件的一部分,被视为
单独的文件
这可能是对cat
的无用使用。请尝试psql。。。我很惊讶它能和猫一起工作,但不能
$ sudo tee <<EOF /etc/somedir/foo.conf >/dev/null
# my config file
foo=bar
EOF
<<test > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
test
cat <<test > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
test
export postgres_db_name='my_db'
export table_name='my_table_name'
# start copy
while read -r c; do test -z "$c" || echo $table_name.$c , ; done < <(cat << EOF | psql -t -q -d $postgres_db_name -v table_name="${table_name:-}"
SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'public'
AND table_name =:'table_name' ;
EOF
)
# stop copy , now paste straight into the bash shell ...
output:
my_table_name.guid ,
my_table_name.id ,
my_table_name.level ,
my_table_name.seq ,
while read -r c; do test -z "$c" || echo $table_name.$c , | perl -ne
's/\n//gm;print' ; done < <(cat << EOF | psql -t -q -d $postgres_db_name -v table_name="${table_name:-}"
SELECT column_name
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'public'
AND table_name =:'table_name' ;
EOF
)
# output: daily_issues.guid ,daily_issues.id ,daily_issues.level ,daily_issues.seq ,daily_issues.prio ,daily_issues.weight ,daily_issues.status ,daily_issues.category ,daily_issues.name ,daily_issues.description ,daily_issues.type ,daily_issues.owner
cat <<EOF >> /etc/fstab
data_server:/var/sharedServer/authority/cert /var/sharedFolder/sometin/authority/cert nfs
data_server:/var/sharedServer/cert /var/sharedFolder/sometin/vsdc/cert nfs
EOF
$ cat >> temp.txt
line 1
line 2