标签: bash

bash 完成:从定义的目录中列出目录名称?

我需要 /mailman/lists 中的目录名称作为参数(不带任何斜线)以制表符完成作为“list_members”命令的参数,而不管我在文件系统中的哪个位置。

在 tcsh(在我们的旧服务器上),我写了一行来做我需要的:

complete list_members 'p,*,F:/mailman/lists,,' #tcsh
Run Code Online (Sandbox Code Playgroud)

bash 的实现似乎更复杂。如何使用 bash 实现相同的行为?

制表符补全需要上下文相关,以便我已经输入的参数的任何部分缩小搜索范围,就像标准的 bash 补全一样。例子:

list_members sys<TAB> #only shows names beginning with sys
Run Code Online (Sandbox Code Playgroud)

在查看示例后,我尝试了一些解决方案,但它们无法正常工作。

一个失败的例子:

function _listlists()
{
    COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}

complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

-bash: compgen: warning: -C option may not work as you expect
Run Code Online (Sandbox Code Playgroud)

另一个失败的例子:

function _listlists()
{
    cd /mailman/lists
    COMPREPLY=( $( compgen -d ) )
    cd -
}

complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)

这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。

谢谢。

bash tab-completion mailman

5
推荐指数
1
解决办法
1716
查看次数

Linux:获取过去 n 分钟的 CPU 使用率

我想要一个脚本来告诉我过去 5 分钟的平均 CPU 使用率(并且每 5 分钟重复一次,可能作为 cron 作业)。

/proc/stat自系统启动以来只有计数器,我想避免开发一个完整的程序来解析和采样它。top似乎只是在显示/写入表格之前报告使用情况(秒?)。

sysstat/sar 看起来很有希望,但看起来我总是会失去午夜价值,看看是什么sar -u给了我......

linux cpu-usage bash

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

登录时未获取 /etc/profile

我有一点问题:我的/etc/profile/etc/environment在登录时都没有获得来源!

即:启动后,我设置的全局变量/etc/profile/etc/profile.d/*.sh因此)或/etc/environment不被其他 GUI 应用程序或终端上的bash识别。

请注意,我正在运行 Linux Mint 17 Cinnamon 版本,默认情况下,它确实提供了该/etc/profile文件的来源。

文件权限适用-rw-r--r-- 1 root root于所有相关文件。

可能是什么问题呢?

linux bash

5
推荐指数
2
解决办法
5553
查看次数

grep -l 输出带空格的文件名

我想循环文件

for f in `grep -rsl "foo" . `: do sed -i -- "s/foo/bar/g" $f; done;

但由于文件名包含空格,因此只要找到空格,就会拆分文件名。

如何将文件名及其空格传递给do块?

bash grep path sed

5
推荐指数
1
解决办法
2385
查看次数

在 bash for 循环中列出多种文件类型

我写了一个脚本来转换文件夹中的图像。该脚本使用 for 循环:

我=“1”
对于 *.jpg 格式的文件;做
     outputFile=$(echo "image"$(echo $i))
     转换 "$file" -resize 50x50 $outputFile
     i=$[i+1]
完毕

我想要做的是允许脚本在多个文件类型扩展名上运行。现在我试过这样做:

对于 *.jpg *.JPG *.jpeg 格式的文件;做
....
完毕

我遇到的问题是,如果您在一个包含所有 *.JPG 而没有 *.jpg 的文件夹中,即使没有图像,脚本仍然会碰撞 i+1,因为它无论如何都会运行 for 循环,但找不到任何 *.jpg 都会转到 *.JPG。

如何定位多个文件扩展名而不按类型自行运行?例如,它们的语法是这样的:

用于 [*.jpg | 中的文件 *.JPG]; 做
...

?
这样我的输出文件夹总是包含像这样标记的图像:
image1.jpg
image2.jpg
image3.jpg
等等。而不是以

一个文件夹缺少 image1.jpg 结束,因为它没有 *.jpg 首先运行。

bash bash-scripting

5
推荐指数
2
解决办法
9590
查看次数

我可以根据我的 cwd 动态更改我的 PATH 吗?

我想$PATH根据我当前的工作目录更改我的环境变量。

假设我在/foo/bar/baz,我有目录/foo/node_modules/.bin/foo/bar/baz/node_modules/.bin. 我想将所有可能的./node_modules/.bin递归添加到$PATH.

但是当我cd进入不同的目录(如/foo/bar)时,我希望$PATH恢复我原来的、干净的,然后再次开始./node_modules/.bin递归查找。

(我想从 npm 的问题跟踪器中解决我自己的问题:我们也可以将本地安装的包添加到 PATH 中吗?

注意:我使用的是 Mac,但对通用解决方案感兴趣。

linux bash shell path environment-variables

5
推荐指数
1
解决办法
3233
查看次数

终端错误消息不是英文的

我的机器上安装了 Ubuntu 15.04。当前终端错误消息不是英文的(实际上它们是俄文的)。

例如,

$ mmmm
mmmm: ??????? ?? ???????
Run Code Online (Sandbox Code Playgroud)

我想看看

$ mmmm
mmmmm: command was not found
Run Code Online (Sandbox Code Playgroud)

这个 SO 帖子提供的解决方案对我不起作用。

linux terminal language bash ubuntu

5
推荐指数
1
解决办法
358
查看次数

在bash中转换时间戳字符串的时区

我有一个从文件名中提取的日期/时间字符串。我知道时间戳是使用时区 A 编写的,我需要将其转换为时区 B 以进行进一步处理。这在 bash 中可能吗?

例如:

filenameTimestamp="2015-01-20 18:05:02"
timezoneA="Australia/Sydney"
timezoneB="Australia/Brisbane"
Run Code Online (Sandbox Code Playgroud)

我假设我必须使用时区 A 解析字符串,然后使用时区 B 将其再次输出到字符串。

linux bash

5
推荐指数
1
解决办法
4190
查看次数

isatty() 如何从终端获取信息?

我注意到如果我输入:

ls --color=auto
Run Code Online (Sandbox Code Playgroud)

或者

ls --color=auto | cat
ls --color=auto > >(cat)
Run Code Online (Sandbox Code Playgroud)

我没有看到相同的输出。因此我假设一个程序有能力知道它的 STDOUT 是否通过管道传输到某个东西。问题是它是怎么知道的?

我查了ENV VAR提供envenv | cat,但我得到的是相同的。答案在别处。我想不通在哪里。

从这个问题我发现我可以使用isatty()谁提供这个功能?它是外壳还是内核的一部分?通过进一步我看到这个函数是 POSIX 标准的一部分。

现在我知道我有两个进程可以通过几种机制在它们之间进行通信:

  • 标准输入/标准输出/STDERR
  • 退出代码
  • 环境变量
  • 系统调用

Bash 和 ls 都是程序。因此他们只能使用列出的机制来交换信息。

这背后的真正问题是如何isatty()从 bash 获取信息?

linux bash

5
推荐指数
1
解决办法
1939
查看次数

GNU 屏幕退出缓慢

我已经设置.bashrc为自动screen -DRA(即使它是本地会话)。

screen工作正常,除了如果我exit从最后一个窗口运行或以其他方式从客户端本身关闭它,它会在关闭之前暂停大约 20 秒。任何想法为什么?

旁注:我遇到的另一个可能是独立的、可能相关的问题是,每当启动 shell 时,我都会看到消息“从屏幕内部连接?”

我使用的是 Cygwin Setup.exe 版本 2.871(64 位)、GNU bash 4.3.39(2)-release 和 xfce4-terminal 0.6.3。

cygwin bash gnu-screen

5
推荐指数
1
解决办法
133
查看次数