Questions tagged «shell»

Shell是Unix的命令行界面。您可以交互地在外壳程序中键入命令,也可以编写脚本来自动执行任务。使用此标记可解决适用于/ bin / sh和大多数兼容shell(ash,bash,ksh,zsh等)的问题。对于有错误的Shell脚本,请在此处发布之前在http://shellcheck.net中对其进行检查。

1
切勿将`-a`或`-o`运算符与`[`
斯特凡·查泽拉斯写道: 一些规则,例如 总是引用变量 永远不要使用-aor -o运算符(使用多个[命令以及&&and和||shell运算符) [使用POSIX shell 使其可靠。 为什么“从不使用-aor -o运算符”? 我该如何“使用几个[命令以及&&and和||shell运算符”?
11 bash  shell  test 

2
子外壳与子外壳是否相同
有两个名称:subshel​​l和child-shell。 是的,子进程将通过以下任何一种方式启动: sh -c 'echo "Hello"' ( echo "hello" ) echo "$(echo "hello") echo "hello" | cat 是否都相同并具有相同的名称?所有共享相同的属性吗? POSIX 具有以下定义: Shell执行环境由...组成。 但是上面链接的最后一段有: 子外壳程序环境应作为外壳程序环境的副本创建,但不忽略的信号陷阱应设置为默认操作。 特别是: 命令替换,用括号分组的命令以及异步列表应在子shell环境中执行。另外,多命令管道中的每个命令都在子shell环境中。.... 其中sh -c 'echo "Hello"'不包含,也应该称为subshel​​l吗?

1
Bash别名,命令中包含空格
我正在尝试创建一个bash别名,别名本身中有一个空格。 这个想法是别名(即con)代表sudo openvpn --config /path/to/my/openvpn/configs/。con使用别名时,这将导致可读命令。 即: `con uk.conf` == `sudo openvpn --config /path/to/my/openvpn/configs/uk.conf` 我知道我不能这样声明别名: con ="sudo openvpn --config /path/to/my/openvpn/configs/"。bash函数在这种情况下会起作用吗?我从未听说过,但是在研究此小问题的解决方案时。

1
为什么回声两次匹配某些文件?
$ touch file{1..12} $ echo *e{1..12} file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 $ echo *{1..12} file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 我不明白为什么会这样。请有人可以解释吗?

5
Bash-在脚本中更改主机名后,PS1没有使用正确的主机名更新
这是我从stackoverflow获得的帖子的副本;我意识到我应该在这里问这个... 我想运行一个更改主机名的脚本,并使用正确的主机名立即更新我的bash提示符(PS1变量)。我如何做到这一点? 我跑这个 #!/bin/bash # Usage: ./changehost <newhostname> #Do two sed's to edit the files for persistent hostname change sed -i s/$(hostname)/$1/g "/etc/hosts" sed -i s/$(hostname)/$1/g "/etc/sysconfig/network" #run the hostname command with new hostname to update it hostname $1 在这样的终端中得到这个 [user@host dir]# ./changehost newhostname [user@host dir]# 但是我想要的是 [user@host dir]# ./changehost …
11 bash  shell 

3
Shell如何执行程序?
如果我使用gcc编译程序,并尝试从bash shell执行该程序,那么bash执行该程序的确切顺序是什么? 我知道fork(),execve(),loader,dynamic linker(和其他东西)都参与,但也有人给的步骤的确切顺序和一些适合阅读的参考? 编辑: 从答案看,这个问题似乎暗示了许多可能性。我想缩小到一个简单的情况: (test.c只是打印hello world) $ gcc test.c -o test $ ./test 在上述情况(./test)中将采取哪些步骤,特别是将bash启动程序与某个子进程相关联,进行加载,链接等?

4
以固定宽度打印手册页
使用示例命令 man apropos > outputfile 将生成一个文本文件,其中包含的格式化man页面apropos(与man apropos直接打印在屏幕上的字体有一些细微差别,例如粗体字符)。 但是我想手动设置生成的输出文件的最大行宽,以便所有段落都可以证明为该宽度。 man页面是通过创建的groff:例如,我试图将.ll 50原始.gz man源文本文件的段落放在前面,但是如果我需要在多个man页面上工作,这是微不足道的。此外,并非所有字符都可以识别: apropos.1:45: warning: can't find character with input code 195 apropos.1:45: warning: can't find character with input code 168 apropos.1:47: warning: can't find character with input code 178 apropos.1:131: warning: can't find character with input code 169 因此,我想知道是否存在更直接的方法。在创建过程中如何修改最大线宽outputfile?有一些特定的命令吗? 编辑: (以下所有注意事项均与Ubuntu …

3
是否应该在Shell脚本中的路径变量末尾使用斜杠?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 今天写我的shell脚本时。 我突然想到一个问题。 由于cd /target_dir和cd /target_dir/都有效。 我是否应该在Shell脚本的路径变量末尾添加斜杠? 如LOG_PATH=/data/nginx/logs对LOG_PATH=/data/nginx/logs/。 我在Google上进行了总体搜索,但没有找到关于此的讨论,也许这太基础了? 目前,我真的很难决定选择哪种风格。 但我更喜欢LOG_PATH=/target_dir/样式。 因为当我使用bash进行自动补全时,它会以斜杠弹出结果。 您对此有何看法?

4
使用嵌套循环退出shell脚本
我有一个带有嵌套循环的shell脚本,只是发现“退出”并没有真正退出脚本,而只是退出了当前循环。还有另一种方法可以在某些错误情况下完全退出脚本? 我不想使用“ set -e”,因为存在可接受的错误,并且需要进行大量重写。 现在,我正在使用kill手动终止进程,但是似乎应该有更好的方法来执行此操作。
11 bash  shell  scripting  exit 


2
如何在单引号内使用变量
我有一个应用程序,它以嵌入在单引号中的双引号作为输入属性。以这个正确的命令为例: command -p 'cluster="cl1"' 为了使其自动化,我创建了一个bash文件$CLUSTER作为变量。我的命令应该如何?换句话说,我应该代替cl1放置什么? 请注意,如果我修改了上面的命令,它将不会被接受。例如:command -p "cluster=cl1"不被接受

3
如何以纪元格式设置文件的mtime?
我知道如何以纪元格式获取文件的mtime: stat --format=%Y <file> 但是我无法弄清楚如何以纪元格式设置文件的mtime。touch(1)手册页似乎只接受“时间戳”值(使用月,日,小时,分钟等的或多或少的固定格式)或“人类可读的日期格式大部分为自由格式”。 我应该考虑其他实用程序吗? 谢谢。

3
重击的历史
Bash的“ globbing”和正则表达式为何不相同,是否有历史原因?例如,我相信Bash中的[1-2]*匹配项以1或2开头,后跟其他任何内容,而正则表达式[1-2]*仅匹配1和2的序列。我的Bash脚本和REGEX foo都非常薄弱,我经常遇到与这些差异相关的问题,这让我很好奇为什么它们不同。

2
在ssh -t上的stderr
这会将输出发送到STDERR,但不会传播Ctrl+ C(即Ctrl+ C将杀死ssh但不会杀死remote sleep): $ ssh localhost 'sleep 100;echo foo ">&2"' 这会传播Ctrl+ C(即Ctrl+ C将杀死ssh并远程sleep发送),但会将STDERR发送到STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' 在仍然传播Ctrl+的同时,如何强制第二个将STDERR输出发送到STDERR C? 背景 GNU Parallel使用'ssh -tt'来传播Ctrl+ C。这样可以杀死远程运行的作业。但是发送到STDERR的数据应在接收端继续发送到STDERR。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.