我们最近在这里看到了一些使用此的帖子:
var=$(</dev/stdin)
Run Code Online (Sandbox Code Playgroud)
尝试将 shell 的标准输入读入变量。
然而,至少在基于 Linux 的系统和 Cygwin 上这不是正确的方法。
为什么?正确的方法有哪些?
我有一个必须在 linux 和 solaris 上运行的 ksh 脚本。我正在尝试为特定命令的输出着色。它适用于 linux(特别是 RHEL6),但不适用于 solaris(SunOS 5.10)。
linux 上的命令(输出“test”正确着色为红色):
[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test
Run Code Online (Sandbox Code Playgroud)
在solaris 上的命令(输出“test”没有颜色):
[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m
Run Code Online (Sandbox Code Playgroud)
有没有办法制作此命令,使输出为红色,而输出中没有原始代码?我无法更改“echo”命令,因为这只是我实际运行的命令的填充。
我有一个包含大量文件的目录(例如一年中每一天的日志)。我想删除在 22/11 之前创建的所有文件。我怎样才能做到这一点?我必须使用findthen exec-rm吗?我正在使用 ksh。
我确定它相对简单,我只是不知道该怎么做。
#!/usr/bin/ksh
set `iostat`
myvar=6
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西echo ${$myvar},我想解释为${$myvar}-> ${6}->value
我在 Solaris 10 上使用 ksh (88)、bash (3.00) 和 zsh (4.2.1) 测试了以下内容。
以下代码不会产生任何结果:
function foo {
echo "Hello World"
}
find somedir -exec foo \;
Run Code Online (Sandbox Code Playgroud)
这一发现不匹配多个文件(如更换-exec ...用-print),并从外面叫时功能完美的作品find调用。
以下是该man find页面的内容-exec:
-exec command 如果执行的命令返回一个,则为真
零值作为退出状态。结尾
命令必须以转义字符作为标点
分号 (;)。命令参数 {} 是
替换为当前路径名。如果
-exec 的最后一个参数是 {} 而你
指定 + 而不是分号 (;),
命令被调用的次数更少,
{} 替换为路径名组。如果
命令的任何调用都会返回一个
非零值作为退出状态,找到
返回非零退出状态。
我可能会做这样的事情:
for f in $(find somedir); do
foo
done
Run Code Online (Sandbox Code Playgroud)
但我害怕处理字段分隔符问题。
是否可以从调用中调用 shell 函数(在同一个脚本中定义,让我们不要理会范围问题)find ... -exec ...? …
在我的测试中(在 Bash 和 Z Shell 中),我发现定义函数或别名或名称中带有连字符的可执行 shell 脚本没有任何问题,但我不确定这在所有 shell 和所有用例中都没有问题.
我想这样做的原因是连字符比下划线更容易输入,因此更快更流畅。
我不愿相信这不是问题的一个原因是,在某些语言(例如 Ruby)中,即使没有空格,连字符也会被解释为减号。如果在某些 shell 中可能发生这样的事情,我不会感到惊讶,即使没有空格,连字符也被解释为表示选项。
我有点怀疑的另一个原因是我的文本编辑器搞砸了带有连字符的函数的语法突出显示。(当然,这完全有可能只是 shell 脚本的语法高亮配置中的一个错误。)
有什么理由避免使用连字符吗?
我的要求是以小时为单位获得 2 个时间戳的差异。
由于日期差异选项需要很长时间才能弄清楚我正在尝试将两个日期转换为 YYYYMMDDHHMMSS 格式并找到数字差异。所以我需要以相同的格式获取当前日期和时间。
我被要求编写一个 shell 脚本来检查我的项目的 URL 是否已启动/工作。
我试图在互联网上找到一些提示,但我得到的都是关于检查 URL 是否存在。
我第一次尝试使用wget.
wget -S --spider https://genesis-dev.webbank.ssmb.com:21589/gop-ui/app.jsp 2>&1 | awk '/^ /'
if [ $? -ne 0 ]
then echo "Server is UP"
else
echo "Server is down"
fi
Run Code Online (Sandbox Code Playgroud)
我的下一次尝试是使用curl.
curl -ivs https://genesis-dev.webbank.ssmb.com:21589/opconsole-sit/opconsole.html#
if [ $? -ne 0 ]
then echo "Server is UP"
else
echo "Server is down"
fi
Run Code Online (Sandbox Code Playgroud)
但是,两者都在检查 URL 的存在而不是响应。
我刚刚打开了一个旧的 shell 脚本(在 Solaris 上用旧的 ksh88 编写),发现在整个代码中重复了以下内容:
[ -f $myfile ] && \rm -f $myfile
Run Code Online (Sandbox Code Playgroud)
转义的反斜杠让我觉得很奇怪。
我知道这是故意的,因为这种(显然无用的)转义在整个代码中都重复出现。原作者早就不在了,我联系不上他问他了。
这仅仅是作者的一个有趣的特质,还是某种在某个时间点有意义的已弃用的良好做法?或者也许实际上是推荐的做事方式而我完全错过了一些东西?