- Date : [[2022-05-01_Sun]]
- Tags : #linux/index/01
前言
最近看到csvtk这款工具,里面提到作者的初衷:
sed/awk/cut等Shell命令主要用于通用的表格数据,不适合含有标题行的CSV格式;为了一个小操作写Python/R脚本也有点小题大作,且难以复用。
确实有的时候,我们需要结合python,R 或者一般shell 语法的特性,结合使用,甚至制作精巧的pipeline。
我们可以不可以直接在命令行中使用shell 语法呢?
就像在R 或python 中,我们可以分别使用:
system("echo 'test'")
;import os; os.system('ls -lh')
既然你有了,那我呢?(shell 举了举手)
命令行内使用python或R
python 提供了-c 选项,我们可以直接利用该选项,输入python 命令:
代码语言:javascript复制$ python3 -c 'a=3;print(a)'
3
但无奈的是,我仅仅发现,R 只提供了一个-e EXPR
选项,让你输入R 命令后,R 会进入到环境并进行相关计算就退出:
$ R -e '1 1'
R version 3.2.2 (2015-08-14) -- "Fire Safety"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> 1 1
[1] 2
这非常的不优雅。
既然Rscript,可以接受脚本进行R 命令运行,那么,我们可否在不书写R 脚本的情况下,直接把内容传递给Rscript 呢?
如果是重定向输入或者是管道符号呢?
代码语言:javascript复制$ Rscript << test
> 1 1
> test
Usage: /path/to/Rscript [--options] [-e expr [-e expr2 ...] | file] [args]
--options accepted are
--help Print usage and exit
--version Print version and exit
--verbose Print information on progress
--default-packages=list
Where 'list' is a comma-separated set
of package names, or 'NULL'
or options to R, in addition to --slave --no-restore, such as
--save Do save workspace at the end of the session
--no-environ Don't read the site and user environment files
--no-site-file Don't read the site-wide Rprofile
--no-init-file Don't read the user R profile
--restore Do restore previously saved objects at startup
--vanilla Combine --no-save, --no-restore, --no-site-file
--no-init-file and --no-environ
'file' may contain spaces but not shell metacharacters
Expressions (one or more '-e <expr>') may be used *instead* of 'file'
See also ?Rscript from within R
并不好用。似乎Rscript 并不接受来自标准输入的内容来源。
我忽然想到了shell的<()
,其可以将结果以文件的形式作为输入传递给其他命令:
$ Rscript <(echo "1 1")
[1] 2
好了,现在你知道,该如何在命令行中使用python 或R 了吗?
依然存在缺陷
比如,如果我们想要用管道符传递这样的结果,或者是,我们的shell 脚本中希望使用变量呢?似乎命令行内直接使用其他语言都不是一个明智的决定。当我们需要其他语言时,还是得依靠脚本,实现输入输出的传递。
而尴尬之处也在这里,不使用脚本的话,文件很难像shell 一样仅仅一两句命令实现输入输出。
命令行中直接运行的场景,目前我能想到的也仅仅是,你可以直接在命令行内进行数学计算了:
代码语言:javascript复制❯ 1 1
zsh: command not found: 1 1
❯ python3 -c 'print(1 2)'
3
然而,似乎直接进入ide,更加方便:
代码语言:javascript复制❯ python
Python 3.9.7 (default, Sep 16 2021, 08:50:36)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 2
3