Questions tagged «shell»

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

3
为什么带引号的变量中的选项会失败,但不带引号的情况下会起作用?
我了解到我应该在bash中引用变量,例如“ $ foo”而不是$ foo。但是,在编写脚本时,我发现了一种情况,它不带引号但不带引号就可以工作: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line 这个作品: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" 这个不会(注意$ wget_options周围的双引号): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" 这是什么原因呢? 第一行是好的版本;还是我应该怀疑某个地方存在隐藏的错误导致此行为? 通常,在哪里可以找到好的文档来了解bash及其引用的工作原理?在编写此脚本期间,我觉得我开始在反复试验的基础上工作,而不是理解规则。


3
[[$ {1:0:1}“ ='-']的含义
我有以下脚本来启动MySQL进程: if [ "${1:0:1}" = '-' ]; then set -- mysqld_safe "$@" fi if [ "$1" = 'mysqld_safe' ]; then DATADIR="/var/lib/mysql" ... 1:0:1在这种情况下是什么意思?
18 linux  bash  shell 


4
使用#!/ bin / sh或#!/ bin / bash以获得Ubuntu-OSX兼容性以及易用性和POSIX
我知道我可以用作第一行脚本来调用所需的shell。 将#!/bin/sh被推荐,如果所有的UNIX系统的兼容性是一个绝对的要求? 就我而言,我唯一关心的OS是Ubuntu(Debian)和OSX。鉴于此,我是否可以使用#!/bin/bash并确保它在两个系统上都可以工作? 这还会使使用更现代,更清晰的命令语法的脚本更容易使用吗?使用是否#!/bin/sh还与使用POSIX有关?
18 bash  shell  ubuntu  osx  posix 

2
为什么变量在子Shell中可见?
《学习狂书》提到子shell将仅继承环境变量和文件描述符等,并且不会继承未导出的变量: $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ 据我所知,shell将为for ()和for 创建两个子shell ./file,但是为什么在()子shell中var虽然没有导出变量却标识了变量,而在./file没有标识的情况下为什么呢? # Strace for () clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617 # Strace for ./file clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25631 我试图用来strace弄清楚这种情况是如何发生的,令人惊讶的是,我发现bash将对克隆系统调用使用相同的参数,因此这意味着分叉的进程()和./file应该具有与父进程相同的进程地址空间,所以为什么在这种()情况下,子外壳可见该变量,而在相同./file情况下基于克隆系统调用,则不会发生这种情况?
18 bash  shell  subshell 


2
什么时候编写可移植脚本很重要?
我写的大多数代码都在PHP中。我最近开始学习Shell脚本。我遇到的大多数资源和教程都是针对Bash的。有些警告关于洗礼,有些则没有。我在这里和Stack Overflow上已经读了很多东西。 每当答案使用Bashisms时,不可避免地会有人评论说: 您不应该使用<在此处插入bashism>。它不是便携式的。 即使将问题标记为,也会发生这种情况bash。对我来说,这就像告诉一个PHP程序员,他们不应该使用PHP 5中的新代码,因为它不能与PHP 4一起使用。或者告诉某人,他们不应该为Mac写一些东西,因为它不能被使用。在Windows上。 当我用PHP编写时,我选择了最低要求,并编写了向前兼容的代码。我不担心使其向后兼容。 如果我使用#!/bin/bashshebang,为什么不使用bashisms?我开始得到的印象是有些人就是喜欢bash的 bash化(双关语意)只是为了它的缘故。 人们经常使用bash并且shell可以互换使用-可能是由于bash是许多系统上的默认shell。因此,我可以理解添加注释以警告该代码使用了bashisms,但我不明白使用它们的含义是错误的。 显然,如果我编写的脚本严格仅供个人使用,则可以用我想要的任何语言编写。但我想认为我编写的某些代码可能对其他人有用。 发布前,我尝试过寻找问题的答案。我发现了很多有关如何测试可移植性的信息,但是找不到什么时候进行此操作很重要。 那么,什么时候编写可移植脚本很重要? 例如, 哪种类型的脚本应尽可能地可移植? 没有安装Bash的系统有多普遍? 如果系统已安装Bash,它还会具有GNU版本的find和其他实用程序吗?

2
shell变量的扩展以及glob的影响和拆分
这篇文章实际上包含两个独立的问题,但我认为将它们组合在一起将提供更多的上下文。我已经在变量引号上讨论了这个问题,但我不太了解变量扩展首先是什么意思。所以我的第一个问题是: 在unix / linux中,变量扩展是什么? 我的问题的第二部分涉及以下术语: 球状 分裂 以上是什么意思,它们如何影响变量扩展?原始问题的答案提到以下内容: 将没有引号(在列表上下文中)视为split + glob运算符。 好像echo $ test是echo glob(split(“ $ test”))一样。 我找不到任何直接解决“ 遍历和分裂 ”概念的答案,而是直接将这些术语用于回答其他问题,例如最近的问题。

2
在没有正确退出应用程序的情况下关闭终端窗口是否有害?
使用Ubuntu 12.04 LTS,我的问题是,如果我在终端窗口中启动应用程序,那么关闭终端窗口而不先退出应用程序就没有什么坏处了。例如,我使用MATLAB。我打开一个终端并输入 matlab -nodisplay -nodesktop -nosplash 然后运行一堆脚本。那我可以 exit 结束MATLAB,然后关闭终端窗口或仅关闭终端窗口。这两种方法的真正区别是什么?第二种方法会以某种方式“伤害”任何东西吗?第一种方法优先吗?为什么?


4
可以跨多个存储库设置git配置吗?
Git似乎支持三个级别的配置值: 每个系统的全局设置(存储在中/etc/git-core) 每个用户的全局设置(存储在中~/.gitconfig) 每个存储库的本地设置(存储在中$REPO/.git/config) 这些选项涵盖了大部分基础,但我正在寻找一种处理第四级的方法。我有(非常)大量的存储库,因此我需要为它们使用与user.email平时不同的值。这些存储库通常是通过自动脚本创建和操作的,每个存储库本地设置的设置很麻烦。 所有有问题的存储库都位于本地系统上的某个路径前缀下。有没有办法在某个位置设置配置值,该配置值将被该路径下的所有存储库继承?(类似.htaccess设置的排序沿文件系统一直继承。)也许会有一种方法可以在全局配置文件中设置条件值?在UNIX环境中还可以做哪些其他安排来应对像我这样的一组存储库?
18 shell  git 


3
如何选择“顶部”的特定过程?
如果一个程序有多个实例,运行pidof program将给出: `1 2 3` top -p接受以逗号分隔的参数:1, 2, 3。 这意味着top -p `pidof program`将不起作用: top: unknown argument '1' usage: top -hv | -bcisSH -d delay -n iterations [-u user | -U user] -p pid [,pid ...] 你能告诉我怎么做吗。我对awk,sed等不熟悉。

7
收集并行后台进程的退出代码(子shell)
假设我们有一个bash脚本,如下所示: echo "x" & echo "y" & echo "z" & ..... echo "Z" & wait 有没有办法收集子外壳程序/子进程的退出代码?寻找这样做的方法,找不到任何东西。我需要并行运行这些子shell,否则,这会更容易。 我正在寻找一个通用的解决方案(我有一个未知/动态数量的子进程可以并行运行)。

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.