相关疑难解决方法(0)

经过这次磨难后我还在使用 bash 吗?

在 Mountain Lion 主机上Coguaro,我coconutpowder使用以下命令以用户身份登录bash

Coguaro:~ coconutpowder$ echo $0
-bash
Run Code Online (Sandbox Code Playgroud)

我需要以提升的权限运行命令,因此我尝试su切换到root但它不允许我:

Coguaro:~ coconutpowder$ su -
Password:
su: Sorry
Run Code Online (Sandbox Code Playgroud)

费够了。我阅读了该man页面su并得到了这个:

PAM is used to set the policy su(1) will use.
In particular, by default only users in the ``admin'' or ``wheel''
groups can switch to UID 0 (``root'').
Run Code Online (Sandbox Code Playgroud)

我注意到我不属于任何一个允许su这样做的群体:

Coguaro:~ coconutpowder$ id
uid=502(coconutpowder) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts)
Run Code Online (Sandbox Code Playgroud)

所以我重新运行su命令,并在其前面加上 a 前缀sudo,我可以按照如下方式执行此操作/etc/sudoers

/etc/sudoers: coconutpowder …
Run Code Online (Sandbox Code Playgroud)

osx shell bash su shell-script

4
推荐指数
1
解决办法
610
查看次数

如何让 /etc/init.d 脚本像在 X 下启动一样?

我正在尝试追踪 Java 应用程序的一些怪癖,该应用程序在通过 /etc/init.d 中的启动脚本启动时行为异常,但是当您打开 GUI 终端窗口并通过 /etc/init.d/ 运行它时运行良好我的应用程序启动。(奇怪之处涉及应用程序的一部分,它使用 X 进行了一些hacky handwaving。)由于应用程序在通过终端窗口启动时运行良好,因此在深入研究(诚然微妙而不是我的)源代码之前,我正在查看它是如何启动的代码。

这篇文章的答案给了我一个线索,即 Gnome 终端正在窗口管理器中运行,这以某种方式影响(以一种很好的方式)我通过 bash 脚本启动的应用程序的环境。我能够验证通过 tty 终端(ctrl-alt-f1 或通过 ssh)启动脚本的行为与启动时启动的行为相同。

我的主要问题是:当计算机启动时,我可以做些什么来启动这个应用程序,但它是否像在 X 下启动一样?到目前为止,我们已经使用了脚本路由,因为它还需要使用某些参数启动 Java VM。

后续问题(严格来说是为了增强我的理解):当脚本通过窗口管理器中运行的某些东西启动时,幕后发生了什么使脚本行为不同?谷歌并没有在这方面启发我。

init-script x11 shell-script init.d

4
推荐指数
1
解决办法
1251
查看次数

为什么在使用`--login` 选项调用的登录shell 上看不到$0 中的单个连字符?

man bash 说,

 A login shell is one whose first character of argument zero is a -,  or
 one started with the --login option.
Run Code Online (Sandbox Code Playgroud)

当我们调用mintty -Cygwin等终端时,我们可以看到-$0 中的单个连字符 ( )。

$ echo $0
-bash
Run Code Online (Sandbox Code Playgroud)

但是如果我们调用带有--login选项的登录shell ,我们就看不到-.

$bash --login
$echo $0
bash
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 的作用是-什么?虽然我们在登录 shell 上看不到它被调用--login,但我们可以通过查询相关的 shell 选项来检查 shell 的类型,例如shopt -q login_shell. 它是做什么用的?

  2. 如果有重要作用-,为什么我们在用 调用的登录shell 上看不到它--login

  3. 我们如何手动调用零参数以 开头的登录shell -

  4. 其他 shell 也是这种情况,例如 zsh、csh?

shell bash login

4
推荐指数
2
解决办法
874
查看次数

.bash_history 不断截断

即使我设置了,我的 .bash_history 也会不断截断:

export HISTSIZE=
export HISTFILESIZE=
Run Code Online (Sandbox Code Playgroud)

在我的.bash_profile. 我不确定它何时发生,但当我注销或关闭计算机时可能会发生。由于这个问题已经有一段时间了,我尝试在我的计算机上设置相同的变量/etc/profile,但这并不能解决问题。

它确实达到了 2000 行(这是我在它被截断之前看到的最大值),但有时它只是被截断,我稍后会注意到这一点。我能做些什么来解决这个问题?

osx bash command-history

4
推荐指数
1
解决办法
1271
查看次数

为什么 GNOME 显示管理器总是读取 .profile?

我最近从终端提示登录(getty?)切换到 GNOME 显示管理器。这似乎是GDM总是读.profile,无论登录shell(岩组在我的情况)的用户设置。这是为什么?我认为它在他们的源代码中是硬编码,但我找不到。他们为什么这样做?该软件是否依赖于 Bourne shell 的某些功能?

这是不是很好,如果我想同时使用GDM和盖蒂(作为后备),因为我那么就需要让我.profile.zprofile同步。我不那么自信采购.profile.zprofile(我遇到过一些兼容性问题,当我试图源.bashrc.zshrc)。我认为 Bash/bin/sh在 POSIX 模式下被称为行为,但我不确定它是否避免了所有陷阱。

以防万一,我使用的是最新的 Arch Linux,使用 Wayland 运行 GNOME(所以不应该Xsession涉及任何脚本)。

gnome zsh gdm gnome3 gdm3

4
推荐指数
1
解决办法
2119
查看次数

ps 输出中 bash、-bash 和 /bin/bash 之间的区别

有人在服务器上的 bash(以 root 身份登录)中产生了一个 while true 循环。它不断产生进程,幸运的是它退出了,但我需要杀死父进程。我开始知道它是直接从命令行生成的,而不是从脚本生成的,所以我搜索了“-bash”并杀死了 root 拥有的那些进程。它工作得很好。

当你这样做时ps aux,在命令列中会出现不同的 bash 变体。

/bin/bash
-bash
-bash
-bash
/bin/bash
bash
/bin/bash
/bin/bash
bash
Run Code Online (Sandbox Code Playgroud)

等等..

有什么区别?

bash ps

3
推荐指数
1
解决办法
4365
查看次数

从 .bash_profile 加载 .profile 还是根本不使用 bash_profile?

我在运行 Yosemite 的 MAC 上。

直到最近,我只有一个 .profile,其中我将目录添加到我的 PATH 中。

现在我有一个 .bash_profile,根据我的经验和后来在网上阅读的内容,它会导致打开终端窗口时忽略 .profile。

经过一些阅读后,我确实了解 .pofile 和 .bash_profile 有何不同。我确实知道 .bash_profile 仅在启动 shell 时被调用。

然而,我仍然不确定,对于基本用户来说,以下任一方面的缺点(如果有的话)是什么:

  • 从 .bash_profile 调用 .profile,
  • 或者直接忽略 .bash_profile 并直接从 .profile 文件中的 shell 设置我可能需要的所有环境变量。

例如,我在这里读到,由于 .bash_profile 存在时 .profile 被忽略,所以我可以添加

. ~/.profile 
Run Code Online (Sandbox Code Playgroud)

在我的 bash_profile 中调用 .profile。

或者,虽然我知道 .bash_profile 允许我设置 bash 之外不需要的变量,但我仍然可以在 .profile 中设置我需要的所有内容,并且看不到使用 .bash_profile 给我带来了什么。

environment-variables

3
推荐指数
1
解决办法
7829
查看次数

每次登录时 bash 提示符都会重置

我前段时间问过这个问题,关于 shell 不显示路径。最近我发现.bashrc没有获取来源(这应该是正常做法?)。目前,shell命令提示符是这样的:

-bash-4.3#
Run Code Online (Sandbox Code Playgroud)

执行后source .bashrc,我可以获得预期的 shell 命令提示符:

root@ubuntu2011:~#
Run Code Online (Sandbox Code Playgroud)

哪里ubuntu2011是机器名称。如何让我每次登录时的提示都是后一种?

ps.bashrc来自:cp /etc/skel/.bashrc ~/.bashrc


更新:内容~/.profile如下:

# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n
Run Code Online (Sandbox Code Playgroud)

echo $BASH返回/bin/bash


更新:@terdon 问题的答案:

  1. 我如何登录服务器?

ssh root@111.222.333.444用来登录root

  1. 这些命令是作为 root 执行的吗?

是的。


更新:输出ls -l ~/.{profile,bashrc,bash_profile,bash_login}

ls: cannot …
Run Code Online (Sandbox Code Playgroud)

bash prompt

3
推荐指数
1
解决办法
2280
查看次数

.login 和 .cshrc 文件之间的确切区别是什么?

我在互联网上搜索过,网站说我们可以根据需要编辑.cshrc文件,然后执行第一个文件,然后执行.login文件。

那很好,但两者之间的确切区别是什么。请用通俗的话说。谢谢

login csh

3
推荐指数
1
解决办法
7133
查看次数

为什么 .bash_profile 和 .bashrc 都有?

同时拥有.bash_profile和有什么意义,.bashrc前者通常采购后者,后者又/etc/bashrc在登录时采购?将.bashrc中的所有内容都放在.bash_profile 中(或反之亦然)并仅提供该登录脚本有什么缺点?

login profile bashrc

3
推荐指数
1
解决办法
7349
查看次数

dash 可以代替 bash 作为我的默认 shell 吗?

从我读到的内容来看,dash可以使用以下命令将其制作为 shell

~$ chsh shirish
Password: 
Changing the login shell for shirish
Enter the new value, or press ENTER for the default
    Login Shell [/bin/bash]: 
Run Code Online (Sandbox Code Playgroud)

我只需要安装dash并给出登录shell的路径/bin/dash。如果我这样做,它不会读取.bashrc但可能正在读取.profile. 这是我的,我.bashrc可以只是剪切和粘贴.bashrc,破折号的行为将与 bash 在历史记录大小、提示类型和我想要或不想要的 cowsay 实例方面完全一样吗?

这是我的.bashrc

$ cat .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;; …
Run Code Online (Sandbox Code Playgroud)

command-line shell bash login dash

1
推荐指数
2
解决办法
4735
查看次数

如果 $HOME 包含空格,则不会在 WSL 上读取 .bashrc

我最近:在 /etc/passwd 中为用户指定了一个主目录路径,其中包含空格?但是现在.bashrc当我打开 Ubuntu 16.04 LTS WSL 窗口时,我的源无法正确获取,所以我必须source手动进行...它适用于source ~/.bashrc,但奇怪的是不适用于source $HOME/.bashrc,但奇怪的是适用于source "$HOME"/.bashrc.

因此,Jeff在上一个问题上认为,问题可能在于其他东西在采购它时没有引用它。

事实上,一个类似的问题导致我fork git hub 项目,其中发生了类似的错误;我认为这是因为我在 Windows 上使用了 mingw64/git-bash,但这根本不是问题,因为现在它发生在 WSL 中......至少我认为是这样......

bash quoting home windows-subsystem-for-linux

0
推荐指数
1
解决办法
1577
查看次数