(%%)bash 和 bang(!) 有啥区别

Posted

技术标签:

【中文标题】(%%)bash 和 bang(!) 有啥区别【英文标题】:what's the difference between (%%)bash and bang(!)(%%)bash 和 bang(!) 有什么区别 【发布时间】:2020-01-18 22:36:04 【问题描述】:

在 jupyter notebook 中,以下 gcloud 命令适用于 bang(!) 但不适用于 %%bash

import os

PROJECT = 'mle-1234' 
REGION = 'us-central1' 
BUCKET = 'mle-1234'
# for bash
os.environ['PROJECT'] = PROJECT
os.environ['BUCKET'] = BUCKET
os.environ['REGION'] = REGION
os.environ['TFVERSION'] = '1.14.0'  # Tensorflow version

# Set GCP Project and Region
%%bash
gcloud config set project $PROJECT
gcloud config set compute/region $REGION

gcloud config list

当我使用 %%bash 执行上面的最后一个 sn-p 时收到此错误消息

  File "<ipython-input-16-f93912dbcc34>", line 3
    gcloud config set project $[PROJECT]
                ^
SyntaxError: invalid syntax

但是,项目和区域值是使用相同的代码行设置的,但通过删除 %%bash 并为所有 gcloud 命令添加前缀 (!)。

# Set GCP Project and Region
!gcloud config set project $PROJECT
!gcloud config set compute/region $REGION

!gcloud config list

使用 (!) 的结果

Updated property [core/project].
Updated property [compute/region].

[compute]
region = us-central1
zone = us-central1-a
[core]
account = my-service-account@mle-1234.iam.gserviceaccount.com
disable_usage_reporting = False
project = mle-1234

What could be the reason for this behavior?

【问题讨论】:

随机猜测:%%bash 需要放置在 first 行的一个神奇位置,类似于 shebang (#!) 必须位于第一行一个脚本。如果删除上面的注释并将%%bash 放在第一行会发生什么?有什么变化吗? 【参考方案1】:

%%bash

%%bash 被视为 Built-in magic commands 的一部分。在子进程中使用 bash 运行单元。这是%%script bash 的快捷方式。您可以将来自多个内核的代码组合到一个笔记本中。例如:

%%html
%%python2
%%python3
%%ruby
%%perl

实现:

%%bash

factorial()

    if [ "$1" -gt "1" ]
    then
        i=`expr $1 - 1`
        j=`factorial $i`
        k=`expr $1 \* $j`
        echo $k
    else
        echo 1
    fi


input=5
val=$(factorial $input)
echo "Factorial of $input is : "$val

!命令

以 bang 字符开始一个代码单元,例如!,指示 jupyter 将该行上的代码视为 OS shell command

!cat /etc/os-release | grep VERSION

输出:

VERSION="16.04 LTS (Xenial Xerus)"
VERSION_ID="16.04" 

答案:因为您使用的是gcloud 命令,Jupyter 会将这些解释为 OS shell 命令;因此,使用!glcoud 将起作用。

【讨论】:

这实际上似乎根本没有回答这个问题。使用 %%bash 应该 (?) 导致后续行被传递给 bash 进行解释,如果发生这种情况,它应该可以工作......但显然它们没有被传递给 bash,因为 SyntaxError: invalid syntax 不是 bash错误。

以上是关于(%%)bash 和 bang(!) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Bash 中的 [ 和 [[ 有啥区别? [复制]

bash 文件中的 sudo bash 和 sudo 命令有啥区别? [复制]

git,git bash和git shell有啥区别

Windows 10 上的 Bash 和 Ubuntu 终端有啥区别

处理命名管道时,fish shell 和 bash 有啥区别?

Heroku:“heroku ps:exec”和“heroku run bash”有啥区别?