Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux “怎么做?”;猫<&书信电报;EOF";在bash工作?_Linux_Bash_Scripting_Heredoc - Fatal编程技术网

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