ubuntu折腾笔记2

发生了什么

  1. 执行诸如eclipse这样的东西的时候,一层一层打开目录很麻烦,遇到需要root执行的时候桌面快捷方式又不好用。
  2. 在root或者sudo打开atom之类文本编辑器的时候,fcitx失效。

快速解决

问题1

  1. 在用户目录里新建一个文件:~/.bash_aliases
  2. 打开这个文件并在里面添加如下的文字
    alias eclipse="sudo sh -c 'nohup 你的eclipse的安装目录/eclipse > /dev/null 2>&1 &'"
    
  3. 然后在该用户的命令行里就能直接输入eclipse打开了。

问题2

  1. 还是上面那个文件,没有就建一个,注意这次是在root用户的home里。
  2. 添加
 ef(){
 export GTK_IM_MODULE=xim
 export QT_IM_MODULE=xim

 $1

 export GTK_IM_MODULE=fcitx
 export QT_IM_MODULE=fcitx
 }
  1. 在root用户下执行
ef 你的命令

新问题:ef不认用户自己写的alias

那就把方法里那几个export写在alias命令里边呗,用&&连接。如下

alias eclipse="export GTK_IM_MODULE=xim && export QT_IM_MODULE=xim && nohup 你的eclipse目录/eclipse > /dev/null 2>&1 && export GTK_IM_MODULE=fcitx && export QT_IM_MODULE=fcitx &"

注意把目录改了

给个解释?

问题1 写个alias

~/.bash_aliases

alias命令本意是给你一个方面的方法重命名一个命令or一个带一堆参数的命令,来简化输入。你在命令行里也能用alias命令来定义重命名一段命令,不过这样的话就是仅仅限定在这个命令行里用了。

如此以来想要一直保持这个alias就得让这段命令在命令行打开的时候执行,好在linux自身提供了一个文件会在打开终端的时候执行,这个文件是用户目录/.bachrc。

然后为了方便集中管理alias,里面又自带了一段程序,当同目录下有./bash_aliases时会一起执行。

sudo sh -c

sudo:以管理员身份执行,sh -c "":执行之后的""里的字符串

如果你想要在非管理员的身份下执行root权限的命令的话就用上边这段套上你要执行的命令,之所以这么写是因为我发现sudo nohup或者nohup sudo不行。因为用了nohup的话就要在背景去执行了,而sudo要求输入密码,所以必须先获得root权限。

当然了如果你假定在root用户下执行则可省略这段,直接执行引号里的部分。

nohup > /dev/null 2>&1 &

简单来说,`nohup`no hung up,不要关联到终端,然后把所有(`2>&1`包括正常和报错)的`> /dev/null`输出到null,`&`然后全部丢到后台去执行,把命令行还给用户。

`nohup`:不关联终端执行,并且把日志输出到文件。语法是`nohup COMMAND > FILE` 如果没有指定的话会自动在当前目录生成`nohup.out`,没权限则会生成在home。(PS:`COMMAND > FILE`这个用法是可以单独用的,表示把本来应该输出在下面的文字输出到文件。)

`/dev/null`:一个空文件,任何写到这里东西都会被直接忽略。

`2>&1`:UNIX的输入输出会分为0标准输入,1标准输出,2错误日志输出,这段话的意思就是把2标准错误输出视为1标准输出一并输出。如果你懂日语的话可以参考下面的链接。

いい加減覚えよう。 command > /dev/null 2>&1の意味

`&`:以下摘自overflow

With & the process starts in the background, so you can continue to use the shell and do not have to wait until the script is finished. If you forget it, you can stop the current running process with Ctrl-Z and continue it in the background with bg (or in the foreground with fg). For more information, see job control.

简单翻译下 >带有`&`的命令会直接在后台开始执行,所以你可以直接执行之后的命令而无需等待这一条命令执行完毕。如果你忘了敲了,可以用`Ctrl-Z`来强制当前的命令后台执行。

如果只用目录/eclipse这样的方式来执行的话,这个窗口就会被关联到打开它的终端上,一旦终端结束就会强行结束打开的程序,然后这个窗口还承担着输出各种日志的任务,虽然刷的太快根本看不清。

至于更详细的解释,因为太占篇幅了,请各自去看manual。

问题2:root下fcitx不能用

为什么不能用

这个问题找了好久,终于在fcitx官网的介绍里找到了这么一句话

以 Root 运行的程序在一般用户的 X 会话下总是有问题的(一般意义上,并不只针对 fcitx),这是因为 dbus 是一个仅限用户会话的进程。唯一在root程序中的办法使用 fcitx 的办法是通过 XIM,需要启动程序前设置 GTK_IM_MODULE=xim 和 QT_IM_MODULE=xim

不过 Arch Wiki 又说

使用 xim, 很可能会遇到一些包括不能输入, 没有光标跟随, 重启输入法时应用程序卡死在内的无法由 Fcitx 解决的问题,且官方不支持解决。

所以……

怎么解决?

很简单,执行程序之前改过去,执行完就改回来就行了。因为alias不支持接受参数,这里用bash的function来写,不过效果是一样的。

 ef(){
 export GTK_IM_MODULE=xim
 export QT_IM_MODULE=xim

 $1

 export GTK_IM_MODULE=fcitx
 export QT_IM_MODULE=fcitx
 }

export就是修改环境变量而已。$1指接受到的参数,就是要执行的命令了。执行完了之后还会把环境变量改回去。

如果有希望打开完立刻改回去的话,把$1改成 ```sh nohup $1 > /dev/null 2>&1 & ``` 原理同上

以上

评论

此博客中的热门博文

Ubuntu修改键盘映射,18.04,gnome

inux折腾笔记3:用另一把键盘做快捷键:python脚本

memo xwiki inial