Apakah ada cara untuk mengarahkan stdout dan stderr melalui variabel seperti menambahkan opsi perintah dalam skrip?
Misalnya saya punya skrip:
#!/bin/bash -x
TEST=">/dev/null 2>&1"
OPT='-p -v'
mkdir $OPT 123/123/123 $TEST
Saya dapat melihat bahwa OPT diganti dengan -p
tanpa masalah dan bash mengartikannya sebagai opsi. Tapi redirection diartikan sebagai nama direktori.
$ ./test.sh
+ TEST='>/dev/null 2>&1'
+ OPT='-p -v'
+ mkdir -p -v 123/123/123 '>/dev/null' '2>&1'
mkdir: created directory `123/123'
mkdir: created directory `123/123/123'
mkdir: created directory `>/dev'
mkdir: created directory `>/dev/null'
mkdir: created directory `2>&1'
Apakah ada cara untuk mengatakan bash, bahwa $ VAR adalah pengalihan, bukan nama dir.
PS. Mungkin saya salah jalan, tapi saya ingin membuat opsional verbose atau non verbose dari skrip saya. Tetapi saya memerlukan beberapa keluaran bahkan dalam mode non-verbose, oleh karena itu saya tidak bisa hanya mengarahkan seluruh stdout dan stderr, hanya dari beberapa perintah di dalam skrip saya.
sumber
"Bagaimana" telah dijelaskan dengan baik dalam jawaban lain; Saya ingin membahas "mengapa" kode OP tidak berfungsi.
Intinya adalah bahwa redirection output ditandai sebelum ekspansi variabel. Pengalihan sebenarnya dilakukan setelah ekspansi variabel (karenanya mengapa Anda dapat mengarahkan output ke nama file yang disimpan dalam variabel), tetapi shell mengidentifikasi pengalihan untuk diproses nanti sebelum variabel diperluas.
Dengan kata lain, begitu variabel diperluas, "terlambat" untuk mempertimbangkan karakter pengalihan (
<
atau>
, dll.), Karena shell telah mengidentifikasi bagian mana dari string perintah yang akan ditangani sebagai pengalihan.Untuk bacaan lebih lanjut, lihat langkah 1 dan 3 yang tercantum di bawah:
sumber
Itu tidak menafsirkannya sebagai "nama direktori",
>
sedang dikutip, jadi itu diperlakukan secara harfiah (lebih khusus, Anda mengirim string>dev/null 2>&1
. Satu-satunya cara Anda untuk mengatasinya adalah menggunakaneval
atau menelurkan shell baru.Adapun masalah "verbose" Anda disinggung dalam pertanyaan Anda, lakukan saja ini:
sumber
Anda memiliki banyak ruang dalam variabel Anda, yang tidak akan dievaluasi dengan benar. Anda ingin menggunakannya
eval
untuk mengaturnya.Ini akan memungkinkan $ OPT dipecah menjadi dua argumen (
-p
dan-v
) alih-alih satu (-p -v
) dan sama dengan $ TEST. Juga diubah untuk digunakan/dev/null
karena sangat tidak mungkin bahwa Anda akan memilikidev
direktori di direktori saat ini.sumber
Jawaban enzotib ini menggunakan beberapa file yang baik descriptor sihir, tetapi solusi sederhana akan hanya menggunakan
eval
garis (yang tidak proses add di atas kepala, namun):sumber