Unix & Linux

Linux,FreeBSD和其他类似Un * x的操作系统用户的问答

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
虚拟USB HID设备
我正在开发将与连接的USB HID设备通信的应用程序。问题是还没有真正的设备(我们团队的另一部分正在开发中),所以,我真的很想找到一种模拟它的方法。 我能想到的理想实用程序应该是这样的:一个内核模块,在加载时会在系统中创建两个设备节点: 一个虚拟的USB隐藏设备,可能与任何真实的USB隐藏设备节点都没有区别/dev/hidraw0;当然,无论我使用哪种USB隐藏库,都应该可以看到此设备hidapi。 服务设备节点,例如/dev/virtual_hid_1。 因此,当有人向写入/dev/virtual_hid_1数据时,应从字面上读取该数据/dev/hidraw0,反之亦然。 这样,我可以用任何想要的语言编写调试应用程序,无论是哪种语言python。它应该只往返读写/dev/virtual_hid_1。这将非常方便开发。 有这样的东西吗?

3
wget不支持https
我想https://example.com使用该wget命令进行下载,但是它显示为“不支持/无法识别的协议”。我尝试使用,--secure protocol=''但这不起作用。我从GNU wget下载了tar文件,并尝试配置它,但失败了。 这是我所看到的示例: bash-2.05$ wget https://www.facebook.com/ https://www.facebook.com/: Unknown/unsupported protocol. bash-2.05$ 大家好,谢谢您的回答,我的wget的验证版本如下所示 bash-2.05$ wget -V GNU Wget 1.6 Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty …
9 wget  https 

2
获得有关窗口标题更改的通知
...无需投票。 我想检测当前焦点窗口何时更改,以便可以在系统中更新一个自定义GUI。 兴趣点: 实时通知。有0.2s的延迟是可以的,有1s的延迟是meh,有5s的延迟是完全不能接受的。 资源友好:由于这个原因,我想避免轮询。运行xdotool getactivewindow getwindowname每一秒钟(例如半秒)的工作还算不错……但是生成2个进程每秒对我的系统是否如此友好? 在中bspwm,bspc subscribe每当窗口焦点改变时,就可以使用它打印带有(非常)基本统计信息的行。这种方法乍一看似乎不错,但是当窗口标题本身发生更改时,侦听此方法将无法检测到(例如,在网络浏览器中更改选项卡将不会被注意)。 那么,在Linux上每隔半秒钟就可以生成一个新进程吗?如果没有,我该如何做得更好? 我想到的一件事是尝试模仿窗口管理器的功能。但是我可以独立于工作的窗口管理器为事件(例如“窗口创建”,“标题更改请求”等)编写钩子,还是我需要成为窗口管理器本身?我需要root吗? (我想到的另一件事是查看xdotool的代码,并仅模仿我感兴趣的事物,这样我就可以避免所有进程产生样板,但仍然会轮询。)

3
我的crontab日志文件在哪里?
在我的debian7上没有/ var / log / cron,没有/var/log/cron.log,我的crontab日志文件在哪里? ls /var/log/cron* ls: cannot access /var/log/cron*: No such file or directory
9 cron 

5
CentOS重新启动后,LVM卷处于非活动状态
我已经从CentOS 6到7重新安装了Linux服务器。该服务器具有3个驱动器-一个系统SSD驱动器(除所有内容外,它托管所有内容/home)和两个托管的4TB HDD驱动器/home。一切都使用LVM。两个4TB驱动器已镜像(使用LVM本身中的raid选项),并且它们完全被/ home分区填充。 问题是,尽管可以很好地识别4TB磁盘,并且LVM可以看到该卷没有问题,但是它不会自动激活它。其他所有内容都会自动激活。我可以手动激活它,并且它可以工作。 我在/ home中有旧系统驱动器的映像。那也包含LVM卷。如果我使用安装它kpartx,则LVM会拾取并激活它们。但是我看不到那些卷和不活跃的卷之间没有区别。 根文件系统也是LVM,并且可以正常激活。 但是,我看到了一个奇特的事情:执行lvchange -aay告诉我,我需要指定要激活的驱动器。它也不自动执行。如果我指定lvchange -ay lv_home-可以。 我找不到任何可能导致此行为的原因。 补充:我注意到旧系统(使用init)包含vgchange -aay --sysinit在其启动脚本中。新版本使用systemd,但vgchange在其脚本中看不到该调用。但是我也不知道该放在哪里。 增加了2:开始找出systemd。我找到了脚本的位置,并开始了解它们的调用方式。还发现我可以通过看到执行的脚本systemctl -al。这说明启动后lvmetad它会调用pvscan每个已知的udev块设备。但是,此时只有一个注册的udev块设备,这是公认的lvm卷之一。硬盘也在那里,但是使用不同的路径和更长的名称。公认的块设备就像8:3硬盘一样/device/something/。我不再在服务器上了,所以我无法精确地编写它(稍后将解决此问题)。 我认为这与udev和设备检测/映射有关。我将在晚上继续学习,然后学习udev。 如果其他所有方法均失败,则我找到了调用的脚本,pvscan并检查了是否可以修改它以始终扫描所有设备。这可以解决问题,但是看起来很丑陋,因此,我将尝试找出真正的根本原因。 添加3:好吧,我仍然不知道为什么会这样,但是至少我做了一个相当可行的解决方法。pvscan在启动之后,我又做了一次调用一次的systemd服务lvmetad。该特定设备的另一个调用仍然存在,我认为实际上udev是它的调用(这是我找到对其的唯一引用)。为什么其他硬盘驱动器不调用它-我不知道。
9 centos  rhel  lvm 

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 

7
在保留减号的同时删除某些列中的数值?
我有以下数据框,该数据框仅在奇数列中以负数无限地水平和垂直地继续: -1 2 3 4 -5 9 2 3 -4 5 -6 11 我想要第二,第四和第六完整列(或每个偶数列),而负号仅来自第一,第三和第五(或每个奇数列),所以我得到了: - 2 4 - 9 3 - 5 - 11 最终结果如下: -2 4 -9 3 -5 -11 因此,我需要不改变偶数列和奇数列的值,如果有一个负值,则保留-仅值,如果有一个正值,则将其丢弃。 有没有办法用awk / sed做到这一点? 据我所知,这是差不多的了: awk '{ for (i=2;i<=NF;i+=2) $i="" }1' FILE.txt | sed 's/[0-9,.]*//g'

2
在Gnome3(Fedora 22)中更改默认文件管理器
我刚刚切换到Fedora 22,并决定这次选择Gnome3,而不是XFCE。我喜欢Thunar文件管理器,所以我下载了它。我在将其设置为默认文件管理器时遇到了麻烦。 我试过的 我跑了exo-preferred-applications。在Utilities -> File Manager我选择下Thunar。 问题: 它不充当默认文件管理器。当我Downloads从浏览器中打开文件夹时,仍然显示Nautilus。单击我的按钮时也一样"Places"。

3
“ date -d”命令在Docker Alpine Linux容器上失败
我使用以下Dockerfile 在Docker容器中构建了Alpine Linux: FROM alpine:3.2 RUN apk add --update jq curl && rm -rf /var/cache/apk/* 构建成功运行: $ docker build -t collector . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM alpine:3.2 3.2: Pulling from alpine 8697b6cc1f48: Already exists alpine:3.2: The …

1
Bash自动完成如何工作?
我可以理解bash自动完成功能适用于标准实用程序。但是,如何对自定义程序(例如Oracle SQL loader)自动完成? 在以下命令中,如果按Tab键,control=则它将自动完成为控制文件名: sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log 如何知道此时必须填充控制文件而不是其他文件?

3
超时功能返回值
我在debian上使用了超时功能,等待5秒钟等待我的脚本。效果很好,但我遇到的问题是我需要一个返回值。像1表示超时,0表示没有超时,我该怎么做? 看一下我的代码: timeout 5 /some/local/script/connect_script -x 'status' > output.txt # here i need the return of timeout 如您所见,我的connect_script -x'status'以字符串形式返回状态并将其打印到屏幕上(可能看不到)。此问题的背景是,如果服务器(用于connect_script)被冻结,则脚本将不执行任何操作。这就是为什么我需要超时的原因。当超时时,我想重新启动服务器。我可以做到,但是我不知道如何查看它是否超时...

2
systemd在Debian 8.0 Jessie启动时等待网络的时间太长
我的系统已经启动了比较快的,同时然Debian的7喘息,但之后升级到Debian的8杰西,因此从SysVinit到systemd,它成为一种方式,方法要慢。 减慢启动速度的是网络。等待网络接口的更新时间超过1分钟。我不知道其中的内容/etc/network/interfaces会影响启动过程,因此这里是整个过程。 / etc / network / interfaces: allow-auto lo iface lo inet loopback auto wlan0 iface wlan0 inet static address 192.168.150.1 netmask 255.255.255.0 auto eth1 iface eth1 inet manual up ifconfig $IFACE 0.0.0.0 up down ifconfig $IFACE down auto eth2 iface eth2 inet manual up ifconfig $IFACE 0.0.0.0 up …

1
crypttab和VeraCrypt
我双重启动了Fedora和Windows Vista,并希望它们共享一个分区,以便我可以在Linux和Windows中处理相同的文件,并且我需要对所有内容进行加密。 由于TrueCrypt已过期,因此我使用VeraCrypt加密了共享驱动器。Windows可以轻松地在登录时挂载该卷。 我试图在Linux中做同样的事情,但是没有运气,因为我不知道如何使用crypttab该veracrypt选项,即使它有一个也不知道。 cryptsetup可以正常工作,因为只需要添加该--veracrypt选项,但crypttab似乎没有。 cryptsetup --veracrypt open --type tcrypt /dev/sdX veracrypt-volume 我如何使用挂载VeraCrypt卷crypttab?有可能吗


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.