标签: bash

错误传播在 bash 中不起作用

我有一个脚本,如下所示......

顶部的一些函数定义,其中之一是......

function err_out    
{

 trap 'echo "ERROR in $STEP function. EXITING!";exit 1' ERR    
 #some more messages

 exit 1
}

# Main program starts here
trap 'err_out' ERR

#do something
#call some functions
#call cleanup function
#end of script
Run Code Online (Sandbox Code Playgroud)

当函数中发生一些错误时,它们不会传播,并且 err_out 函数不会被调用。

我也尝试过#!/bin/bash -E;这样,当出现错误时,脚本会退出,但我需要的是将错误正确传播到处理程序。

linux bash shell-script

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

管道和观察管道输出?

我想制作一个像这样的外壳管道:

producer | analyser > report.txt
Run Code Online (Sandbox Code Playgroud)

producer并在生成数据(一个大日志文件)时观察输出以进行分析。

我怎样才能做到这一点?

bash shell redirection

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

无法在 Ubuntu 中通过 bash 脚本编辑“/etc/network/interfaces”文件

可能的重复:
sudo 权限被拒绝

我需要通过 bash 脚本编辑 /etc/network/interfaces,我正在做如下的事情......

sudo echo something > /etc/network/interfaces

当执行此行时,我收到下面提到的错误: bash: /etc/network/interfaces: Permission denied

但是如果我用某个编辑器编辑同一个文件,它可以完美地工作......即

sudo nano /etc/network/interfaces

上面让我编辑这个文件。

linux bash command-line bash-scripting

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

批量转换文件同时保留名称

我想使用以下命令将电子书从 epub 格式转换为 mobi 格式: calibre-convert books/*.epub books/*.mobi

但我想为所有文件保留相同的文件名。所以 book1.epub 将创建 book1.mobi book2.epub 将在转换后创建 book2.mobi。这在命令行中可行吗?还是我必须写一个 bash 脚本?

linux bash command-line calibre

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

为什么我经常收到“没有这样的进程”以响应我想杀死的进程?

me@me:~$ ps aux | grep -i firefox
me     15413  0.0  0.0  14428  1036 pts/1    S+   05:46   0:00 grep --color=auto -i firefox
me@me:~$ kill 15413
bash: kill: (15413) - No such process
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,或者我做错了什么?

linux bash grep kill ps

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

如何递归运行文件命令

我正在尝试获取有关给定目录树中所有文件类型的信息。file在当前目录中运行效果很好,但它不会遍历子目录,而且似乎没有选项可以让它这样做,这对于 UNIX 工具来说似乎很奇怪。

我究竟如何file递归地执行命令,以便它列出给定目录及其子目录中所有文件的文件类型?

linux unix bash command-line file-types

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

为什么在 Linux 中执行文件的权限不起作用?

我在用户目录中创建了一个 bash 脚本,例如,当执行该脚本时,会显示文本“Hello world”。同时,我希望能够只有我自己(文件的所有者)和我组的帐户才能执行它,其余的都可以读取。因此,我通过 chmod 设置了权限,我以非我组的用户身份登录,转到包含文件的目录,通过 sh 运行它......它突然执行并显示“Hello world”而不是“拒绝访问” ”。但这怎么可能,我不让别人表演?这是什么?这是什么意思?

[user@localhost ~]$ ls -la *.sh
-rwxr-xr-- 1 user users 0 Feb 19 01:21 file.sh
[user@localhost ~]$ sh file.sh
Hello World
[user@localhost ~]$ groups
users wheel
[user@localhost ~]$ su - testu
Password: 
[testu@localhost ~]$ groups
testu
[testu@localhost ~]$ cd ../user
[testu@localhost user]$ sh file1.txt
Hello World```
Run Code Online (Sandbox Code Playgroud)

linux bash shell permissions

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

在分词子shell输出时让bash尊重引号

我有一个命令,它输出一些我想传递给另一个命令的参数。但是,当我在子 shell 中运行命令时,输出会受到分词,除非我引用整个内容,在这种情况下,它是单个词。

我希望 subshel​​l 输出拆分单词,但我希望单词拆分尊重引号,但事实并非如此。有什么方法(除了eval)可以将子shell输出拆分为单词但尊重引号?

细节

鉴于args命令定义为

#!/bin/sh -
printf "%d args:" "$#"
printf " <%s>" "$@"
echo
Run Code Online (Sandbox Code Playgroud)

我可以跑

$ args 'foo bar' 'one two'
2 args: <foo bar> <one two>
Run Code Online (Sandbox Code Playgroud)

但我找不到一种方法让子shell 传递 2 个参数。

$ echo "\"'foo bar'\" 'one two'"
"'foo bar'" 'one two'
$ args $(echo "\"'foo bar'\" 'one two'")
4 args: <"'foo> <bar'"> <'one> <two'>
$ args "$(echo "\"'foo bar'\" 'one two'")"
1 args: <"'foo bar'" 'one two'>
Run Code Online (Sandbox Code Playgroud)

当然,我可以使用 eval …

bash bash-scripting

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

在 bash 中复合检查文件内容

我正在尝试使用 Bash 中的 new-test 编写复合 if 语句。我想检查一个文件是否存在以及其他两个文件是否具有特定内容。当嵌套在测试中时,我的 grep 搜索似乎不起作用。

echo "a" >> file_a
echo "b" >> file_b 
echo "c" >> file_c
if [[ -f file_a && \
  $(grep -q "b" file_b) && \
  $(grep -q "c" file_c) ]]; then
  echo "Got 'em"
fi
Run Code Online (Sandbox Code Playgroud)

bash

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

使用 bash 将输出发送到文件时 &gt; 的正式名称是什么

在 Ruby 中,>> 被称为铲操作符。例如,在 bash 中它叫什么

cat "hello world" >> file.txt
Run Code Online (Sandbox Code Playgroud)

它如何使用正确的命名法解释这是做什么的。我听说它被称为“管道”,但管道是 | 所以我很困惑。

bash

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