Questions tagged «shell»

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

2
什么不是特定于外壳的?
在某些答案下,我看到一些建议不要在答案中使用特定于Shell的命令的注释。 我如何知道所有shell中都存在哪些命令,运算符等?有标准清单吗? man builtins给出命令列表。这些是我可以在所有shell中都能使用的可移植shell脚本中唯一使用的命令吗? 内置可以是特定于外壳的吗? Linux的标准是否与其他Unix的标准不同? 语法呢?标点符号,运算符等在某些shell中可以不同吗?

1
确定当前用户是否在目录中具有写权限
我知道您可以通过执行以下操作来确定目录的所有者: ls -ld ~/foo | awk '{ print $3 }' 然后,您可以通过执行以下操作将其与当前用户进行比较: if [[ $(ls -ld ~/foo | awk '{ print $3 }') == "$USER" ]] # or $(id -u -n ) instead of $USER then echo "You are the owner" else echo "You are NOT the owner" fi 但是您可以拥有所有者的写权限。您如何确定?

1
使用陷阱确认退出
我正在尝试捕获Ctrl+C要求用户确认的信号。捕获部分工作正常。但是一旦捕获到信号,它就不会返回正常执行。而是,它退出脚本。用户按下否时如何使它恢复执行。 这是我的代码 hell() { echo "Do you want to quit? Press 1 for yes and 0 for no"; read n; if [ $n == 1 ]; then exit 1; fi } trap "hell" SIGINT find /

6
IO重定向和head命令
.hgignore今天,我试图从Cygwin bash shell 快速编辑文件,并且添加了一行错误。我不确定这是否是最好的方法,但是我很快想到了使用head -1 .hgignore删除有问题的行(我以前在文件中只有一行)。果然,执行时,它会将第一行作为唯一输出。 但是,当我尝试重定向输出并使用重写文件时head -1 .hgignore > .hgignore,该文件为空。为什么会这样?如果我尝试附加head -1 .hgignore >> .hgignore,它会正确附加,但这显然不是理想的结果。为什么在这种情况下无法进行截断的重定向?

4
为什么无法在此bash脚本中获得命令的退出值?
因此,我正在编写此鹦鹉螺脚本,用于将视频转码为mp3: #! /bin/bash -x if [ -z "$1" ] then zenity --warning --text="Error - No file selected !" exit 1 fi BASEFILENAME=${1%.*} exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" && if [ "$?" -eq 0 ] then zenity --info --text="Converting successful" exit fi 问题是,尽管ffmpeg命令成功执行了 if [ "$?" -eq 0 ] …
9 shell  exit 

1
bash中的引号内的美元符号插值
我正在运行我编写的这个小测试脚本: #!/bin/bash TESTCASE=$@ testHarness <<runTest $TESTCASE runTest 从命令行: ./test.sh "1092$212" 但是美元符号被剥夺了。如果我逃脱了,那就行了。但是我认为双引号可以保护我免于这样做。有人可以帮我了解发生了什么以及如何解决此问题吗?
9 bash  shell  quoting 

2
如何在Shell中管理大量文件?
$ ls ./dir_with_huge_amount_of_files/errors/ 假设目录中充满了带有unix时间戳的图片,我的意思是用GB甚至更多来衡量很多。诸如此类的Shell命令ls将获得溢出样式的警告,因为它们并非设计用于处理数百万(或更多)图片。如何管理如此大量的文件?例如,如果要在中间找到图片(根据名称和创建时间中的时间戳记),是否有某些文件系统提供内置的搜索功能?您将使用哪些命令?我尝试了舒适ls和find带有必要的标志,但是它们要么很慢,要么生成警告,因此我认为我需要更好的文件系统或db或类似的东西来对图片进行预索引。我基本上需要一个阵列,照片的inode应该按时间顺序放置在该阵列上。怎么做?以后,可以添加带有unix时间戳的元数据。 [更新] 当前答案存在严重缺陷,人们只是在没有经验检验的情况下发布答案排序。如果他们测试了他们的建议,他们可能会失败。因此,我为您创建了一个命令行工具,您可以通过该工具创建沙箱来创建大量文件,并像对1e7数量的文件一样测试您的建议。生成文件可能需要很长时间,因此请耐心等待。如果有人知道更快的方法,请编辑代码。键入python code.py --help以获取帮助。玩得开心! 使用示例创建很多脏文件 $ ls ./data2 ls: ./data2: No such file or directory $ python testFill.py -n 3 -d 7 $ tree data2/ data2/ |-- 0 | |-- 1302407302636973 | |-- 1302407302638022 | `-- 1302407302638829 |-- 1 | |-- 1302407302639604 | |-- 1302407302641652 | …

3
用命令的输出做两件事
我有一个程序texcount可以输出LaTeX文档中的单词数。我还可以通过管道输出,sed以制作换行符TeX换行符,并将其写入文件,然后将其包含在最终文档中。但是,当我执行时texcount foo.tex | sed s/$/'\\\\'/ > wc.tex,命令行输出texcount被抑制。 如何获得第一个命令的输出以显示在终端中并通过管道传输到sed?

1
处理SSH连接时,系统需要经过哪些步骤?
处理SSH连接时,系统需要经过哪些步骤? 我们尝试通过ssh登录 sshd 启动pam和pam模块以对我们进行身份验证 根据pam配置,我们需要提供用户名和密码(pam检查passwd和shadow文件) PAM检查hosts.allow/deny,/etc/shells和其他的东西 如果一切顺利,我们已登录 ??? 外壳启动 所以我的问题是什么机制负责检查在用户passwd文件中将哪个外壳分配给了用户(在步骤6中)?是pam本身,某些特定的pam模块sshd,还是其他?我知道可以passwd通过编写pam模块来替换文件(用于检查用户名和密码),但是如何替换passwdshell条目的文件?
9 shell  ssh  pam 

1
如何获得单个目录的详细列表?
我想查看单个目录的长列表。当我输入时ls -lha,我看到了: drwxrwxr-x 4 username groupname 4.0K 2010-08-05 09:55 files drwxrwxr-x 7 username groupname 4.0K 2010-08-05 14:25 trunk drwxrwxr-x 8 username groupname 4.0K 2010-08-05 16:02 phpincludes drwxrwxr-x 11 username groupname 4.0K 2010-07-26 12:31 phpMyAdmin-3.3.5-english 但是,当我键入时ls -lha phpMyAdmin-3.3.5,我会得到目录内容的清单。如何键入命令,这样我只能看到 drwxrwxr-x 11 username groupname 4.0K 2010-07-26 12:31 phpMyAdmin-3.3.5-english ?我想使用符号链接目录来执行此操作,因此我可以看到它们的链接位置,而不是它们的内容。

3
如何从shell中检查stdin是否为/ dev / null?
在Linux上,shell脚本是否可以检查其标准输入是否从空设备(1,3)*重定向,理想情况下不读取任何内容? 预期的行为将是: ./checkstdinnull -> no ./checkstdinnull < /dev/null -> yes echo -n | ./checkstdinnull -> no EDIT mknod secretunknownname c 1 3 exec 6<secretunknownname rm secretunknownname ./checkstdinnull <&6 -> yes 我怀疑我“只是”需要读取输入设备的maj / min号。但是我找不到从外壳执行此操作的方法。 *没有必要/dev/null,但是任何空设备,即使使用手动创建也是如此mknod。
9 linux  shell  devices  stdin 

4
如何保存和还原所有外壳程序选项,包括errexit
我已经在各种堆栈交换站点和UNIX帮助论坛上通读了许多有关如何修改Shell选项然后恢复它们的问题-我在这里找到的最全面的解决方法是如何“撤消” set -x`? 在收到的智慧似乎是要么保存过的结果set +o或shopt -po再eval后来恢复到以前的设置。 但是,在我自己使用bash 3.x和4.x进行的测试中,errexit执行命令替换时未正确保存该选项。 这是显示问题的示例脚本: set -o errexit set -o nounset echo "LOCAL SETTINGS:" set +o OLDOPTS=$(set +o) echo echo "SAVED SETTINGS:" echo "$OLDOPTS" 和输出(我修剪掉了一些不相关的变量): LOCAL SETTINGS: set -o errexit set -o nounset SAVED SETTINGS: set +o errexit set -o nounset 这似乎非常危险。errexit如果有任何命令失败,我编写的大多数脚本都会停止执行。我只是在其中一个脚本中发现了一个由此引起的错误,该错误原本应该errexit在最后恢复,但此功能将覆盖它,并在脚本持续时间内将其设置为默认关闭状态。 我想做的是编写可以根据需要设置选项的函数,然后在退出之前正确还原所有选项。但是,似乎在命令替换调用的子外壳中,errexit是不会被继承的。 我不知道如何保存结果set +o而不使用命令替换或跳过FIFO箍。我可以阅读,$SHELLOPTS但不是可写或eval-able格式。 我知道一种替代方法是使用subshel​​l函数,但是这给能够记录输出以及传递多个变量带来了很多麻烦。 …
9 bash  shell 

1
系统启动和终端启动程序之间的区别
我对程序之间的差异感到好奇。通过systemctl启用时,以systemd开头,而不是/etc/rc.local通过CLI或通过CLI进行启动。 例如,我最近在树莓派上使用shairport-sync。最初,我通过启用sudo systemctl的shairport-sync将shairport-sync设置为启动。 后来,我使用其中的功能在shairport-sync脚本运行之前和发布到连接的设备。 令我惊讶的是,这些脚本在执行shairport-sync时没有kill arecord或aplay 但是,当我通过终端运行脚本时,脚本将执行并杀死arecord和aplay。 为了进一步迷惑自己,我shairport-sync通过终端杀死并启动了它,以查看正在发生的事情的输出。当我这样做时,脚本在设备连接并终止arecord并终止时按预期运行aplay。因此,作为一项修复,我禁用shairport-sync了sysmtectl它并将其设置/etc/rc.local为作为快速修复运行。之后,reboot它按我的预期运行。 这使我相信,单独运行systemd的程序与通过/etc/rc.local或CLI 启动时运行的程序之间存在一些差异。 为什么会这样?这是因为运行级别不同吗?一些黑魔法? 设备连接到时运行的脚本shairport-sync如下:shairportstart.sh #!/bin/sh /usr/bin/sudo /bin/pkill arecord if [ $(date +%H) -ge "18" -o $(date +%H) -le "7" ]; then /usr/bin/amixer set Speaker 40% else /usr/bin/amixer set Speaker 100% fi /home/pi/shScripts/shairportfade.sh& exit 0 这是渐变脚本: shairportfade.sh #!/bin/sh /usr/bin/amixer set Speaker 30- for …

2
退出Shell后,后台作业会怎样?
从我的理解,工作是管道从某一个shell启动的,你可以管理这些作业(fg,bg,按Ctrl-Z)从该壳体内。一个作业可以包含多个进程/命令。 我的问题是,当包含外壳的原始外壳退出时,这些作业会发生什么?假设未设置huponexit,因此退出shell后后台进程继续运行。 假设我已经完成: $ run.sh | grep 'abc' & [1] job_id 然后我退出这个外壳。我将输入一个新的shell并运行jobs,显然看不到任何内容。但是我可以做ps aux | grep run.sh并看到此过程正在运行,并且我也将ps aux | grep grep看到并grep 'abc'正在运行该过程。 有没有一种方法可以获取完整管道的作业ID,以便我可以一口气杀死它,或者一旦退出原始Shell,是否必须与另一个Shell分别杀死所有进程?(我已经尝试了后者,但它确实有效,但是跟踪所有过程似乎很麻烦。)
9 shell  process  kill  jobs 

1
利用bash脚本参数可能吗?
我想将电子邮件地址从Web表单传递到bash脚本。我正在使用以下正则表达式: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/ 这够了吗?还是可以嵌入漏洞利用程序? 该脚本是从PHP调用的: system('/usr/local/bin/script.sh "$email"');

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.