Questions tagged «shell»

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

4
写入文件而不进行重定向?
我正在编写一个常规的已编译应用程序,该应用程序需要创建一个特殊文件并向其中写入魔术cookie。我无法直接从应用程序写入文件,系统安全模型要求我启动具有提升权限的帮助程序工具来完成此操作。我可以为助手工具提供任意数量的参数。现在,我想选择一些非常简单的系统命令作为辅助工具,并为我创建文件。像这样: /bin/sh -c "/bin/echo -n 'magic' > /some/where/file" touch因为我需要将cookie写入文件,所以Simple 不能将其剪切,echo没有shell包装器的Simple 不能正常工作,因为它需要重定向才能写入文件。我不愿意以root权限调用shell来完成这样的琐碎任务。我可以调用一些真正简单,受约束的系统命令来为我编写文件吗?

2
为什么我不能使用chsh命令更改外壳?
至少我以为,我学会了一条新命令,因为该命令:的chsh行为不像所描述的那样。 它被描述为这样工作: cat /etc/shells 要知道安装了哪些外壳,因此可以在其中进行选择。 这样做echo $SHELL就知道了,它外壳所使用。 选择一种贝壳并输入 chsh -s /path/to/shell 输入密码并使用验证echo $SHELL您是否在新的外壳中。 我这样做了,输入密码时没有收到错误消息,但是我仍然在同一外壳中。 % echo $SHELL /bin/bash % cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash % chsh -s /bin/sh Password: % echo $SHELL /bin/bash

10
使用Shell脚本从字符串中删除所有重复的单词
我有一个像 "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" 我想从字符串中删除重复的单词,然后输出将像 "aaa,bbb,ccc" 我尝试过此代码源 $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs 使用相同的值可以正常工作,但是当我提供变量值时,它也会显示所有重复的单词。 如何删除重复的值。 更新 我的问题是如果用户相同,则将所有对应的值添加到单个字符串中。我有这样的数据-> user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red CCC | …

7
如何在Bash中通过不同的代码点打印ASCII字符?
在ASCII表中,存在'J'字符,该字符在不同的数字系统中具有代码点: Oct Dec Hex Char 112 74 4A J 可以通过打印printf '\112'或通过八进制代码点打印此字符 echo $'\112'。如何通过十进制和十六进制代码点表示形式打印相同的字符?
12 bash  shell  ascii 

1
外壳程序脚本中的陷阱处理和隐式子外壳
假设您有一个Shell脚本,该脚本通过EXIT陷阱运行某种清理代码,如下所示: #!/bin/bash mytrap () { echo "It's a trap!" >&2 } trap mytrap exit echo I am at the end of the script. 如预期的那样,这将It's a trap!在脚本退出时打印出来: $ sh myscript I am at the end of the script. It's a trap! 您修改脚本以添加一个函数,该函数生成一些最终将通过管道传递给另一个命令的输出,如下所示: #!/bin/bash mytrap () { echo "It's a trap!" >&2 …
12 shell  trap 

2
通过外壳测试对阵列的支持
有没有一种简洁的方法可以在命令行中通过类似Bourne的本地shell测试数组支持? 这始终是可能的: $ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi 或测试$SHELL和shell版本: $ eval $(echo "$SHELL --version") | grep version 然后,假设我可以访问它,则阅读手册页。(即使从那里开始/bin/bash,我也假设所有类似Bourne的shell都接受long选项--version,例如,对于ksh 来说,这样做会导致中断。) 我正在寻找一个简单的测试,可以在脚本开始时甚至在调用它之前将其无人值守并纳入“ 用法”部分。

2
bash find:获取找到文件的目录
我有一个名为“ parent_folder”的父文件夹,其中包含许多子文件夹,在这些子文件夹中是一个名为“ foo.mp4”的文件。 通过执行以下操作,我可以轻松找到这些文件: mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \; 现在返回相对于parent_folder /的每个文件的路径 ./path/to/foo.mp4 我怎么能只返回路径,而没有文件名?
12 shell  find  osx 

4
杀死在后台运行的Shell脚本
我已经编写了一个shell脚本来使用inotifyt-tools的inotifywait实用程序监视目录。我希望该脚本在后台连续运行,但是我也希望能够在需要时将其停止。 为了使它连续运行,我习惯了while true;像这样: while true; do #a set of commands that use the inotifywait utility end 我已经将其保存在文件中/bin并使其可执行。为了使其在后台运行,我使用nohup <script-name> &并关闭了终端。 我不知道如何停止此脚本。我看过的答案在这里和非常密切相关的问题在这里。 更新1: 根据下面的@InfectedRoot的答案,我已经能够使用以下策略解决我的问题。初次使用 ps -aux | grep script_name 并sudo kill -9 <pid>用来杀死进程。然后,我不得不再次pgrep inotifywait使用sudo kill -9 <pid>ID作为返回值。 这行得通,但我认为这是一种凌乱的方法,我正在寻找更好的答案。 更新2: 答案包括杀死2个进程。这很重要,因为在命令行上运行脚本会启动2个进程,1个是脚本本身,2个是inotify进程。
12 bash  shell  kill  inotify 

3
grep:输入文件“ X”也是输出
我使用ubuntu 14.4,并尝试将grep命令的输出重定向到文件,但我不断收到此错误: grep: input file 'X' is also the output 我已经搜索了这个问题,才发现这是一个错误,ubuntu 12.4并且没有任何描述,有人可以帮助我解决这个问题吗? 我运行以下命令: grep -E -r -o -n r"%}(.*){%" > myfile

5
无法ssh,连接会立即以退出状态254终止
我记得最近的事情是将软性和硬性memlock ulimit更改为unlimited。现在,我无法进入机器。 这是ssh日志。 Authenticated to IP ([IP]:22). debug1: channel 0: new [client-session] debug2: channel 0: send open debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug2: callback start debug2: fd 3 setting TCP_NODELAY debug2: client_session2_setup: id 0 debug2: channel 0: request pty-req confirm 1 debug1: Sending environment. debug1: Sending env LC_CTYPE …
12 shell  ssh  ulimit 

4
所有ssh命令的本地时间戳记录?
如何保留我在其中使用的所有远程命令的本地时间戳记ssh(命令行openssh客户端始于bash)? 要求: 必要: 100%客户端,无需依赖服务器日志 为每个用户配置或安装的日志存储在用户的主目录中。 支持区分与多个用户和主机的多个同时会话。 非侵入性(无需每次都激活它,并且不会严重干扰使用ssh) 高优先级: 没有记录输出或尽可能过滤掉 密码条目未记录或文件已加密 指示实际使用的命令(在完成制表符/历史记录,退格键,CTRL+ C等之后的操作) 很高兴有: 还记录链接会话中的命令(在远程ssh或su <user>会话期间输入的命令) 会话的开始和结束应被记录 一个bash基于简单的,非root用户的解决方案将是最好的(也许是该命令的alias或bash包装脚本ssh?) 我的技能水平: 我对编程并不陌生,但仍在学习bash和学习“ Linux方式”,因此,对带有简短说明的代码示例将不胜感激。 可能的策略 键盘记录程序 -问题:记录密码,不记录选项卡/历史记录完成(请参阅glenn的回答) screen每秒进行一次回滚转储,并diff在它们之间找到新的回滚行 -问题:如何以一种有用的自动化方式实现这一点? ssh "$@" | tee >(some_cleaner_function >> $logfile) -问题:无法在链接的会话中处理多行命令或历史记录,需要仔细清理(请参阅我的答案) 以上一些的组合 一个例子 以下SSH会话: user@local:~$ ssh user@remote Last login: Tue Jun 17 16:34:23 2014 from local user@remote:~$ cd …


2
在zsh别名中转义引号
关于这个关于从文本中去除换行符的问题之后,我想将其转换为zsh别名,如下所示: alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"' 我尝试将awk脚本中的引号转义,但出现此错误: awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted (该文件称为bspsrobustness) 有什么方法可以做我想要的吗?我想我可以将其转换为awk脚本而不是zsh别名,这是我的最佳选择吗?
12 shell  zsh  quoting  alias 

2
了解Shell内置命令
在bash手册中,写道 Builtin commands are contained >>> within <<< the shell itself 另外,这个答案指出 A built-in command is simply a command that the shell carries out itself, instead of interpreting it as a request to load and run some >>> other program <<< 在上运行compgen -b时bash 4.4,我会收到所有shell内置命令的列表。我看到例如,[并且kill被列为shell内置程序。但是它们的实际位置是: /usr/bin/[ /bin/kill 我认为这是builtin将命令编译为/bin/bash可执行文件的一种手段。因此,真正使我感到困惑的是:请纠正我,但是builtin当一个单独的命令实际上不属于shell的一部分时,它又如何成为a 呢?


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.