我正在尝试设置 bash 完成脚本,但遇到了一些麻烦。
我想设置它,以便列出的补全是匹配特定扩展名的文件或目录(可能包含也可能不包含该扩展名的文件)。
我遇到的问题是,我可以获得包含文件和目录的-o plusdirs -f -X '!*.txt'补全的唯一方法是使用类似的东西,但是当我让 bash 完成其中一个目录时,它只会在末尾添加一个空格,而不是削减。
_xyz()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
#COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o dirnames -f -X '!*.txt' -- $cur ) )
COMPREPLY=( $( compgen -o plusdirs -f -X '!*.txt' -- $cur ) )
return 0
} …Run Code Online (Sandbox Code Playgroud) 为什么下面的命令不退出?而不是退出,循环无限期地运行。
虽然我使用更复杂的设置发现了这种行为,但该命令的最简单形式简化为以下形式。
不退出:
while /usr/bin/true ; do echo "ok" | cat ; done | exit 1
Run Code Online (Sandbox Code Playgroud)
上面没有错别字。每个'|' 是一个管道。“exit 1”代表另一个运行并退出的进程。
我希望“exit 1”在 while 循环中引起 SIGPIPE(在没有读取器的管道上写入)并导致循环中断。但是,循环继续运行。
为什么命令不停止?
您好,如何使用 Bash将n字节从一个文件写入新文件k?
可能我们正在处理二进制文件而不是 ASCII 文件,因此两半的连接应该与原始文件相同!
(有可能dd吗?)
当我想对文件中的每一行做一些事情时,我通常会写
cat my_file | while read a
do
gzip "$a"
done
Run Code Online (Sandbox Code Playgroud)
gzip 只是一个例子,它可以是任何东西。
我想知道的是是否有另一种方法来获取线条而不是cat file | while read?
为什么以下两次执行的输出不同?(我的最终命令中的变量需要双引号)
$ sudo su -c "echo `cat /root/root_file`"
cat: /root/root_file: Permission denied
$ sudo su -c 'echo `cat /root/root_file`'
Yay, highly classified content!
Run Code Online (Sandbox Code Playgroud) 语境:
用户向我提供他们的自定义脚本来运行。这些脚本可以是任何类型的脚本,例如启动多个 GUI 程序、后端服务的脚本。我无法控制脚本的编写方式。这些脚本可以是阻塞类型,即执行等待直到所有子进程(顺序运行的程序)退出
#exaple of blocking script
echo "START"
first_program
second_program
echo "DONE"
Run Code Online (Sandbox Code Playgroud)
或非阻塞类型,即在后台分叉子进程并退出类似的类型
#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"
Run Code Online (Sandbox Code Playgroud)
我想要达到什么目标?
用户提供的脚本可以是上述两种类型中的任何一种,也可以是两者的混合。我的工作是运行脚本并等待它启动的所有进程退出,然后关闭节点。如果它是阻塞类型,情况很简单,即获取脚本执行进程的 PID 并等待 ps -ef|grep -ef PID 没有更多条目。非阻塞脚本给我带来了麻烦
有没有办法获得通过执行脚本产生的所有子进程的 PID 列表?任何指针或提示将不胜感激
我必须比较多个文件,而且我不想一直在两个地方更改命令。所以我想在 bash 中创建一个别名。
alias gd='gvimdiff $1 dir/$1'
Run Code Online (Sandbox Code Playgroud)
这样我就可以得到
gvimdiff res.tex dir/res.tex
Run Code Online (Sandbox Code Playgroud)
只需输入
gd res.tex
Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要使用 执行的脚本source,因为它的任务是修改环境。在脚本期间,我想使用set -e以便任何错误停止脚本。该脚本如下所示:
#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Run Code Online (Sandbox Code Playgroud)
问题是set -e在脚本完成后自然保持有效。set当脚本停止时(以任何方式 - 成功完成或出错),我如何确保更改的选项正确恢复到其先前的值?
我想了解更多关于文件访问时间和文件修改时间如何与目录访问和修改时间相关的信息。
我确实阅读了“此处允许的问题”,但如果有针对此问题的更好的 StackExchange 站点,请告诉我。这不是 Ubuntu 系统,所以 askubuntu.com 已出局。
系统:
问题:我想制作一个 bash 脚本,从运行脚本的当前目录开始,我想列出至少 300 天没有修改的目录和子目录。我正在检查的这些目录包含的文件的修改时间可能晚于目录修改时间。我只想列出包含“JOB”而不是“DIV”的目录名称,区分大小写。
注意:我们的目录是这样排列的:CLS_xxx 目录将包含许多 GRP_xxx 目录。GRP_xxx 目录将包含许多 JOB_xxx 目录。JOB_dirs 可能包含许多 DIV_xxx 目录。因此,虽然我可能位于包含所有 CLS 目录的目录中,但我只想显示包含 JOB 的目录。
/path/to/containerdir/
CLS_xxx/
GRP_xxx/
JOB_xxx/
Files under here might be modified later than the JOB_xxx dir.
DIV_xxx/
files under DIV/ might be modified later than the JOB_xxx dir.
Run Code Online (Sandbox Code Playgroud)
清如泥?:)
问题:
我正在阅读查找手册页,但没有找到我的答案。我还从我的 Google 搜索中阅读了大约 8 页find,但也没有在那里找到我的答案。 …
好吧,苏,我有一个有趣的坚果要破解。
我有 8 个屏幕排成一行,全部连接到一个运行 Snow Leopard 的强大 G5(是的,4 个显卡;大约 15,000 像素宽!)。我正在设置一个演示,它使用 8 个全屏 Chrome 浏览器窗口,每个窗口都指向不同的 URL。每次重新启动计算机时手动执行此操作很麻烦。
鉴于此设置,我想编写一个脚本来自动:
我没有使用过 automator,我对 shell 脚本也不是特别熟悉,但我想知道是否有来自人群的任何奇特的建议。
更新:即使我需要将 Automator 用于高级功能,我最终还是希望有一种方法可以从命令行/脚本触发脚本。如果需要,我希望能够从 shell 远程打开这个演示。
bash-scripting ×10
bash ×8
linux ×3
shell ×3
applescript ×1
automator ×1
binary-files ×1
command-line ×1
find ×1
macos ×1
permissions ×1
process ×1
script ×1
sudo ×1
unix ×1