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.

Epeius
sumber
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; ...;)

Steven Parkes
sumber
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.

Dennis Williamson
sumber
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
tomoe
sumber
6

Ini seharusnya bekerja:

set -o verbose #echo on
...
set +o verbose #echo off
percikan
sumber
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

pihentagy
sumber
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.

pengguna6784
sumber
1

berjalan seperti

language -x script

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

semoga membantu.

debuggerpk
sumber
3
-xtidak ada hubungannya dengan menggema di Python
Eugene Pankov
0

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

Rory
sumber