Questions tagged «shell»

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

1
$ PATH中的查找如何在后台运行?
网络上有太多文章/资源可以教人们如何设置环境变量,PATH以便他们可以使用java或python等的简写代替命令行界面中的绝对路径。 我很想知道的是,当我们键入命令并按回车键时,背后是什么(类似于在浏览器中键入URL时发生的情况)。 这是我的猜测: 读取命令(解析/预处理标准输入以获取正确的参数$@) 命令查询 命令执行(程序已启动,消耗内存,stdout / stderr到shell) 重新渲染通过相关环境变量(例如仿真器$PS#,$PROMPT等等) 我最想弄清楚的部分是命令查找。显然,$PATHs被某些后台函数使用,并用:/ ;分隔为分隔符,那么发生了什么?我们是否使用哈希表(键:文件的基名,值:文件的绝对目录名)将二进制文件存储在这些PATH或其他挂钩下? 注意:我最初认为它是哈希表,因为我可以[ -z hash [command] ]用来检查当前环境中是否有可用的命令,但是当我使用时hash | grep python,在which python按预期方式工作时,我从输出中什么也没得到。(我认为该机制可能是特定于外壳的,但我想对此有更多的了解。)
8 shell  path 

3
运行进程的命令
假设我使用以下命令运行了该过程: myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1 过了一会儿,我只有pid的myapp过程中,如1234有没有办法让所有标志的命令和输出重定向到myapp.log通过某种方式只pid?

3
将stdout和stderr发送到文件,系统日志和终端
对于正在启动的某些云计算机,我试图登录到特定文件,系统日志和终端/控制台。 在机器设置/ cloud-init脚本的顶部,我有以下内容: #!/bin/bash exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup) apt-get install -y some-package 这在将输出发送到文件和syslog时非常有用,但不会通过管道将输出发送到终端。 一般而言,除了从远程控制台进行调试之外,没有终端输出不是一个大问题。发生这种情况时,我完全是盲目的,因为执行bash脚本时控制台是空白的。 是否有一种简单的方法使用bash重定向或其他方法将所有输出(标准输出以及标准错误)同时传输到文件,syslog和终端? 我正在运行Ubuntu 16.04。

2
为什么带有通配符的sudo mv操作不起作用?
我认为必须对此有一个简单的答案,但我不知道为什么这不起作用! 我的主目录中有一个文件夹(好几个级别),称为安装插件。我想将该文件夹的所有内容(大约15个.jar文件)传输到另一个文件夹,也称为安装插件。 这是我正在尝试的: $ sudo mv /home/jira-plugins/installed-plugins/* /var/atlassian/application-data/jira/plugins/installed-plugins/ mv: cannot stat `/home/jira-plugins/installed-plugins/*': No such file or directory 我怎么了 该文件夹绝对不是空的。这是ls输出: $ sudo ls /home/jira-plugins/installed-plugins analytics-client-3.15.jar plugin.2223138796603023855.jira-importers-plugin-6.0.30.jar atlassian-chaperone-2.0.3.jar plugin.330169947367430109.jira-fisheye-plugin-6.2.8.jar atlassian-client-resource-1.0.jar plugin.4363048306537053933.jeditor-2.1.7.2.jar atlassian-pocketknife-api-commons-plugin-0.19.jar plugin.4438307615842123002.jira-ical-feed-1.0.4.jar atlassian-pretty-urls-plugin-1.8.jar plugin.461510159947098121.jira-issue-collector-plugin-1.2.5.jar base-hipchat-integration-plugin-7.8.24.jar plugin.5630909028354276764.atlassian-universal-plugin-manager-plugin-2.7.8.jar base-hipchat-integration-plugin-api-7.8.24.jar plugin.6920509095052318016.atlassian-bonfire-plugin-2.9.13.jar hipchat-core-plugin-0.8.3.jar plugin.6952408596192442765.atlassian-bonfire-plugin-2.8.2.jar hipchat-for-jira-plugin-1.2.11.jar plugin.7079751365359230322.jira-importers-bitbucket-plugin-1.0.8.jar jira-email-processor-plugin-1.0.29.jar plugin.7451827330686083284.atlassian-universal-plugin-manager-plugin-2.21.4.jar jira-fisheye-plugin-7.1.1.jar plugin.7498175247667964103.jira-importers-redmine-plugin-2.0.7.jar jira-ical-feed-1.1.jar plugin.7803627457720701011.jira-importers-plugin-3.5.3.jar jira-issue-nav-components-6.2.23.jar plugin.7977988994984147602.jira-bamboo-plugin-5.1.6.jar jira-servicedesk-2.3.6.jar …
8 shell  sudo  wildcards  mv 

3
通过就地编辑进行Sed更改文件的组所有权
我有shell(php)脚本,可以通过这种方式与目标文件联系: 检查文件和目录是否可写与php的is_writable()(我不认为这是问题) 使用以下sed命令进行就地文件编辑: grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n" 因此,我得到这是(一切正确的,但)文件myuser:www-data是myuser:myuser。 是否可以sed更改文件组的所有权?如果可能,如何避免更改?


2
变量分配影响当前正在运行的外壳
在编写一些代码时,我发现这一行: $ TZ="America/Los_Angeles" date; echo "$TZ" Thu Dec 24 14:39:15 PST 2015 正确给出“洛杉矶”的实际时间,并且TZ不保留变量的值。一切都应该预期。 但是,使用此行(我以前用来扩展某些格式,并且基本上执行相同的操作)保留了TZ的值: TZ="America/Los_Angeles" eval date; echo "$TZ" Thu Dec 24 14:41:34 PST 2015 America/Los_Angeles 经过多次测试后,我发现这仅在某些shell中发生。它发生在破折号,ksh中,但不发生在bash或zsh中。 Q的 问题是: 为什么现在的外壳中保留TZ的值? 如何避免/控制这种情况(如果可能)? 额外。 我使用以下两行在几个shell中运行测试: myTZ="America/Los_Angeles" unset TZ; { TZ="$myTZ" date; } >/dev/null; echo -n " direct $TZ" unset TZ; { TZ="$myTZ" …


4
如何打印文件夹中丢失文件的名称?
我的文件夹中有2000多个文件,但该文件夹中缺少几个文件。 文件名就像 GLDAS_NOAH025SUBP_3H.A2003 001.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 001.1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 002.1800 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.0000 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003003.0600 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1200 .001.2015210044609.pss.grb GLDAS_NOAH025SUBP_3H.A2003 003.1800 .001.2015210044609.pss.grb 001表示日期,而0000表示小时。 如何找出文件夹中缺少哪个文件?我在Google那里得到的答案很少,但不知道如何实施这些答案。

1
用通配符分配的变量中的参数扩展
我的当前文件夹(MA502)中有两个文件,它们的名称是- MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq MA502_TAAGGCGA-TCGCAGG_L001_R2_001.at.fastq 我有很多这样的文件夹-例如MA503,MA504等,我想遍历这些文件夹。 我使用通配符分配变量名- Forward=*R1*.at.fastq Reverse=*R2*.at.fastq 我想在脚本中处理这些文件,并希望将输出替换.at为.atqt,以便最终名称看起来像- MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq MA502_TAAGGCGA-TCGCAGG_L001_R2_001.atqt.fastq 我试过了 awk 'script' $Forward > ${Forward/.at/.atqt} 我的最终文件名看起来像- *R1*.atqt.fastq 而不是我的期望 MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq 我已经根据需要在UNIX上学到了所有东西,所以我不确定如何处理变量名。任何帮助表示赞赏!

4
SIGKILL为什么不终止已停止的程序(是)?
我正在使用Ubuntu 14.04,但遇到这种现象,我似乎无法理解: 运行yes命令(在默认外壳中:Bash) 键入CtrlZ停止yes 运行jobs。输出: [1]+ Stopped yes 跑kill -9 %1停yes。输出: [1]+ Stopped yes 运行jobs。输出: [1]+ Stopped yes 这是在3.16.0-30-generic并行虚拟机上运行的Ubuntu 上。 为什么我的kill -9命令没有终止yes命令?我以为SIGKILL不能被抓住或忽略?以及如何终止yes命令?

2
为什么xargs传递给subshel​​l时会跳过第一个参数?
寻找一种在xargs单行代码中调用多个命令的方法,我在findutils中找到了从xargs调用shell的建议,如下所示: $ find ... | xargs sh -c 'command $@' 有趣的是,如果我这样使用xargs,由于某种原因,它会跳过第一个参数: $ seq 10 | xargs bash -c 'echo $@' 2 3 4 5 6 7 8 9 10 $ seq 10 | xargs -n2 bash -c 'echo $@' 2 4 6 8 10 我的shell或xargs版本有问题吗?该文件不准确吗? 使用xargs(GNU findutils)4.4.2和GNU bash,版本4.3.11(1)-release。
8 shell  xargs 

4
如何在有空格的grep输出上执行xargs grep?
我正在基于正则表达式搜索文件,然后尝试在这些文件中搜索内容。例如,我有类似 #Find all C++ files that match a certain pattern and then search them find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>" 我遇到的问题是某些路径中有空格,这会造成混淆xargs。我知道,如果我只是使用find,则可以使用-print0参数(以及上的-0参数xargs)来防止xargs将空格视为定界符。有类似的东西grep吗? 还是我完全以错误的方式解决了这个问题?天真,find要grep以xargs grep对我来说很有意义,但我持开放的态度产生相同的结果的其他方法。
8 shell  grep  find  quoting  xargs 

3
如何有效地使用GNU并行
假设我想在压缩文本文件中找到所有匹配项: $ gzcat file.txt.gz | pv --rate -i 5 | grep some-pattern pv --rate在这里用于测量管道吞吐量。在我的机器上,解压缩后约为420Mb / s。 现在,我正在尝试使用GNU parallel做并行grep。 $ gzcat documents.json.gz | pv --rate -i 5 | parallel --pipe -j4 --round-robin grep some-pattern 现在,吞吐量下降到〜260Mb / s。而且更有趣的parallel过程本身就是使用大量CPU。大于grep进程(但小于gzcat)。 编辑1:我尝试了不同的块大小(--block),以及-N/ -L选项的不同值。在这一点上没有任何帮助。 我究竟做错了什么?


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.