小编Jon*_*nah的帖子

Bash 没有找到程序,即使它在我的路径上

我的路上有一个程序。程序在使用指定的完整路径执行时运行。但是当我只用它的名字运行它时,找不到该程序。

本质上,我想了解以下输出是如何可能的,以及如何修复它,以便在没有指定完整路径的情况下实际上可以找到我的程序:

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 的警告输出与此问题的目的无关,因为我只对是否可以找到并调用该程序感兴趣。

bash path

29
推荐指数
1
解决办法
2万
查看次数

vi shell 模式的自定义键绑定,即“set -o vi”?

我刚刚发现了set -o vi.

例如,创建自定义键绑定以将更方便的键或键组合映射到esc?

如果当前不支持,在某些自定义中更改程序的源代码和硬编码会有多困难,或者这是否是一个坏主意?

bash vi

21
推荐指数
1
解决办法
4221
查看次数

经过研究,仍然对监控内存使用情况感到困惑

我浏览了这篇文章,其中解释了检查 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 和 …

linux memory

10
推荐指数
1
解决办法
841
查看次数

将标准输入的最后一行添加到整个标准输入中

考虑这个脚本:

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 接收任意数据

bash

9
推荐指数
2
解决办法
1053
查看次数

管道输出到三通时管道故障 (141) -- 为什么?

一个例子应该澄清我的问题。这种行为对我来说很有意义:

$ 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

bash tee

8
推荐指数
1
解决办法
8677
查看次数

find 缺少一个结果——这怎么可能?

什么条件解释了这个输出:

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)

find files

6
推荐指数
1
解决办法
193
查看次数

合并 stdout 和 stderr,并分别创建每个的副本

我的目标最好通过例子来解释。首先,这是一个将在 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)。具体来说,我们要创建三个不同的日志:

  1. stdout 和 stderr 的组合执行顺序输出(即上面的输出)。
  2. 只是标准输出
  3. 只是 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)

bash

5
推荐指数
0
解决办法
1097
查看次数

标签 统计

bash ×5

files ×1

find ×1

linux ×1

memory ×1

path ×1

tee ×1

vi ×1