Questions tagged «shell-script»

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

3
优化`while`循环
我创建了一个迷你脚本,只需按一下按钮即可重新启动Raspberry Pi。该脚本仅使用wireingPi(gpio命令)将引脚0(Raspberry Pi标准编号顺序中的引脚17)设置为输入,然后读取该值直至为1(即按下或按住按钮时)。 这是我的脚本: gpio mode 0 in while (true) do if [ `gpio read 0` -eq 1 ] then echo password | sudo -S reboot break fi done & 该脚本工作正常,一切正常。 但是,对于那些不熟悉Pi的人来说,它具有非常有限的硬件资源(包括512 MB的内存),可以像我正在使用的那样轻松地被循环使用。 我要在这里实现的目标是找到另一种方法让bash找出值何时从更改为0,1而不必为此专门指定一个无条件循环。这可行吗?请分享您的想法。

1
使用终端的自动完成路径功能输入到Shell脚本
我想编写一个脚本,该脚本是:(1)获取一个路径,使用户能够使用制表符自动完成,然后(2)从用户获取文件名,然后(3)在该路径下创建一个扩展名为的文件。文本文件。 我的问题是:我该怎么办1.?我如何告诉bash要求输入“自动完成”路径,最好是部分路径(例如〜/ x /)已默认填充? 注意:路径几乎总是包含空格。

4
重定向并记录脚本输出
我正在尝试整理以下代码段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。 我不在乎用户输入(在此阶段),目标脚本是非交互式运行的。 该代码段需要 输出标准输出到日志,并始终回显到控制台 输出stderr记录日志,并回显到控制台,如果已启用调试 stderr消息应带有时间戳和其他用途 目前,我有以下内容只能在最新版本的bash(4.2+?)下进行测试,例如在Ubuntu精确版中,但是在CentOS6上表现不佳。 DEBUG_LOG="${0##*/}.log" # copy stdout to log always and echo to console exec > >(tee -a ${DEBUG_LOG}) # copy stderr to log only, unless debugging is enabled [ $DEBUG_TEST = "true" ] \ && exec 2> >(tee -a ${DEBUG_LOG} >&2) \ || exec 2>> …

2
列出所有比给定时间戳更新的文件并对它们进行排序
我只想列出目录/ tmp 中格式比时间戳新的所有文件(按日期排序)20130207003851。子目录可以省略。 使用SUSE Linux Enterprise Server 11。 输出格式应为 S0002948.LOG Feb 7 03:28 S0002935.LOG Feb 7 05:58 S0002952.LOG Feb 7 09:58 S0002940.LOG Feb 7 11:58 找到/ tmp -newermt“ 2013年2月7日” -ls列出了我想要的文件,但是 如何使用格式20130207003851的时间戳 如何排序输出? 如何只显示文件名和日期。首先是文件名,然后是日期? ps我不想使用touch创建参考文件以进行查找 pss find -newermt "20130207003851" -ls find: I cannot figure out how to interpret `20130207003851' as a …

2
为什么这种“读取时”在终端中起作用,而在Shell脚本中却不起作用?
我在用信息文本填充WM栏时遇到了一个有趣的问题,该信息文本是通过设置根窗口的标题来应用的,即 xsetroot -name "clever words" 为此,在终端机上打印一笔财富可以正常工作: fortune -s | while read -r; do xsetroot -name "$REPLY"; done 但是,从shell脚本运行时,同样会失败: #!/bin/sh cat /tmp/afile | while read; do echo "$REPLY"; done 产生: $ sh afilereader afilereader:2:读取:arg计数 当然,可以通过将我们的财富结果分配给一个变量,然后将xsetroot与所述变量一起使用来补救。但是我仍然想了解为什么这在脚本中不起作用。 我意识到管道两侧的每个命令都在其自己的子外壳中运行,但是看不到它们的局部变量如何影响while读取循环。还是变量甚至在循环迭代之间都超出范围? 我想念什么? 更新:在sh我以前被链接到仪表板,这是正在取得POSIX兼容的过程。使用比较古老的bash解决了这个问题。

3
切换setxkbmap的脚本
我想要一个bash脚本,它可以在setxkbmap se和之间切换 setxkbmap us。 然后,我的意图是CtrlEsc通过键盘>自定义快捷方式将该脚本映射到。 关键是我想用切换键盘布局CtrlEscape。我该如何实施?

1
Bash脚本不读取输入
我有一个脚本,该脚本应该在后台运行命令,并且可以执行该命令。问题在于,当脚本执行读取命令时,它不会暂停并接受输入。这里是: printf "Where is yo music?: " read musicPath cd $musicPath ls | while read currentSong;do seconds=`mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1` hours=$((seconds / 3600)) seconds=$((seconds % 3600)) minutes=$((seconds / 60)) seconds=$((seconds % 60)) echo "Song: $currentSong" echo "Length: $hours:$minutes:$seconds" afplay "$currentSong"& printf "yes (y), no (n), or …

2
当sh是bash或破折号的符号链接时,bash会将其自身限制为POSIX兼容,因此它应该与sh 100%兼容吗?
从bash和sh之间的区别: ABck的问题:如果你有/bin/sh一个链接的bash,那么bash将不会调用时为具有相同的行为/bin/sh,因为它不会在调用时/bin/bash。当称为时sh,它将限制自己为大多数POSIX兼容以及一组有限的扩展。 这是否意味着每当我在Linux中遇到带有shebang的shell脚本时#!/bin/sh,即使在该发行版上,它bin/sh都是到另一个shell(例如破折号或bash)的符号链接,它应该与bourne shell 100%兼容,因为是否将自身限制为一组有限的扩展名?这样我可以在FreeBSD中执行它们吗?有例外吗?还是我应该确定它会起作用? 因此,如果在发行版上bin/sh是的符号链接bin/bash,并且使用了脚本#!/bin/sh并且该脚本包含bashism,则该脚本将不会运行,因为bash会喜欢处于sh模式?

1
如何找出shell脚本是用bash还是sh编写的
如何确定脚本是用bash还是写的sh? 脚本的第一行在这里没有帮助,因为在Linux上,bash脚本具有以下行: #!bin/sh 实际上,有很多发行版/bin/sh是bash(也许/bin/sh是/bin/bash这些发行版中的链接),而不是Bourne Shell。因此,如果我尝试在FreeBSD中运行以bash编写的脚本,则结果未定义,因为/bin/sh在FreeBSD中是Bourne Shell,而不是bash。 有没有简单的方法可以识别脚本是bash还是sh? 语法中有一些与众不同的东西吗?

6
如何使用终端发推文?
我想使用终端发布一条消息。 我尝试了类似的东西: curl -u 'TwitterUsername':'TwitterPassword' -d status=”Your Message Here” https://twitter.com/statuses/update.xml 但似乎这不再起作用了。 我收到这样的错误: <?xml version="1.0" encoding="UTF-8"?> <errors> <error code="53">Basic authentication is not supported</error> </errors> 那么,我们怎么从终端上发推文呢? PS .:我这样做的动机是因为我经常使用Yakuake终端,所以从那里发推文真棒。

5
如何在Korn Shell中获取subshel​​l的PID(相当于$ BASHPID)
在bash中,您有一个方便的变量:$ BASHPID wich始终返回当前运行的子Shell的PID。如何在ksh中获取子外壳的PID?例如,请参见下面的代码: #!/usr/bin/ksh93 echo "PID at start: $$" function run_in_background { echo "PID in run_in_background $$" run_something & echo "PID of backgrounded run_something: $!" } function run_something { echo "*** PID in run_something: $$" sleep 10; } run_in_background echo "PID of run in background $!" 输出以下内容: PID at start: …

1
除预定列表外的所有磁盘上的“ echo 1> / sys / block / sdX / device / delete”
我有需要删除的scsi磁盘列表。该列表充其量被认为是随机的,并且会不时变化。我想删除除我创建的预定义列表以外的所有内容。现在假设我只想保留: /dev/sda /dev/sdb 我需要执行的命令是: "echo 1 > /sys/block/sdX/device/delete" 其中X是要删除的设备。 我不擅长bash脚本编写,所以我真的不知道从哪里开始。 回顾一下,所以我不会因为不清楚而得到DV。 我需要为系统上的每个sdX设备“回显1> / sys / block / sdX / device / delete”(预定列表除外)。 编辑:下面的答案后,这是我决定使用的。“ LocalDisks.txt”应包含“ / dev / sda”之类的行 #!/bin/bash exclude=$(cut -d/ -f3 LocalDisks.txt) for sysfile in /sys/block/sd* ; do dev=$(basename $sysfile) del=$sysfile/device/delete if [[ $exclude == *$dev* ]] ; then …

6
如何将制表符分隔的数据转换为逗号分隔的数据?
我通过亚马逊的ec2命令行工具请求ec2快照列表: ec2-describe-snapshots -H --hide-tags > snapshots.csv 数据看起来像这样: SnapshotId VolumeId StartTime OwnerId VolumeSize Description snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup 我如何在将数据重定向到之前拦截数据snapshots.csv并执行以下操作: 用逗号替换“制表符” 用引号封装值 如果值是全数字,请在=其前面加上一个前缀,以便excel将其视为文本-例如OwnerId应为"=5098939“(如果不能内联完成则不需要此,而是需要脚本文件或函数) 所需的输出: "SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description" "snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"

3
在脚本中测量时间
此线程显示了如何测量运行脚本所花费的时间。就我而言,我有兴趣测量脚本中两点之间的时间 。这是我想如何使用此示例: start_measuring_time Line 1 Line 2 .. Line N stop_measuring_time show_elapsed_time 我希望显示的时间是人类可读的(秒,分钟,小时,天等),如果可能的话。任何想法如何做到这一点?

4
您是否喜欢bash脚本或别名作为快捷方式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我有一个~/bin目录(位于上PATH),其中存储了很多小的1或2行脚本。其中一些只是cd进入目录并在文件之类的文件上运行命令vim。但是我的文件中还有很多别名,.bash_aliases它们起着相同的作用。 在编写一些bash脚本和编写别名之间,您如何决定?到底走哪条路都重要?

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.