Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。

1
如何从标准输出中剥离颜色代码并传递到文件和标准输出
我有一个混合使用printf某些程序的程序,tput我想将输出通过管道输出到stdout以及一个文件。我宁愿使用它,sed因为我不想对脚本有任何不必要的依赖。这是到目前为止我得到的。 printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" | tee install.log 唯一的问题是我的日志文件正在获取所有颜色输出... ^[[36m| ^[(B^[[m^[[37mSourcing files...^[[m 我希望它只有 | Sourcing files...

2
符合POSIX的方式使用可能包含空格的文件名列表
我看过Bash脚本指南,建议使用数组处理包含空格的文件名。但是DashAsBinSh建议数组不能移植,因此我正在寻找一种POSIX兼容方式来处理可能包含空格的文件名列表。 我正在尝试修改以下示例脚本,以便 echo foo/target/a.jar foo/target/b.jar bar/target/lol whitespace.jar 这是脚本 #!/usr/bin/env sh INPUT="foo/target/a.jar foo/target/b.jar bar/target/b.jar bar/target/lol whitespace.jar" # this would be produced by a 'ls' command # We can execute the ls within the script, if it helps dostuffwith() { echo $1; }; F_LOCATIONS=$INPUT ALL_FILES=$(for f in $F_LOCATIONS; do echo `basename $f`; …

4
Ctrl-Z和kill -STOP有什么区别?
当make从外壳程序运行命令(在大型项目上)时,可以键入Ctrl-Z来停止该过程并返回到外壳程序。随后,我可以运行fg以继续该过程。 我正在尝试编写一个shell脚本来自动执行此操作(特别是每隔几秒钟检查一次我的CPU温度,并在温度过高时停止该过程,因为我的计算机容易过热)。我的第一次尝试是这样的(简化的): make & subpid="$!" sleep 2 # If the CPU temperature is too high... kill -STOP "$subpid" sleep 2 # If the CPU temperature has dropped to safe levels... kill -CONT "$subpid" wait "$subpid" 不幸的是,这没有用。向该进程发送SIGSTOP不会暂停它(通过继续将输出发送到终端可以明显看出这一点)。我make &在命令行中运行,发送了SIGSTOP,并使用ps;检查了进程状态。它被列为已停止(并在我发送SIGCONT时再次启动),但它仍在喷射输出并提高核心温度!使用Ctrl-Z停止它从来没有这个问题,但是我不知道如何在脚本中做到这一点。 是什么使Ctrl-Z与有所不同kill -STOP,以及如何在Shell脚本中获得前者的行为?

2
何时在环境变量和命令之间使用分号
谁能解释为什么必须用分号才能使LANGbash更新它? 不起作用: > LANG=Ja_JP bash -c "echo $LANG" en_US 作品: > LANG=Ja_JP ; bash -c "echo $LANG" Ja_JP 我正在使用Linux上的bash 4.1.10和cygwin下的相同版本

4
在bash脚本中使用可变扩展查找-exec
我正在尝试在bash脚本中运行类似于以下命令的命令。它应搜索的所有子文件夹,$sourcedir并将特定类型的所有文件复制到的根级别$targetdir。 #!/bin/bash # These are set as arguments to the script, not hard-coded sourcedir="/path/to/sourcedir" targetdir="/path/to/targetdir" find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \; 这似乎很接近,除了{}没有传递$2给-exec sh -c ... 我希望这样做尽可能接近“正确的方式”,并允许对文件名中的特殊字符(特别是单引号字符)进行容忍。 编辑:我看到有人建议使用xargs或参数链。我的印象是,这仅适用于有限数量的参数。例如,如果我有成千上万个.jpg文件,我正试图将它们从许多画廊目录中复制到一个巨大的幻灯片目录中,则解决方案链接参数仍然有效吗? 编辑2:我的问题是我_在-exec命令中的第一个选项sh之前缺少。对于任何对如何使find命令起作用感到好奇的人,添加_,一切都会好起来的: find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' …


2
如何在Ubuntu中使用Bash for sh
我正在安装一个巨大的程序,该程序具有作为rpm文件的资源。它卡在了 #!/bin/sh SCITEGICPERLBIN=`dirname $0` SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN` if [ $SCITEGICPERLHOME == "." ] 显然,sh可以bash使用这种语法在Red Hat Linux中工作,但是会unexpected operator在Ubuntu中产生错误。 我无法将脚本更改bash为脚本来自rpm软件包。我可以提取并重新rpm打包程序包,但是可能有很多这样的脚本。 有没有一种方法可以将Shell默认值更改#!/bin/sh为as bash或其他任何可以处理[操作符的方法?

3
tail -f,在日志空闲3秒后插入换行符吗?
执行a时tail -f error.log,如何在3秒内未对文件执行任何操作后以编程方式插入换行符? (显然,一旦添加了一个换行符,则不应再添加其他换行符,除非将其他文本行添加到日志文件中) 例如,这些行被添加到error.log: foo bar boo [[wait 4 seconds]] 2far 2foo 2bar 2boo [[wait 40 seconds]] 2far 这将是控制台中的输出: foo bar boo 2far 2foo 2bar 2boo 2far

4
在某些情况下,bash(或其他shell)脚本中的空格数量确实很重要
有人告诉我空格在bash其他shell脚本中很重要,除非我知道自己在做什么,否则不要更改空格的存在。“改变存在”是指在两个非空格字符之间插入一个空格,或者在两个非空格字符之间删除一个空格,例如更改var="$val"为var ="$val",反之亦然。我想问一下 在shell脚本中使用单个空格或使用多个连续空格会有所不同吗?。 (当然,在引号中插入/删除空格会有所不同,例如从更改为echo "a b",echo "a b"反之亦然。我正在寻找除此琐碎示例以外的示例。) 我遇到了这个问题,但是那是关于在两个非空格字符之间添加和删除空格的问题,我知道很多例子会有所作为。 任何帮助,将不胜感激。如果可能,包括更多种类的贝壳。

1
条件正则表达式错误
string=123456 if [ $string == 123456 ]; then echo 123 fi 这可以正常工作,但是如果我将==更改为=〜,则会收到此错误: ./test: line 3: [: =~: binary operator expected

3
带有set -e的Bash脚本不会在`…&&…`命令上停止
我使用set -e到的第一个错误停止bash脚本。 一切正常,除非我在以下命令中使用命令&&: $ cat script set -e cd not_existing_dir && echo 123 echo "I'm running! =P" $ $ ./script ./script: line 2: cd: not_existing_dir: No such file or directory I'm running! =P $ 和....相比: $ cat script set -e cd not_existing_dir echo "I'm running! =P" $ $ ./script ./script: …


4
如何使脚本采用多个参数?
这是一个非常简单的脚本 #!/usr/local/bin/bash set -e if [ "$#" -lt 1 ] then echo "Please insert at least one argument" exit else echo -e "\c" fi if [ -h "$1" ] then echo "$1 is a symbolic link" else echo "$1 in not a symbolic link" fi 〜 我的问题是:如何更改脚本以识别多个参数?我有4个文件,我希望脚本返回 $1 is a …

2
删除早于特定文件的文件
我需要从文件夹中删除所有早于特定文件的文件。 在CentOS 7上运行bash。 我对此有一个解决方案,但我认为应该有一种更优雅的方法: reference_file=/my/reference/file get_modify_time() { stat $1 | grep -Po "Modify: \K[0-9- :]*" } pit=$(get_modify_time $reference_file) for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

4
如何显式调用内置的shell?
我想根据需要自定义cd命令功能。 我定义了以下功能- function cd () { cd "$@" && pushd "$@"; } 此功能的目的是自动将目录推送到堆栈上,这样可以节省我pushd .每次手动键入的工作量。 但是,上述函数是一个无限递归函数,因为对的调用cd被解释为函数本身,而不是cd内置函数。 如何引用cd此函数中的内置函数? 我知道可以使用来转义别名\。如何以更明确的方式转义函数或引用内置函数? 注意:我不想将函数重命名为其他任何名称。

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.