Jun 29, 2015 - Shell相关概念

Linux下经常听说shell,terminal等之类的概念,最近终于大概明白是什么意思。

shell命令,shell以及终端terminal的关系大致如下:

graph LR; A[Command Line</br>命令&脚本]-->B[Terminal</br>编辑器]; B-->C[Shell</br>解释器]; C-->D[System</br>系统];

由浅入深,在显示器里可以看到的是Terminal终端以及在终端中输入的命令。通过不可见的Shell的解释,在系统中运行,最后将结果返回终端界面。

Commands

Command Line如常用的lscd等命令,也包括比较复杂的管道和重定向等。

Terminal

终端相当于一个编辑器外壳,如Ubuntu里经典的Gnome-terminal。这个网址列出了一些常用的终端,有些支持字体的大小和颜色配置,有些支持分屏,有些支持标签等。终端只是一个外壳,不影响命令的解释和运行。

贴一个我在用的Deepin Terminal,透明背景和分屏功能蛮赞:

<img src=http://yalei.name/images/deepTerminal.png class=”img-responsive”/>

Shell

Shell是任务是对命令进行解释,进而执行。不同的解释器对语法的支持也是不同的,cat /etc/shells查看系统可用的解释器。一般有以下几个:

关于这几个解释器的起源,可以看看介绍。 sh是最早的解释器,现在Linux系统一般都默认使用bash。注意在写Shell脚本时,一般也是调用bash,在首行写#!/bin/bash

最后推荐下Zsh,主要在路径补全代码提示高亮等方面有很大提升,可以看看这个介绍Why Zsh is Cooler than Your Shell

另外,Zsh具有很强的可配置性,常用一个配置是oh-my-zsh

System

最后是系统,一般Mac和类Unix系统都默认搭载有terminal和bash,而Windows用户需要安装Cygwin之类的软件才能模拟运行shell命令。

Jun 24, 2015 - Linux权限解读

查看权限

ls -l file来查看某个文件的权限,结果的前10个字符代表权限信息。这十位字符,可分为四组,第一个字符一组,剩余九个每三个一组。

第一个字符可是是d或者-:

  • d: 文件夹
  • -: 文件

比如drwxrwxr-x 6 yalei yalei 4096 Jun 18 08:50 ××××××,表示这是一个文件夹,剩下三组的意思是:

  • rwx: 当前用户的权限:读,写,执行。r,w和x分别对应read,write和execute

  • rwx: 当前用户所属的用户组权限:读,写,执行

  • r-x: 其他用户的权限:读,执行

类似的,下边的文件,当前用户有读写权限;而该用户所属的用户组有读的权限,不能写入;其他用户组的用户没有任何权限。

-rw-r-----  1 yalei yalei 3052535 Jun 23 15:54 ××××××

更改权限

chmod xxx file_name命令修改权限。其中参数xxx主要是u o g+-r w x的不同组合。u,g,o分别代表user,group和others;即当前用户,用户组和其他用户。+ -表示赋予和撤消,r w x即读,写,执行。合在一起就是给用户赋予或撤消某种权限。

chmod u+x file # 只给当前用户加上可执行权限
chmod u+rwx,o+rw,g-rwx file # 当前用户加读写和执行权限,用户组加读写权限,其他用户撤消所有权限

更改权限的另一种方式是把参数xxx写成三位数的形式,比如chmod 777 file就是给所有用户赋予所有权限。解读方式是:

  • 4 读
  • 2 写
  • 1 执行

所以7=4+2+1,表示读写和执行权限,6表示读写,5表示可读和可执行,3表示可写和可执行(这个比较奇葩,能写但不能读),0表示没有任何权限。777分别对应的是user,group和others的权限。那么chmod 600 file就是只给当前用户读写权限。

如果更改整个文件夹的所有文件,加上chmod -R ...的参数就好。

更改拥有者

通常有权限问题都是因为该文件(夹)不属于自己。比如下边的文件夹,文件夹属于root这个用户和wheel这个用户组。可以看到用户组也是没有写入权限的,只有root用户有权限。

$ ll /etc
lrwxr-xr-x@ 1 root  wheel    11B Aug  5  2015 /etc -> private/etc

这时需要写入操作的话,有好几种方案:

(1) 可以在命令前加上sudo关键字,表示以超级管理员的身份运行,需要输入密码。适用于不常用的特殊写入访问,比如修改host文件。最后,如果你的用户不是超级管理员,那就放弃吧。

(2) 添加用户组的写入权限并把自己的用户加到该用户组。适用于公共目录下常用的写入操作,此处公共目录就是除自身主目录的其他所有目录。

sudo chmod -R 775 /etc      # 添加用户组的写入权限
sudo usermod -a -G wheel YOUR_USER_NAME  # 给自己的用户添加用户组

(3) 更改文件夹的拥有者(owner)。适用于一些私密文件夹里常用的写入操作,比如一些文件夹不想让其他用户访问。 比如经常需要装Python的包,但又不想让其他用户乱装。跟第二个方案差不多。

/etc文件夹改成某个用户和某个用户组下的命令:

sudo chown -R /etc YOUR_USER_NAME:USER_GROUP

Apr 28, 2015 - Rmd到PDF的转换

对于用惯了Word的来说,Latex大概是一个噩梦,好在能用惯Word的人并不多。各位观众应该都或多或少的见过各种Word排版技巧充斥在朋友圈,人人网,QQ空间等。跟Latex的命令一样,让人看了就头疼。

如果你会用Knitr,那就一定也会用Markdown(二者都不会的看官请移步这里)。Markdown是HTML的简化,语法简洁,十分钟就能学完。只是Knitr初出之时,Markdown也就只能转成HTML而已。如今Knitr已3岁有余,从Markdown到PDF的转化也很成熟了。话不多说,让我们直奔主题。

预先安装

  • 最新版本的Rstudio(已经内置的Pandoc工具,没听说过这个工具也没关系,装上最新版的Rstudio就是了)。
  • R包:knitrrmarkdown,均可从CRAN上直接下载。
  • Tex环境。Windows用户安装CTEX,Linux用户安装Texlive,Mac用户安装MacTex。似乎各种版本都有精简版和完整版,建议安装完整版。

英文环境

新建一个Rmd文档,其头文件应该是以下这种格式:

---
title: "XXX"
author: "xxx"
date: "xxx"
output: html_document
---

如果你的Rmd文档是全英的,只需要把html_document改成pdf_document。Ctrl+S保存后,编译按钮会自动从Knit HTML变成Knit PDF,轻点鼠标即大功告成。

这里简单说下转换的流程是:

  1. knitr运行Rmd中的代码,生成md文件
  2. 神器Pandoc把md文件转化为tex文件
  3. Latex环境编译tex文件生产PDF

中文环境

如果Rmd文档中有中文字符,那你就呵呵了。因为在第二步md到tex的转化中,是按照预先设置的模板来的,而默认的模板中并没有设置中文字体。

如果你是Latex和Padoc的高手,折腾一下模板就能搞定了。初学者也不用紧张,已经有高手把模板封装打包了,只需安装rticles这个包即可:

devtools::install_github("rstudio/rticles")

安装完成后,新建一个Rmd文件,从模板中选择CTex Documents

可以看到,rticles还提供了其他的模板如ACMACSJournal of Statistical Software等。没错,以后要投稿这些期刊的话,你可以直接用Markdown的语法来写了!回到CTex Documents模板中来,作者已经里边阐述了各系统下Rmd到PDF的转化问题。如果你是Windows用户,轻点鼠标即可生产精致的PDF文件。如果你是Linux或者Mac用户,只能无奈的再次呵呵了。不过别急着丧气,读读模板中的内容,其中已有妙计相赠。

其他

(1)对于其他的Rmd文档,想转成PDF的话,只需要把CTex Documents模板中的头信息粘贴过去,修改其中的title和author信息即可。

---
title: "在R Markdown文档中使用中文"
author:
  - 谢益辉
  - 邱怡轩
  - 于淼
documentclass: ctexart
output:
  pdf_document:
    fig_caption: yes
    latex_engine: xelatex
    number_sections: yes
    template: !expr rticles::ctex_template()
    toc: yes
classoption: "hyperref`r if (.Platform$OS.type != 'windows') ',nofonts'`"
---

(2)按钮Knitr PDF背后所做的事是由rmarkdown包的render函数支持的,相应的代码是:

rmarkdown::render('toremove.Rmd', pdf_document())

如果有多个文档,写个脚本就能把整个流程完全自动化了。

(3)如果Markdown中包含HTML标签,输出HTML是毫无影响的。比如<img src=picture.png/>![pic](picture.png)是等价的,前者是HTML标签,后者是md语法。但是Pandoc并不能识别前者的HTML标签并转化成相应的Tex代码。所以从md到PDF的转化,不能夹杂HTML标签。