我的路上有一个程序。程序在使用指定的完整路径执行时运行。但是当我只用它的名字运行它时,找不到该程序。
本质上,我想了解以下输出是如何可能的,以及如何修复它,以便在没有指定完整路径的情况下实际上可以找到我的程序:
root:/usr/local/bin# ./siege
****************************************************
siege: could not open /usr/local/bin/etc/siegerc
run 'siege.config' to generate a new .siegerc file
****************************************************
root:/usr/local/bin# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root:/usr/local/bin# siege
bash: /usr/bin/siege: No such file or directory
root:/usr/local/bin# wtf!?!?
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 12.04 上使用 bash。另请注意,siege 的警告输出与此问题的目的无关,因为我只对是否可以找到并调用该程序感兴趣。
我刚刚发现了set -o vi
.
例如,创建自定义键绑定以将更方便的键或键组合映射到esc
?
如果当前不支持,在某些自定义中更改程序的源代码和硬编码会有多困难,或者这是否是一个坏主意?
我浏览了这篇文章,其中解释了检查 RAM 使用情况的各种方法。但是,我无法调和不同的方法,也不知道哪一种是正确的。
当我第一次登录时,我会看到这样的屏幕:
System information as of Sun Apr 28 21:46:58 UTC 2013
System load: 0.0 Processes: 76
Usage of /: 15.6% of 7.87GB Users logged in: 1
Memory usage: 41% IP address for eth0:
Swap usage: 0%
Run Code Online (Sandbox Code Playgroud)
这向我表明我使用了 41% 的 RAM,这看起来相当高,因为服务器没有做太多事情。还是该数字指的是 RAM 之外的其他内容?
接下来我试试这个free -m
方法:
ubuntu@ip-:~$ free -m
total used free shared buffers cached
Mem: 590 513 76 0 67 315
-/+ buffers/cache: 130 459
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
根据文章中的说明图,这意味着我有 130MB 的已用 RAM 和 …
考虑这个脚本:
tmpfile=$(mktemp)
cat <<EOS > "$tmpfile"
line 1
line 2
line 3
EOS
cat <(tail -1 "$tmpfile") "$tmpfile"
Run Code Online (Sandbox Code Playgroud)
这有效并输出:
line 3
line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)
假设我们的输入源不是实际文件,而是标准输入:
cat <<EOS | # what goes here now?
line 1
line 2
line 3
EOS
Run Code Online (Sandbox Code Playgroud)
我们如何修改命令:
cat <(tail -1 "$tmpfile") "$tmpfile"
Run Code Online (Sandbox Code Playgroud)
这样它在不同的上下文中仍然产生相同的输出?
注意:我正在寻找的特定 Heredoc 以及 Heredoc 本身的使用仅是说明性的。任何可接受的答案都应该假设它通过 stdin 接收任意数据。
一个例子应该澄清我的问题。这种行为对我来说很有意义:
$ echo hi | cat
hi
$ echo hi | tee >(cat)
hi
hi
Run Code Online (Sandbox Code Playgroud)
第一种情况是显而易见的。在第二种情况下,我们使用命令替换将“hi”通过管道传输到 tee,一个“hi”由tee
'dcat
打印,而另一个由tee
's pass through pipe打印。到现在为止还挺好...
但是在这种情况下,第一个“hi”会发生什么:
$ echo hi | tee >(echo yo)
yo
Run Code Online (Sandbox Code Playgroud)
返回码是 141,管道失败。什么可能导致这种情况?
我正在运行 Mac OSX El Capitain,在默认终端应用程序中运行 bash
什么条件解释了这个输出:
root@ip:/# find / -name "server.xml" -print
/etc/tomcat7/server.xml
root@ip:/# ls /var/lib/tomcat7/conf/server.xml
/var/lib/tomcat7/conf/server.xml
Run Code Online (Sandbox Code Playgroud)
我以 root 身份运行它,并从根目录开始查找。我不明白为什么我用“ls”命令显示的文件没有出现在结果中。
的输出mount
:
/dev/xvda1 on / type ext4 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none …
Run Code Online (Sandbox Code Playgroud) 我的目标最好通过例子来解释。首先,这是一个将在 stdout 和 stderr 上生成示例输出的函数:
output() {
printf '%s\n' 1 2
printf '%s\n' errA errB 1>&2
printf '%s\n' 3 4
}
Run Code Online (Sandbox Code Playgroud)
如果您单独运行它,两个流都将按执行顺序打印到终端:
$ output
1
2
errA
errB
3
4
Run Code Online (Sandbox Code Playgroud)
现在这个函数只是一个占位符,代表我们希望记录的任意脚本的输出(stdout 和 stderr)。具体来说,我们要创建三个不同的日志:
我想出的最接近的解决方案是:
$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both err out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err …
Run Code Online (Sandbox Code Playgroud)