Anda dapat menggunakan command
shell built-in untuk mem-bypass proses pencarian normal dan menjalankan perintah yang diberikan sebagai perintah eksternal terlepas dari segala kemungkinan lain (shell built-in, alias, dll.). Hal ini sering dilakukan dalam skrip yang harus portabel di seluruh sistem, meskipun mungkin lebih sering menggunakan singkatan \
(seperti dalam \rm
daripada command rm
atau rm
, karena terutama yang terakhir mungkin alias sesuatu yang tidak diketahui seperti rm -i
).
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Ini dapat digunakan dengan alias, seperti:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Keuntungan dari contoh alias time=/usr/bin/time
ini adalah bahwa Anda tidak menentukan path lengkap ke time
biner, tetapi sebaliknya kembali ke mekanisme pencarian path yang biasa.
The alias
perintah itu sendiri dapat masuk ke misalnya ~ / .bashrc atau /etc/bash.bashrc (yang terakhir ini global untuk semua pengguna di sistem).
Untuk kasus sebaliknya (memaksa penggunaan shell built-in jika ada alias yang ditentukan), Anda akan menggunakan sesuatu seperti builtin time
, yang lagi-lagi mengesampingkan proses pencarian yang biasa dan menjalankan shell built-in yang bernama. Halaman bash man menyebutkan bahwa ini sering digunakan untuk menyediakan cd
fungsionalitas khusus dengan fungsi bernama cd
, yang pada gilirannya menggunakan builtin cd
untuk melakukan hal yang sebenarnya.
type -a <cmd>
.command
tidak mem-bypass builtin (kecualizsh
ketika tidak meniru shell lain). Ini melewati fungsi dan itulah alasan utama keberadaannya. Peran keduanya adalah untuk menghapus spesial dalam builtin khusus . Itu mem-bypass alias dan kata kunci hanya karena itu hanya diperluas di posisi pertama (zsh
misalnya, ia tidak mem-bypass alias global). Tidak adatime
bash bawaan.time
adalah kata kunci sehingga Anda dapat melakukannya misalnyatime { foo; bar; }
.command
bekerja dalam kasus khusus ini, seperti yang dicontohkan, tetapi jelas jawaban yang benar lebih baik daripada yang setengah benar.builtin time
tidak bekerja'time' echo test
Ada pintasan di bash untuk menghindari kata kunci, tanpa harus menentukan jalur atau menggunakan bawaan lain seperti
command
: Melarikannya dengan backslash.Secara pribadi, saya menemukan ini lebih mudah dibaca dan lebih aman, karena ini mungkin:
sumber
time
akan melakukan:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Itu berlaku untuk setiap shell kata kunci.(x_x)
Solusi umum untuk built-in (misalnya tes) adalah [1] :
gunakan
env
(semua kerang)nonaktifkan builtin (hanya bash dan zsh):
gunakan sembarang slash
/
untuk memanggil perintah (semua shell):membuat alias (gagal di dalam skrip bash, kecuali jika
shopt -s expand_aliases
digunakan):Tetapi waktu bukanlah suatu bawaan.
Kata itu
time
adalah "kata yang dicadangkan", bukan perintah dan bukan built-in. Itu memungkinkan solusi ini:Kutip kata itu. Ini tidak berfungsi dengan built-in.
Banyak bentuk pekerjaan mengutip:,
\time
"time"
'time'
ti\me
ti"me"
dll.Ini berguna untuk memotong alias. Bahkan jika
test
alias,\test
akan menjalankan perintah PATHed (atau builtin jika belum dinonaktifkan).Gunakan builtin
command
(ini tidak berfungsi dengan built-in):Seperti di atas untuk built-in, menggunakan slash
/
works:Seperti di atas untuk bawaan, alias juga berfungsi di sini:
[1] Mari kita asumsikan ada executable eksternal
~/bin/test
yang mencetak "tes eksternal". Dan selanjutnya: mari kita asumsikan bahwa~/bin
ada di depan/bin
dalam PATH aktif.sumber
Masukkan ini ke
~/.bashrc
:alias time=/usr/bin/time
sumber
Anda dapat menggunakan
enable
perintah untuk menonaktifkan built-in tertentu.Namun
time
adalah kata kunci sehingga ini tidak akan berfungsi.Jadi Anda harus membuat alias untuk menimpanya:
sumber