Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
运行traceroute和traceroute6的最短shell代码_Shell_Perl_Xargs_Tcsh - Fatal编程技术网

运行traceroute和traceroute6的最短shell代码

运行traceroute和traceroute6的最短shell代码,shell,perl,xargs,tcsh,Shell,Perl,Xargs,Tcsh,我想在shell脚本中依次运行traceroute-w2和traceroute6-w2,以尝试多个不同的主机 一种简单的方法可能只是使用一个临时变量来收集其中的所有主机,例如,将hosts设置为ordns.he.net one.one.one.one.one google-public-dns-A.google.com,然后将其单独传输到每个命令,例如echo$hosts | xargs-n1 traceroute-w2等,但这在tcsh中的工作方式与在bash中不同,如果你想添加更多的命令,而

我想在shell脚本中依次运行traceroute-w2和traceroute6-w2,以尝试多个不同的主机

一种简单的方法可能只是使用一个临时变量来收集其中的所有主机,例如,将hosts设置为ordns.he.net one.one.one.one.one google-public-dns-A.google.com,然后将其单独传输到每个命令,例如echo$hosts | xargs-n1 traceroute-w2等,但这在tcsh中的工作方式与在bash中不同,如果你想添加更多的命令,而不是一系列要做的事情,那么你可能会犯错误。我认为有更好的方法将命令列表连接在一起,例如,一个命令名和一个参数列表,例如,我们示例中的主机名,让shell执行所有可能的组合

我尝试过将主机的xargs-n1和命令的xargs-n2与一个参数管道连接在一起,但这没有多大意义,也不起作用

我正在寻找一个不使用任何GNU工具的解决方案,如果需要,它可以在基本OpenBSD安装中工作,perl是基本OpenBSD的一部分,因此,它也是可用的。

保持简单:

#!/bin/sh
set -- host1 host2 host3 host4 ...
for host do traceroute -w2 -- "$host"; done
for host do traceroute6 -w2 -- "$host"; done
保持简单:

#!/bin/sh
set -- host1 host2 host3 host4 ...
for host do traceroute -w2 -- "$host"; done
for host do traceroute6 -w2 -- "$host"; done
如果您有perl:

perl -e 'for(@ARGV){ print qx{  traceroute -w2 -- $_; traceroute6 -w2 -- $_ } }' google.com debian.org
至于将命令列表(例如,带有单个参数的命令名)与参数列表(例如,主机名)连接在一起的更好方法,答案可以是GNU Parallel,它就是为了这样做而构建的:

parallel "{1}" -w2 -- "{2}" ::: traceroute traceroute6 ::: google.com debian.org
如果要将特殊参数连接到每个命令,可以执行以下操作:

parallel eval "{1}" -- "{2}" ::: "traceroute -a -w2" "traceroute6 -w2" ::: google.com debian.org
之所以需要eval,是因为GNU并行引用所有输入,虽然您通常希望这样,但在本例中我们不希望这样

但是,因为这是一个GNU工具,所以它超出了您的问题范围。这里只包括阅读您的问题的其他人以及没有此限制的人。

如果您有perl:

perl -e 'for(@ARGV){ print qx{  traceroute -w2 -- $_; traceroute6 -w2 -- $_ } }' google.com debian.org
至于将命令列表(例如,带有单个参数的命令名)与参数列表(例如,主机名)连接在一起的更好方法,答案可以是GNU Parallel,它就是为了这样做而构建的:

parallel "{1}" -w2 -- "{2}" ::: traceroute traceroute6 ::: google.com debian.org
如果要将特殊参数连接到每个命令,可以执行以下操作:

parallel eval "{1}" -- "{2}" ::: "traceroute -a -w2" "traceroute6 -w2" ::: google.com debian.org
之所以需要eval,是因为GNU并行引用所有输入,虽然您通常希望这样,但在本例中我们不希望这样

但是,因为这是一个GNU工具,所以它超出了您的问题范围。此处仅为阅读您的问题且没有此限制的其他人提供此信息。

使用语法和OS X traceroute和traceroute6,关键问题的最终解决方案类似于以下代码片段:

历史1;并行-保持秩序-j4 eval\{1}-w1-{2}'2>&1'::traceroute-a-f1 traceroute6:::ordns.he.net ns{1,2,3,4,5}.he.net one.one.one.one google-public-dns-a.google.com resolver1.opendns.com;历史1 |&邮件-s跟踪路由:ordns.he.net等,来自Xreceipient@example.org-fsender@example.org

使用,关键问题的最终解决方案类似于以下代码段,使用语法和OS X traceroute和traceroute6:


历史1;并行-保持秩序-j4 eval\{1}-w1-{2}'2>&1'::traceroute-a-f1 traceroute6:::ordns.he.net ns{1,2,3,4,5}.he.net one.one.one.one google-public-dns-a.google.com resolver1.opendns.com;历史1 |&邮件-s跟踪路由:ordns.he.net等,来自Xreceipient@example.org-fsender@example.org

当OpenBSD有一个非常好的POSIX sh时,为什么tcsh会涉及这个问题?csh是前POSIX时代的遗物,也就是说,1992年之前的伯恩没有足够的功能集,ksh获得了商业许可并花费了大量资金;这两件事几十年来都不是真的……更大的问题是:在shell语言中优化简洁而不是正确性通常是个坏主意。shell中有很多历史包袱——几乎是受上世纪70年代shell启发或试图与之向后兼容的完整语言家族——围绕它工作通常会让一些包袱成为必须的。@CharlesDuffy这是因为我使用tcsh作为我的主shell我喜欢FreeBSD默认的在我的系统上向后搜索bindkey-k的历史记录,这是我的系统的一个片段shell@cnst我还使用tcsh作为我的命令行解释器,为日常工作提供了一些便利,其中一个是您提到的我将它绑定到了Ctrl-P。但是我正在考虑改用bash,因为它还有许多其他优点。但是我有一个~/bin,其中有各种实用程序,其中大部分是bash脚本和一些Perl脚本,还有一些通过precmd和periodshell特性工作的C程序。您不必为此绑定到tcsh,而且这看起来只是一个可以在一个好的li'l脚本中完成的事情。解决某些与tcsh不兼容的问题的简单方法是不使用tcsh。为什么在OpenBSD有一个

完美的POSIX sh?csh是前POSIX时代的遗物,也就是说,1992年之前的伯恩没有足够的功能集,ksh获得了商业许可并花费了大量资金;这两件事几十年来都不是真的……更大的问题是:在shell语言中优化简洁而不是正确性通常是个坏主意。shell中有很多历史包袱——几乎是受上世纪70年代shell启发或试图与之向后兼容的完整语言家族——围绕它工作通常会让一些包袱成为必须的。@CharlesDuffy这是因为我使用tcsh作为我的主shell我喜欢FreeBSD默认的在我的系统上向后搜索bindkey-k的历史记录,这是我的系统的一个片段shell@cnst我还使用tcsh作为我的命令行解释器,为日常工作提供了一些便利,其中一个是您提到的我将它绑定到了Ctrl-P。但是我正在考虑改用bash,因为它还有许多其他优点。但是我有一个~/bin,其中有各种实用程序,其中大部分是bash脚本和一些Perl脚本,还有一些通过precmd和periodshell特性工作的C程序。您不必为此与tcsh绑定,这看起来只是一个很好的li'l脚本可以完成的事情。对于某些与tcsh不兼容的事情,简单的解决方案是不使用tcsh。这不是一个答案,因为,1,它需要sh,2,它已经作为问题的一部分而为人所知。另外,它几乎不是一个可以复制粘贴到shell中的片段,这就是问题的全部目的。您使用的shell标记是用于POSIX sh的,根据您的规范,OpenBSD附带了它。我一遍又一遍地读这个问题,没有发现任何证据。我想他从来没有了解过你…@cnst就我而言,这肯定是一个很好的答案,表明了我该走哪条路。当然,你有权不喜欢它,但你对它的反应是粗鲁的。@cnst,-是选项结束符,如10中所标准化的:第一个-参数不是选项参数,应该被接受为指示选项结束的分隔符。以下任何参数都应视为操作数,即使它们以-字符开头。-因此,它可以防止以破折号开头的主机名被视为traceroute的单个字符选项的集合。这不是一个答案,因为,1,它需要sh,2,它已经作为问题的一部分。另外,它几乎不是一个可以复制粘贴到shell中的片段,这就是问题的全部目的。您使用的shell标记是用于POSIX sh的,根据您的规范,OpenBSD附带了它。我一遍又一遍地读这个问题,没有发现任何证据。我想他从来没有了解过你…@cnst就我而言,这肯定是一个很好的答案,表明了我该走哪条路。当然,你有权不喜欢它,但你对它的反应是粗鲁的。@cnst,-是选项结束符,如10中所标准化的:第一个-参数不是选项参数,应该被接受为指示选项结束的分隔符。以下任何参数都应视为操作数,即使它们以-字符开头。-因此,它可以防止以破折号开头的主机名被视为traceroute的单个字符选项的集合!几年前,我在一些早期项目中使用过它:是否有{1}的替代方案?它在tcsh中扩展为1,\{1}有点难看。此外,我似乎得到了一些无序的输出,例如,我从输出底部的traceroute6得到了一些初始横幅,例如,运行您的示例以以下行结束:traceroute6到google.com 2607:f8b0:4005:809::200e从2607:fb90:…,你可以通过引用来避免tcsh的解释。{1} 或{1}或引用整个字符串。故障可能是打印到stderr和stdout的traceroute。GNU并行先打印标准输出,然后打印标准输出。您可以通过在命令中将stderr重定向到stdout来避免这种情况。那么,如何将stderr/stdout合并/重定向作为parallel的一部分呢?最初的问题陈述怎么样?我可以有一个每个都有一个参数的命令列表吗?例如,也许traceroute需要-aw2,但traceroute6不支持-a,所以只得到-w2?有什么方法可以做到这一点吗?好的,看起来像是以下工作:并行评估\{1}-w2-\{2}'2>&1'::跟踪路由-a跟踪路由6:::ordns.he.net one.one.one.one.one。有点毛茸茸的,但我想它确实管用,而且很短-使用-保持秩序谢谢你的工具!几年前,我在一些早期项目中使用过它:是否有{1}的替代方案?它在tcsh中扩展为1,\{1}有点难看。另外,我似乎得到了一些无序的输出,例如,我从输出底部的traceroute6得到了一些初始横幅,例如,运行您的示例结束
使用以下行:traceroute6 to google.com 2607:f8b0:4005:809::200e from 2607:fb90:…,这似乎不合适,也不符合顺序。您可以通过引用。{1} 或{1}或引用整个字符串。故障可能是打印到stderr和stdout的traceroute。GNU并行先打印标准输出,然后打印标准输出。您可以通过在命令中将stderr重定向到stdout来避免这种情况。那么,如何将stderr/stdout合并/重定向作为parallel的一部分呢?最初的问题陈述怎么样?我可以有一个每个都有一个参数的命令列表吗?例如,也许traceroute需要-aw2,但traceroute6不支持-a,所以只得到-w2?有什么方法可以做到这一点吗?好的,看起来像是以下工作:并行评估\{1}-w2-\{2}'2>&1'::跟踪路由-a跟踪路由6:::ordns.he.net one.one.one.one.one。有点毛茸茸的,但我想它确实管用,而且很短-使用-维持秩序