Questions tagged «shell»

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

2
tmux:如何绑定键来启动Shell命令?
我用tmux两个窗格来开发:一个用于编辑代码,另一个用于编译。我经常需要切换窗格以启动编译命令(例如“ mvn install”)。 如何绑定键(例如“ Ctrl+ B C”)以在另一个窗格中(或根本没有任何窗格)启动该特定命令?
9 linux  shell  vim  tmux 


5
如何使xargs处理cat中的空格和特殊字符?
我有一个file包含名称列表的列表。即: Long Name One (001) Long Name Two (201) Long Name Three (123) ... 带有空格和一些特殊字符。我想用这些名称来制作目录,即: cat file | xargs -l1 mkdir 它使用空格分隔各个目录,即Long,Name,One,Two,Three,而不是 Long Name One (001),Long Name Two (201),Long Name Three (123)。 我怎样才能做到这一点?

2
如何使用非默认登录Shell进行ssh登录
我目前正在使用LDAP进行身份验证的网络中工作。设置zsh为登录外壳后,我遇到了一个问题,即可以远程访问ssh网络上显然没有zsh安装的其中一台计算机。登录失败并显示 Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist 因此,问题基本上是:我如何告诉远程计算机使用与LDAP中配置的登录外壳不同的登录外壳? OpenSSH_6.0p1 Debian-4 + deb7u2,OpenSSL 1.0.1e
9 shell  ssh  login 

5
检查是否所有列出的软件包都安装在bash中
我的二进制文件取决于这些boost库和相应的软件包: NAME | PACKAGE: --------------------------------------+----------------------------------- libboost_serialization.so.1.55.0 | libboost-serialization1.55.0 libboost_thread.so.1.55.0 | ibboost-thread1.55.0 libboost_date_time.so.1.55.0 | libboost-date-time1.55.0 libboost_signals.so.1.55.0 | libboost-signals1.55.0 因此,我想定义一个软件包列表: boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0" 现在,我想检查一下它们是否都已安装,然后才实际运行apt-get install。我知道apt会自动检查软件包是否已安装,但是我想在提示用户时先提示他是否要安装缺少的库。 那么,有没有一种很好的方法来检查是否已安装所有列出的库(具有上述变量)?
9 shell  apt  dpkg 


2
在shell中间接扩展变量
我需要在bashShell中间接引用变量。 我基本上是想make通过写作做些什么$($(var))。 我尝试使用${$var}哪种方法是最直接的解决方案,bash但随后出现此错误: bash: ${$var}: bad substitution 有没有办法做到这一点? 我所试图做的是遍历所有参数($1,$2,$3,...)来使用迭代变量的程序并没有间接我不能做到这一点。

5
如何*可靠地*和*简单地*获得当前的shell解释器名称?
我正在寻找一种简单可靠的方法来从脚本或源文件(而不是从命令行)中获取当前shell的名称。我本来希望这样做,$(basename "$SHELL")但是如果我的登录外壳是zsh且我在some_script.sh中具有以下代码 this_shell=$( basename "$SHELL" ) echo "The Shell is $this_shell" echo "The Shell is $0" 并且我用bash some_script.sh它运行zsh,bash即使使用的解释器还是列出了/bin/bash。我不确定为什么外壳设计人员选择显示默认外壳而不是当前外壳,但这似乎就是我们所坚持的。 还有其他一些稍微相似的问题(此处和此处),但是它们的答案在许多方面都不够。 他们通常会假设用户试图弄清楚他们当前正在使用哪种交互式外壳,但这太疯狂了。我知道我要在其中键入命令的外壳程序-我需要可以在任何地方运行的代码,以便能够确定正在使用的外壳程序。 他们通常会提供几种不同的方法来尝试-就像您在命令行上一样,并且可以四处弄弄,直到了解到您正在使用bash为止-但是我需要一件在所有情况下都可靠的方法。 它们通常会提供脚本中完全没有用的东西,例如echo $0。如上面的脚本所示,该操作失败。(是的,它可以在交互式shell命令行中工作,但是为什么您不知道使用的是哪个shell?) 他们有时会提供一些命令(在我的有限测试中),这些命令包含正确的信息,例如ps -p $$,但是缺少跨平台,跨外壳兼容的sed / awk命令来通过管道传递该命令以获取外壳名称,而忽略随之而来的其他信息骑。 它们包括只能在几个shell上使用的东西,例如$BASH_VERSION和$ZSH_VERSION。我要支持尽可能多的炮弹可能,如fish,csh,tcsh。 如何可靠,准确地检测到任何 当前的外壳?我正在寻找可以在各种平台,脚本和尽可能多的shell中正常运行的东西1。 更新:当我发布此问题时,我希望外壳中内置一些功能来提供此信息,但事实并非如此。由于现在看来不可避免地要依赖Shell之外的东西,因此我应该更加明确地表明,我正在寻求跨平台解决方案(尽管我对上述其他答案表示反对,但如果您不这样做的话,可能会很容易错过它。没有仔细阅读问题)。 更新2 如果由于Stéphane的回答不是仅Linux,还是有人仍然认为这是仅Linux的问题的重复,那么这里就是我所要求的与他所提供的之间的区别。(请注意,他写的东西很巧妙,我没有敲门,但这并不能解决我的问题。) 我在寻找的东西简单和可靠的,那 可以添加到任何脚本或函数的定义(将由一个被采购.zshrc或.bash_profile分支或其他)。 您不能将他的脚本用作将解释器名称传递给调用脚本/函数的外部实用程序,因为它将始终由默认解释器解释并返回该名称。这使得很难或根本无法实现我的目的。如果可能的话,这仍然非常非常困难,答案中没有给出解决方案。因此他没有回答我的问题,因此不是重复的。 如果你想看到的东西,将工作,看看ShellDetective GitHub上。这样可以更容易地看到SE上已经存在的内容与该问题正在寻找的内容之间的差异(实际上是为了满足该问题的需求而编写的,而其他地方都未满足)。 (PS,如果您无法相信有这样的用例,请想象将这些函数派生到.zshrc,.bash_profile或.profile取决于正在使用的服务器以及可用的外壳的函数。它们的来源使其没有shebang行。如果它们可以在任何外壳中工作,则非常有用,但有时他们必须知道所处的外壳才能知道如何运行。) 1我不关心“贝壳”,它不是任何传统意义上的贝壳。我不关心有人为自己编写的shell。我只关心真正出现在外壳中的真实外壳,并且可以想象有人在登录某些服务器时可能会不得不使用的外壳,而他们不能在其中安装所需的任何外壳。
9 bash  shell  zsh 

2
如何在grep中使用多行作为组分隔符?
在中,grep您可以用来--group-separator在小组比赛之间写一些东西。 这很容易弄清楚我们有哪些块,尤其是在使用-C Xoption获取上下文行时。 $ cat a hello this is me and this is something else hello hello bye i am done $ grep -C1 --group-separator="+++++++++" 'hello' a hello this is me +++++++++ something else hello hello bye 我在grep中使用空行作为上下文“ group-separator”来学习grep的方法,就是说只有一个空行--group-separator=""。 但是,如果我想有两个空行怎么办?我试着说,--group-separator="\n\n"但我得到字面值\ns: $ grep -C1 --group-separator="\n\n" 'hello' a hello this is me …
9 shell  grep  quoting 

2
如何获取给定路径的文件系统的UUID?
我收到目录或文件的路径。 哪个实用程序/ shell脚本可以可靠地给我该目录/文件所在的文件系统的UUID? 通过文件系统的UUID,我的意思是UUID=...条目,例如,blkid 我正在使用Redhat Linux。 (有人建议我应该在unix.stackexchange.com上问这个问题,所以我将其从原始的stackexchange.com中移出)

1
了解目录符号链接遍历和父目录
假设您有目录/dir1和/dir2/linked,其中目录是到目录的符号链接。 当您cd到达linkedand时pwd,您将获得输出/dir2/linked。如果这样的话cd ..,你会被戴上/dir2。此行为与您/dir2/linked之前的想法一致。但是,据我了解,..任何目录的父目录()都存储在目录inode中(即:物理上在磁盘中)。显然,既然/dir2/linked是true /dir1,那么inode上的父目录必须是/ 为了进一步使问题复杂化,而里面/dir2/linked的输出ls ..和cd .. ; ls .是不同的!似乎是在cd尊敬符号链接的路径,而在ls尊敬“物理”路径。就像这个问题中提到的那样,这里cd -P有用例。 man pwd 提到了“物理”和“逻辑”工作目录,但目前我仍然有几个问题: PWD如所述,此行为是否总是由环境变量提供的man pwd? 如果它们都是shell命令(即不是程序),为什么要默认cd并ls具有不同的行为? 是否使用典型程序(而非shell命令)PWD代替物理路径?我知道这取决于实现,但是有经验法则吗?

3
如何在不删除尾随换行符的情况下将stdin捕获为变量?
在shell脚本中... 如何在不删除尾随换行符的情况下将stdin捕获为变量? 现在我已经尝试: var=`cat` var=`tee` var=$(tee) 在所有情况下$var,输入流都不会包含尾随换行符。谢谢。 还:如果输入中没有尾随换行符,则解决方案不得添加。 根据接受的答案进行更新: 我在代码中使用的最终解决方案如下: function filter() { #do lots of sed operations #see https://github.com/gistya/expandr for full code } GIT_INPUT=`cat; echo x` FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter) FILTERED_OUTPUT=${FILTERED_OUTPUT%x} printf '%s' "$FILTERED_OUTPUT" 如果您想查看完整代码,请参阅github页面的expandr,这是我为信息安全目的而开发的一个开源git关键字-扩展过滤器外壳脚本。根据.gitattributes文件(可以是特定于分支的文件)和git config中设置的规则,无论何时将其签入或签出存储库,git都会通过expandr.sh Shell脚本通过管道传输每个文件。(这就是为什么保留任何尾随的换行或缺少换行的关键。)这使您可以清除敏感信息,并交换不同的特定于环境的值集以进行测试,暂存和实时分支。

6
使用未安装在远程计算机上的外壳
给定方案: 远程机器:SSH服务器;用户没有管理员权限; 本地计算机:SSH客户端;用户具有管理员权限。 如果从本地登录到远程的用户希望使用未安装在remote上的shell 与remote进行交互,那么用户如何单独完成此操作? 示例:用户在local上使用fish,并且也希望在remote上使用fish,但是remote仅安装了bash和zsh。

1
从“ su -c”启动的命令中删除process-id
我在外壳中运行Java程序,并将process-id写入文本文件。所以当我这样做时: nohup java app.Main > /dev/null 2>&1 & echo $! > /var/run/app.pid 有用。但我真的想以其他用户身份运行它 su - appuser -c "nohup java app.Main > /dev/null 2>&1 &" echo $! > /var/run/app.pid 这行不通。是否可以通过-c选项启动命令的进程ID?
9 bash  shell  su 

1
使用当前设置重新生成xorg.conf
很多人都在谈论这个问题,但是我没有找到满意的答案。 我正在接一个Debian杰西。目前,我已尝试nvidia-driver作为驱动程序,但它导致系统崩溃。所以我清除了所有nvidia包装。但是问题在于,/etc/X11/xorg.conf已将其替换为NVidia设置,并且xorg.conf.backup删除了备份。 NVidia设置的相关配置为: Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" EndSection 我曾经尝试将其更改nvidia为intel(also- NVidia> Intel),但分辨率要低得多(我的笔记本电脑有一个Intel Corporation Haswell-ULT Integrated Graphics Controller由by列出lspci)。因此,我可能需要nouveau用作驱动程序。但是简单地更改nvidia为nouveau无效。 看来最新的X系统可以在没有xorg.conf(by rm /etc/X11/xorg.conf)的情况下启动,但速度较慢。因此,我仍然更喜欢将xorg.conf与当前设置一起使用。 的版本Xorg: X.Org X Server 1.16.0 Release Date: 2014-07-16 X Protocol Version 11, Revision 0 Build Operating System: Linux 3.14-1-amd64 x86_64 Debian Current Operating System: Linux debian …

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.