我需要 /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)
这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。
谢谢。
我想要一个脚本来告诉我过去 5 分钟的平均 CPU 使用率(并且每 5 分钟重复一次,可能作为 cron 作业)。
/proc/stat自系统启动以来只有计数器,我想避免开发一个完整的程序来解析和采样它。top似乎只是在显示/写入表格之前报告使用情况(秒?)。
sysstat/sar 看起来很有希望,但看起来我总是会失去午夜价值,看看是什么sar -u给了我......
我有一点问题:我的/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于所有相关文件。
可能是什么问题呢?
我想循环文件
for f in `grep -rsl "foo" . `: do sed -i -- "s/foo/bar/g" $f; done;
但由于文件名包含空格,因此只要找到空格,就会拆分文件名。
如何将文件名及其空格传递给do块?
我写了一个脚本来转换文件夹中的图像。该脚本使用 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 首先运行。
我想$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,但对通用解决方案感兴趣。
我的机器上安装了 Ubuntu 15.04。当前终端错误消息不是英文的(实际上它们是俄文的)。
例如,
$ mmmm
mmmm: ??????? ?? ???????
Run Code Online (Sandbox Code Playgroud)
我想看看
$ mmmm
mmmmm: command was not found
Run Code Online (Sandbox Code Playgroud)
为这个 SO 帖子提供的解决方案对我不起作用。
我有一个从文件名中提取的日期/时间字符串。我知道时间戳是使用时区 A 编写的,我需要将其转换为时区 B 以进行进一步处理。这在 bash 中可能吗?
例如:
filenameTimestamp="2015-01-20 18:05:02"
timezoneA="Australia/Sydney"
timezoneB="Australia/Brisbane"
Run Code Online (Sandbox Code Playgroud)
我假设我必须使用时区 A 解析字符串,然后使用时区 B 将其再次输出到字符串。
我注意到如果我输入:
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提供env和env | cat,但我得到的是相同的。答案在别处。我想不通在哪里。
从这个问题我发现我可以使用isatty()谁提供这个功能?它是外壳还是内核的一部分?通过进一步我看到这个函数是 POSIX 标准的一部分。
现在我知道我有两个进程可以通过几种机制在它们之间进行通信:
Bash 和 ls 都是程序。因此他们只能使用列出的机制来交换信息。
这背后的真正问题是如何isatty()从 bash 获取信息?
我已经设置.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。