(%%)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 文件中的 sudo bash 和 sudo 命令有啥区别? [复制]
Windows 10 上的 Bash 和 Ubuntu 终端有啥区别