Bagaimana cara membuat skrip bash mencetak setiap perintah sebelum dijalankan?


88

Misalnya, saya punya file bash sederhana

#!/bin/bash
cd ~/hello
ls

Bagaimana saya bisa membuatnya menampilkan setiap perintah sebelum menjalankannya? Efek sebaliknya dari "@echo off" di skrip batch windows.


1
Bagi mereka yang mencari setopsi apa, Anda dapat menemukannya di halaman manual ini .
mkobit

Anda cukup memperluas shebang seperti ini#!/bin/bash -x
sobi3ch

Jawaban:


110
bash -x script

atau

set -x

dalam naskah.

Anda dapat membatalkan opsi dengan set +x. Jika Anda hanya ingin melakukannya untuk beberapa perintah, Anda dapat menggunakan subshell: `(set -x; command1; command; ...;)


Saya selalu menggunakan ini untuk efek yang besar. Outputnya terlihat sedikit lebih kotor dari yang Anda perkirakan.
Scott Pack

2
Dengan mengatur PS4Anda dapat mengubah prompt -x. Misalnya: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( dateakan memperlambatnya)
Walter Tross

23

Ini juga berfungsi:

set -v

atau

#!/bin/bash -v

Tapi -v tidak mencetak string PS4 sebelum setiap baris skrip dan itu tidak melacak langkah-langkah pernyataan "untuk" (misalnya) secara individual. Itu gema komentar sementara -x tidak.

Berikut ini contoh output menggunakan -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Inilah hasil dari skrip yang sama dengan -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Perhatikan bahwa saya memasukkan "echo -n" untuk menambahkan penekanan pada perbedaan antara -v dan -x. Juga, -v sama dengan "-o verbose", tetapi yang terakhir tampaknya tidak berfungsi sebagai bagian dari shebang.


Penjelasan hebat! tanpa melakukan riset, bagiku sepertinya Verbose dan eXplicit adalah apa yang diperjuangkan kedua huruf itu.
Kera-inago

Saya pikir -x lebih dekat ke eXecute.
Steven Parkes

10

Ini juga harus bekerja:

#!/bin/bash -x
cd ~/hello
ls

6

Ini seharusnya bekerja:

set -o verbose #echo on
...
set +o verbose #echo off

4

set -o xtracedan set +o xtraceteman-teman Anda (itu lebih bertele-tele, daripada -o verbose, dan hasilnya pergi ke STDERR, sebagai lawan dari verbose, yang tampaknya masuk ke STDOUT).

Lihat lebih banyak tips di sini


3

Ada beberapa cara.

#!/usr/bin/env bash -x

sebagai garis shebang.

Termasuk set -xdalam skrip itu sendiri akan mengaktifkan fungsionalitas sementara set +xakan menonaktifkannya. Kedua metode ini juga akan bekerja dengan shell sh yang lebih portabel.

Jika saya ingat dengan benar perl juga memiliki opsi -x.


1

berjalan seperti

language -x script

bahasa = python, perl, bash -x = skrip operator = nama file

semoga membantu.


3
-xtidak ada hubungannya dengan menggema di Python
Eugene Pankov

0

#! /bin/bash -x lakukan apa yang kamu inginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.