목차
머리말
node执行bash脚本: 勉强解决方案:child_process API
그리고 참고: error 개체는 stderr와 다릅니다. child_process 모듈이 명령을 실행할 수 없는 경우 , 이 개체는 비어 있지 않습니다. 예를 들어, 파일을 검색하여 파일을 찾을 수 없는 경우 오류 개체는 비어 있지 않습니다. 그러나 명령이 성공적으로 실행되고 표준 오류 스트림에 메시지를 쓰는 경우 stderr 개체는 비어 있지 않습니다. 물론 동기 exec 명령인 execSync
exec: 명령을 실행하기 위해 하위 프로세스를 시작합니다.spawn과 달리 하위 프로세스의 상황을 알 수 있는 콜백 함수가 있습니다.
그럼 오늘의 주인공 zx를 살펴볼까요? 벌써 시작이 17.4k 입니다.
$`command`
cd()
fetch()
question()
sleep()
nothrow()
chalk
fs
os
$.shell
$.quote
传递环境变量
传递数组
웹 프론트엔드 JS 튜토리얼 nodejs가 bash 스크립트를 실행하는 몇 가지 옵션에 대한 간략한 설명

nodejs가 bash 스크립트를 실행하는 몇 가지 옵션에 대한 간략한 설명

Jul 08, 2021 am 11:12 AM
배시 스크립트 nodejs

nodejsbash 스크립트를 실행하는 방법은 무엇입니까? 이 기사에서는 노드가 bash 스크립트를 실행하는 몇 가지 옵션을 소개합니다.

nodejs가 bash 스크립트를 실행하는 몇 가지 옵션에 대한 간략한 설명

머리말

최근에 bash 스크립트 구문을 배우고 있는데, bash 구문에 익숙하지 않으면 실수하기가 매우 쉽습니다. 예를 들어 정의되지 않은 변수 표시 shell 의 변수는 정의되지 않았으며 계속 사용할 수 있지만 결과는 예상과 다를 수 있습니다. 예: bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:

#!/bin/bash

# 这里是判断变量var是否等于字符串abc,但是var这个变量并没有声明
if [ "$var" = "abc" ] 
then
   # 如果if判断里是true就在控制台打印 “ not abc”
   echo  " not abc" 
else
   # 如果if判断里是false就在控制台打印 “ abc”
   echo " abc "
fi
로그인 후 복사

结果是打印了abc,但问题是,这个脚本应该报错啊,变量并没有赋值算是错误吧。

为了弥补这些错误,我们学会在脚本开头加入:set -u这句命令的意思是脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。

再次运行就会提示:test.sh: 3: test.sh: num: parameter not set

再想象一下,你本来想删除:rm -rf $dir/*然后dir是空的时候,变成了什么?rm -rf是删除命令,$dir是空的话,相当于执行 rm -rf /*,这是删除所有文件和文件夹。。。然后,你的系统就没了,这就是传说中的删库跑路吗~~~~

如果是node或者浏览器环境,我们直接var === 'abc' 肯定是会报错的,也就是说很多javascript编程经验无法复用到bash来,如果能复用的话,该多好啊。

后来就开始探索,如果用node脚本代替bash该多好啊,经过一天折腾逐渐发现一个神器,Google旗下的zx库,先别着急,我先不介绍这个库,我们先看看目前主流用node如何编写bash脚本,就知道为啥它是神器了。

node执行bash脚本: 勉强解决方案:child_process API

例如 child_process的API里面exec命令

const { exec } = require("child_process");

exec("ls -la", (error, stdout, stderr) => {
    if (error) {
        console.log(`error: ${error.message}`);
        return;
    }
    if (stderr) {
        console.log(`stderr: ${stderr}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
});
로그인 후 복사

这里需要注意的是,首先exec是异步的,但是我们bash脚本命令很多都是同步的。

而且注意:error对象不同于stderr. errorchild_process模块无法执行命令时,该对象不为空。例如,查找一个文件找不到该文件,则error对象不为空。但是,如果命令成功运行并将消息写入标准错误流,则该stderr对象不会为空。

当然我们可以使用同步的exec命令,execSync

// 引入 exec 命令 from child_process 模块
const { execSync } = require("child_process");

// 同步创建了一个hello的文件夹
execSync("mkdir hello");
로그인 후 복사

결과는 abc가 인쇄되지만 문제는 이 스크립트가 변수에 값이 할당되지 않았는데, 이는 오류입니다.

이러한 오류를 보완하기 위해 스크립트 시작 부분에 set -u를 추가하는 방법을 배웠습니다. 이 명령은 스크립트가 이를 헤드에 추가하고 다음과 같은 경우 오류를 보고한다는 의미입니다. 존재하지 않는 변수를 발견하고 구현을 중지합니다.
  • 다시 실행하면 다음 메시지가 표시됩니다: test.sh: 3: test.sh: num: 매개변수가 설정되지 않았습니다
  • 원래 삭제하려고 했던 것을 다시 상상해 보십시오: rm -rf $dir/* 그리고 dir 비어 있으면 어떻게 되나요? rm -rf는 삭제 명령입니다. $dir이 비어 있으면 모든 파일을 삭제하는 rm -rf /*를 실행하는 것과 같습니다. 그리고 파일. . . 그러면 여러분의 시스템은 사라지게 됩니다. 이게 전설적인 라이브러리 삭제와 도망치는 건가요~~~~
  • 노드나 브라우저 환경이라면 우리가 직접 var === ' abc'는 분명히 오류를 보고할 것입니다. 이는 많은 JavaScript 프로그래밍 경험이 bash에서 재사용될 수 없다는 것을 의미합니다.
  • 나중에 bash 대신 node 스크립트를 사용하면 얼마나 좋을까 알아보기 시작했는데, 하루 종일 열심히 작업한 끝에 점차 유물을 발견했습니다. Google.zx 라이브러리에 속해 있으므로 먼저 이 라이브러리를 소개하지 않겠습니다. 현재 주류인 node를 사용하는 code> 스크립트를 보면 왜 아티팩트인지 알 수 있습니다.
node는 bash 스크립트를 실행합니다: reluctant Solution: child_process API

예를 들어, child_process</의 API에 있는 <code>exec 명령 code>

여기서 주목해야 할 점은 우선 exec는 비동기식이지만 많은 bash 스크립트 명령은 동기식이라는 것입니다.

그리고 참고: error 개체는 stderr와 다릅니다. child_process 모듈이 명령을 실행할 수 없는 경우 , 이 개체는 비어 있지 않습니다. 예를 들어, 파일을 검색하여 파일을 찾을 수 없는 경우 오류 개체는 비어 있지 않습니다. 그러나 명령이 성공적으로 실행되고 표준 오류 스트림에 메시지를 쓰는 경우 stderr 개체는 비어 있지 않습니다. 물론 동기 exec 명령인 execSync

#!/usr/bin/env zx

await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])

let name = &#39;foo bar&#39;
await $`mkdir /tmp/${name}
로그인 후 복사
로그인 후 복사

를 사용할 수 있습니다. bash 명령을 실행할 수 있는 child_process의 다른 API를 간략하게 소개하겠습니다

spawn: 자식 시작 명령을 실행하는 프로세스

exec: 명령을 실행하기 위해 하위 프로세스를 시작합니다.spawn과 달리 하위 프로세스의 상황을 알 수 있는 콜백 함수가 있습니다.

execFile: 실행 파일을 실행하기 위해 하위 프로세스를 시작합니다

fork: generate와 마찬가지로 하위 프로세스가 실행해야 하는 자바스크립트 파일을 지정해야 한다는 차이점이 있습니다. exec와 ececFile의 차이점은 exec는 명령 실행에 적합하고 eexecFile은 파일 실행에 적합하다는 것입니다.

【추천 학습: "

nodejs tutorial

"】

노드 실행 bash 스크립트: 고급 솔루션 shelljs

#!/usr/bin/env zx

await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])

let name = &#39;foo bar&#39;
await $`mkdir /tmp/${name}
로그인 후 복사
로그인 후 복사

위 코드에서 shelljs는 실제로 nodejs에서 bash 스크립트를 작성하는 데 아주 좋은 솔루션입니다. 노드 환경은 마음대로 업그레이드할 수 없으니 shelljs만으로도 충분하다고 생각합니다.

그럼 오늘의 주인공 zx를 살펴볼까요? 벌써 시작이 17.4k 입니다.

zx 라이브러리

공식 홈페이지: https://www.npmjs.com/package/zx

먼저 사용법을 살펴보겠습니다🎜
npm i -g zx
로그인 후 복사
🎜리눅스 명령만 작성하고 계시나요? 많은 bash 구문을 무시하고 js를 직접 사용할 수 있으며 장점은 여기에 국한되지 않습니다. 🎜🎜1 ts를 지원하고 .ts를 .mjs 파일로 자동 컴파일하며 .mjs 파일은 다음과 같습니다. 상위 버전의 노드 es6 모듈의 파일 끝 부분을 지원합니다. 즉, 이 파일을 다른 도구로 이스케이프하지 않고 직접 가져올 수 있습니다🎜🎜2 파이프라인 작업 파이프 방식을 지원합니다🎜🎜3. . 네트워크 요청을 할 수 있는 fetch 라이브러리가 함께 제공되며, chalk 라이브러리를 사용하면 컬러 글꼴을 인쇄할 수 있으며, bash 명령에서 오류가 발생하면 이 메서드로 래핑할 수 있습니다. 그리고 오류는 무시하세요🎜🎜🎜전체 중국어 문서(아래 번역은 평균이므로 양해 바랍니다.)🎜🎜
Node.js >= 14.8.0
로그인 후 복사
로그인 후 복사
🎜 Bash는 훌륭하지만 스크립팅에 관해서는 사람들이 더 편리한 프로그래밍 언어를 선택하는 경우가 많습니다. JavaScript는 완벽한 선택이지만 표준 Node.js 라이브러리를 사용하려면 몇 가지 추가 작업이 필요합니다. zx는 child_process를 기반으로 하며 인수를 이스케이프하고 합리적인 기본값을 제공합니다. 🎜🎜설치🎜
#!/usr/bin/env zx
现在您将能够像这样运行您的脚本:

chmod +x ./script.mjs
./script.mjs
로그인 후 복사
로그인 후 복사
🎜필요 환경🎜
Node.js >= 14.8.0
로그인 후 복사
로그인 후 복사

将脚本写入扩展名为 .mjs 的文件中,以便能够在顶层使用await

将以下 shebang添加到 zx 脚本的开头:

#!/usr/bin/env zx
现在您将能够像这样运行您的脚本:

chmod +x ./script.mjs
./script.mjs
로그인 후 복사
로그인 후 복사

或者通过 zx可执行文件:

zx ./script.mjs
로그인 후 복사

所有函数($、cd、fetch 等)都可以直接使用,无需任何导入。

$`command`

使用 child_process 包中的 spawn 函数执行给定的字符串, 并返回 ProcessPromise.

let count = parseInt(await $`ls -1 | wc -l`)
console.log(`Files count: ${count}`)
로그인 후 복사

例如,要并行上传文件:

如果执行的程序返回非零退出代码,ProcessOutput 将被抛出

try {
  await $`exit 1`
} catch (p) {
  console.log(`Exit code: ${p.exitCode}`)
  console.log(`Error: ${p.stderr}`)
}
로그인 후 복사

ProcessPromise,以下是promise typescript的接口定义

class ProcessPromise<T> extends Promise<T> {
  readonly stdin: Writable
  readonly stdout: Readable
  readonly stderr: Readable
  readonly exitCode: Promise<number>
  pipe(dest): ProcessPromise<T>
}
로그인 후 복사

pipe() 方法可用于重定向标准输出:

await $`cat file.txt`.pipe(process.stdout)
로그인 후 복사

阅读更多的关于管道的信息:https://github.com/google/zx/blob/HEAD/examples/pipelines.md

ProcessOutputtypescript接口定义

class ProcessOutput {
  readonly stdout: string
  readonly stderr: string
  readonly exitCode: number
  toString(): string
}
로그인 후 복사

函数:

cd()

更改当前工作目录

cd(&#39;/tmp&#39;)
await $`pwd` // outputs /tmp
로그인 후 복사

fetch()

node-fetch 包。

let resp = await fetch(&#39;http://wttr.in&#39;)
if (resp.ok) {
  console.log(await resp.text())
}
로그인 후 복사

question()

readline包

let bear = await question(&#39;What kind of bear is best? &#39;)
let token = await question(&#39;Choose env variable: &#39;, {
  choices: Object.keys(process.env)
})
로그인 후 복사

在第二个参数中,可以指定选项卡自动完成的选项数组

以下是接口定义

function question(query?: string, options?: QuestionOptions): Promise<string>
type QuestionOptions = { choices: string[] }
로그인 후 복사

sleep()

基于setTimeout 函数

await sleep(1000)
로그인 후 복사

nothrow()

将 $ 的行为更改, 如果退出码不是0,不跑出异常.

ts接口定义

function nothrow<P>(p: P): P
로그인 후 복사
await nothrow($`grep something from-file`)
// 在管道内:

await $`find ./examples -type f -print0`
  .pipe(nothrow($`xargs -0 grep something`))
  .pipe($`wc -l`)
로그인 후 복사

以下的包,无需导入,直接使用

chalk

console.log(chalk.blue(&#39;Hello world!&#39;))
로그인 후 복사

fs

类似于如下的使用方式

import {promises as fs} from &#39;fs&#39;
let content = await fs.readFile(&#39;./package.json&#39;)
로그인 후 복사

os

await $`cd ${os.homedir()} && mkdir example`
로그인 후 복사

配置:

$.shell

指定要用的bash.

$.shell = &#39;/usr/bin/bash&#39;
로그인 후 복사

$.quote

指定用于在命令替换期间转义特殊字符的函数

默认用的是 shq 包.

注意:

__filename & __dirname这两个变量是在commonjs中的。我们用的是.mjs结尾的es6 模块。

ESM模块中,Node.js 不提供__filename __dirname 全局变量。 由于此类全局变量在脚本中非常方便,因此 zx 提供了这些以在 .mjs 文件中使用(当使用 zx 可执行文件时)

require也是commonjs中的导入模块方法, 在 ESM 模块中,没有定义 require() 函数。zx提供了 require() 函数,因此它可以与 .mjs 文件中的导入一起使用(当使用 zx 可执行文件时)

传递环境变量

process.env.FOO = &#39;bar&#39;await $`echo $FOO`
로그인 후 복사

传递数组

如果值数组作为参数传递给 $,数组的项目将被单独转义并通过空格连接 Example:

let files = [1,2,3]await $`tar cz ${files}`
로그인 후 복사

可以通过显式导入来使用 $ 和其他函数

#!/usr/bin/env nodeimport {$} from &#39;zx&#39;await $`date`复制代码
로그인 후 복사

zx 可以将 .ts 脚本编译为 .mjs 并执行它们

zx examples/typescript.ts
로그인 후 복사

更多编程相关知识,请访问:编程视频!!

위 내용은 nodejs가 bash 스크립트를 실행하는 몇 가지 옵션에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nodejs와 tomcat의 차이점 nodejs와 tomcat의 차이점 Apr 21, 2024 am 04:16 AM

Node.js와 Tomcat의 주요 차이점은 다음과 같습니다. 런타임: Node.js는 JavaScript 런타임을 기반으로 하는 반면 Tomcat은 Java Servlet 컨테이너입니다. I/O 모델: Node.js는 비동기식 비차단 모델을 사용하는 반면 Tomcat은 동기식 차단 모델을 사용합니다. 동시성 처리: Node.js는 이벤트 루프를 통해 동시성을 처리하는 반면 Tomcat은 스레드 풀을 사용합니다. 애플리케이션 시나리오: Node.js는 실시간, 데이터 집약적, 동시성 애플리케이션에 적합하고 Tomcat은 기존 Java 웹 애플리케이션에 적합합니다.

nodejs와 vuejs의 차이점 nodejs와 vuejs의 차이점 Apr 21, 2024 am 04:17 AM

Node.js는 서버측 JavaScript 런타임인 반면, Vue.js는 대화형 사용자 인터페이스를 생성하기 위한 클라이언트측 JavaScript 프레임워크입니다. Node.js는 백엔드 서비스 API 개발, 데이터 처리 등 서버 측 개발에 사용되고, Vue.js는 단일 페이지 애플리케이션, 반응형 사용자 인터페이스 등 클라이언트 측 개발에 사용됩니다.

nodejs는 백엔드 프레임워크인가요? nodejs는 백엔드 프레임워크인가요? Apr 21, 2024 am 05:09 AM

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

nodejs를 mysql 데이터베이스에 연결하는 방법 nodejs를 mysql 데이터베이스에 연결하는 방법 Apr 21, 2024 am 06:13 AM

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

nodejs의 전역 변수는 무엇입니까 nodejs의 전역 변수는 무엇입니까 Apr 21, 2024 am 04:54 AM

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

nodejs와 java 사이에 큰 차이가 있나요? nodejs와 java 사이에 큰 차이가 있나요? Apr 21, 2024 am 06:12 AM

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? Apr 21, 2024 am 05:18 AM

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

nodejs는 백엔드 개발 언어인가요? nodejs는 백엔드 개발 언어인가요? Apr 21, 2024 am 05:09 AM

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

See all articles