标签: bash-scripting

文件名模式或目录的 bash 补全

我正在尝试设置 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)

bash tab-completion bash-scripting

13
推荐指数
1
解决办法
9942
查看次数

为什么 bash while 循环在管道到终止的子命令时不退出?

为什么下面的命令不退出?而不是退出,循环无限期地运行。

虽然我使用更复杂的设置发现了这种行为,但该命令的最简单形式简化为以下形式。

不退出:

while /usr/bin/true ; do echo "ok" | cat ; done | exit 1
Run Code Online (Sandbox Code Playgroud)

上面没有错别字。每个'|' 是一个管道。“exit 1”代表另一个运行并退出的进程。

我希望“exit 1”在 while 循环中引起 SIGPIPE(在没有读取器的管道上写入)并导致循环中断。但是,循环继续运行。

为什么命令不停止?

linux bash shell command-line bash-scripting

13
推荐指数
1
解决办法
3645
查看次数

在 Bash 中将文件中的 n 个字节写入另一个文件

您好,如何使用 Bash将n字节从一个文件写入新文件k

  • 例如,如果 n=60,k=1 并且文件大小=100,那么:第二个文件将由第一个字节到第 60 个字节组成,大小为 60 个字节
  • 例如,如果 n=40,k=61 和文件大小=100,那么:第二个文件将由第 61 个字节到第 100 个字节组成,大小为 40 个字节

可能我们正在处理二进制文件而不是 ASCII 文件,因此两半的连接应该与原始文件相同!

(有可能dd吗?)

linux file-management bash binary-files bash-scripting

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

在bash中处理文件的每一行

当我想对文件中的每一行做一些事情时,我通常会写

cat my_file | while read a
do
gzip "$a"
done
Run Code Online (Sandbox Code Playgroud)

gzip 只是一个例子,它可以是任何东西。

我想知道的是是否有另一种方法来获取线条而不是cat file | while read?

bash shell bash-scripting

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

在 Bash 中在双引号和单引号中使用反引号时的区别

为什么以下两次执行的输出不同?(我的最终命令中的变量需要双引号)

$ 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)

sudo bash permissions bash-scripting

12
推荐指数
2
解决办法
2190
查看次数

如何获取脚本生成的所有子进程的列表

语境:

用户向我提供他们的自定义脚本来运行。这些脚本可以是任何类型的脚本,例如启动多个 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 列表?任何指针或提示将不胜感激

unix bash shell process bash-scripting

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

如何在带有两个参数的别名中正确使用 $1

我必须比较多个文件,而且我不想一直在两个地方更改命令。所以我想在 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)

linux bash bash-scripting

10
推荐指数
2
解决办法
9182
查看次数

使用“源”运行脚本时如何正确恢复设置?

我正在编写一个需要使用 执行的脚本source,因为它的任务是修改环境。在脚本期间,我想使用set -e以便任何错误停止脚本。该脚本如下所示:

#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Run Code Online (Sandbox Code Playgroud)

问题是set -e在脚本完成后自然保持有效。set当脚本停止时(以任何方式 - 成功完成或出错),我如何确保更改的选项正确恢复到其先前的值?

script bash bash-scripting

10
推荐指数
2
解决办法
3438
查看次数

Linux:文件修改时间如何影响目录修改时间和目录访问时间?

我想了解更多关于文件访问时间和文件修改时间如何与目录访问和修改时间相关的信息。

我确实阅读了“此处允许的问题”,但如果有针对此问题的更好的 StackExchange 站点,请告诉我。这不是 Ubuntu 系统,所以 askubuntu.com 已出局。

系统:

  • 红帽企业 Linux 5.5.56。不,我们不能升级,请不要问这个。
  • 我尝试坚持使用 bash。
  • 查找版本 4.2.27

问题:我想制作一个 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)

清如泥?:)

问题:

  • 如果在名为 JOB_1234 的目录中修改文件,这对目录修改时间有何影响?
  • 更改文件会影响目录访问时间吗?我应该在查找中使用目录访问时间吗?
  • 是否有目录访问时间的开关,因为我在系统的手册页中没有看到一个。
  • 目录修改时间是在什么时候改变的?我们什么时候更改权限呢?更改所有者或组?还要别的吗?
  • 目录访问时间何时更改?当访问或更改目录中的文件时?

我正在阅读查找手册页,但没有找到我的答案。我还从我的 Google 搜索中阅读了大约 8 页find,但也没有在那里找到我的答案。 …

find date-modified bash-scripting redhat-enterprise-linux

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

与 Google Chrome 的自动交互

好吧,苏,我有一个有趣的坚果要破解。

我有 8 个屏幕排成一行,全部连接到一个运行 Snow Leopard 的强大 G5(是的,4 个显卡;大约 15,000 像素宽!​​)。我正在设置一个演示,它使用 8 个全屏 Chrome 浏览器窗口,每个窗口都指向不同的 URL。每次重新启动计算机时手动执行此操作很麻烦。

鉴于此设置,我想编写一个脚本来自动:

  1. 打开特定屏幕的 chrome 窗口
  2. 将该窗口指向特定的 URL
  3. 全屏显示该窗口(command-F 是键盘快捷键)

我没有使用过 automator,我对 shell 脚本也不是特别熟悉,但我想知道是否有来自人群的任何奇特的建议。

更新:即使我需要将 Automator 用于高级功能,我最终还是希望有一种方法可以从命令行/脚本触发脚本。如果需要,我希望能够从 shell 远程打开这个演示。

google-chrome applescript automator bash-scripting macos

9
推荐指数
1
解决办法
9429
查看次数