Bir programın var olduğunu, bir hata döndürüp çıkacak veya komut dosyasıyla devam edecek şekilde nasıl doğrularım?
Kolay olmalı gibi görünüyor, ama beni çok yoruyor.
Bir programın var olduğunu, bir hata döndürüp çıkacak veya komut dosyasıyla devam edecek şekilde nasıl doğrularım?
Kolay olmalı gibi görünüyor, ama beni çok yoruyor.
Yanıtlar:
POSIX uyumlu:
command -v <the_command>
Bash'a özgü ortamlar için:
hash <the_command> # For regular commands. Or...
type <the_command> # To check built-ins and keywords
Kaçının which
. Bu sadece (anlam builtins gibi çok az yapıyor kaldın fırlatma harici süreç sensin hash
, type
ya command
bir yol ucuzdur) dış komutları etkileri kolayca değişebilir ederken, aynı zamanda, aslında ne istediğinizi yapmak yerleşikleri güvenebilirsiniz sistemden sisteme.
Neden önemsiyorsun?
which
olduğunu bile bir çıkış durumunu ayarlamak gelmez , yani if which foo
orada bile çalışmaz ve olacak her zaman rapor foo
o (bazı POSIX kabukları için yapmasını görünen notu olmasa bile, var olan hash
çok).which
, çıktıyı değiştirmek veya hatta paket yöneticisine bağlanmak gibi özel ve kötü şeyler yapar.Yani, kullanma which
. Bunun yerine aşağıdakilerden birini kullanın:
$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ type foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
$ hash foo 2>/dev/null || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
(Küçük yan not: bazıları 2>&-
aynı 2>/dev/null
ama daha kısa önerecektir - bu yanlıştır . Stderr'e yazmaya çalıştığında programda 2>&-
bir hataya neden olan FD 2'yi kapatır , bu da başarılı bir şekilde yazmaktan ve çıktıyı atmaktan çok farklıdır. (ve tehlikeli!))
Eğer karma patlamanız ise /bin/sh
POSIX'in söylediklerine dikkat etmelisiniz. type
ve hash
'nin çıkış kodları POSIX tarafından çok iyi tanımlanmamıştır hash
ve komut mevcut olmadığında başarılı bir şekilde çıktığı görülür (bunu henüz görmedim type
). command
'nin çıkış durumu POSIX tarafından iyi tanımlanmıştır, böylece muhtemelen en güvenli olanıdır.
Senaryonuz kullandığı takdirde bash
de, POSIX kuralları meselesi artık gerçekten yok ve her iki type
ve hash
kullanımına tamamen güvenli hale gelir. type
şimdi var -P
sadece arama yapmak PATH
ve hash
komutun konumu muhtemelen aslında amacıyla varlığını kontrol kullandığımızdan genellikle iyi bir şey olduğu, (daha hızlı arama dahaki sefere bunu kullanmak için) karma olacağını yan etkisi yoktur .
Basit bir örnek olarak, gdate
varsa, çalışan bir işlev , aksi takdirde date
:
gnudate() {
if hash gdate 2>/dev/null; then
gdate "$@"
else
date "$@"
fi
}
2>&-
( "yakın çıkış dosya tanıtıcısı 2") Stderr olup, aynı sonucu olarak var 2> /dev/null
; 2) "stdout'u stderr'a yönlendir" olarak tanıyabileceğiniz >&2
bir kısayoldur 1>&2
. Daha fazla bilgi için Gelişmiş Bash Komut Dosyası Kılavuzu i / o yeniden yönlendirme sayfasına bakın.
while read element ; do .. done <<< $(echo ${ArrayVar[*]})
, for word in $(fgrep -l $ORIGINAL *.txt)
, ls -l "$directory" | sed 1d
, {{için de seq $BEGIN $END
}} ... Birçok yazarlarla iletişim ve iyileştirmeler önermek için çalıştık ama hiçbir wiki olduğunu ve istekleri sağır kulaklara inmiş.
2>&-
ile aynı değildir2>/dev/null
. Birincisi dosya tanımlayıcısını kapatırken ikincisi dosyaya yönlendirir /dev/null
. Program size stderr hakkında stderr'ın kapalı olduğunu bildirmeye çalıştığından bir hata göremeyebilirsiniz.
Aşağıdakiler, bir komutun var olup olmadığını $PATH
ve yürütülebilir olup olmadığını kontrol etmenin taşınabilir bir yoludur :
[ -x "$(command -v foo)" ]
Misal:
if ! [ -x "$(command -v git)" ]; then
echo 'Error: git is not installed.' >&2
exit 1
fi
Yürütülebilir denetim gereklidir; çünkü bu adda yürütülebilir bir dosya bulunmazsa bash yürütülebilir olmayan bir dosya döndürür $PATH
.
Ayrıca, yürütülebilir dosya ile aynı ada sahip yürütülebilir olmayan bir dosya daha önce varsa $PATH
, sonrakinin yürütülmesine rağmen dash'in ilkini döndürdüğünü unutmayın. Bu bir hatadır ve POSIX standardını ihlal etmektedir. [ Hata raporu ] [ Standart ]
Ayrıca, aradığınız komut bir takma ad olarak tanımlanmışsa bu başarısız olur.
command -v
bile olmayan bir yürütülebilir dosya için bir yol üretmek? Yani, -x gerçekten gerekli mi?
-x
dosyanın yürütülebilir olduğunu sınar, bu da sorunun ne olduğudur .
command
kendisi çalıştırılabilirliğini test edecek - değil mi?
$PATH
komutları yürütülürken çalıştırılamayan dosyalar üzerinde atlar . Ancak, davranışı command -v
çok tutarsızdır. Kısa çizgi içinde $PATH
, çalıştırılabilir olup olmadığına bakılmaksızın, eşleşen ilk dosyayı döndürür . Bash içinde ilk çalıştırılabilir eşleşmeyi döndürür $PATH
, ancak hiçbiri yoksa çalıştırılamayan bir dosya döndürebilir. Ve zsh içinde asla çalıştırılamayan bir dosya döndürmez.
dash
POSIX uyumlu olmayan bu üç taneden sadece biri; [ -x "$(command -v COMMANDNAME)"]
diğer ikisinde çalışacak. Görünüşe göre bu hata zaten bildirildi, ancak henüz bir yanıtı yok: bugs.debian.org/cgi-bin/bugreport.cgi?bug=874264
Lhunath'ın kullanımını caydırmak için katılıyorum which
ve çözümü Bash kullanıcıları için tamamen geçerli . Ancak, daha portatif command -v
olmak için, bunun yerine kullanılacaktır:
$ command -v foo >/dev/null 2>&1 || { echo "I require foo but it's not installed. Aborting." >&2; exit 1; }
Komut command
POSIX uyumlu. Özellikleri için buraya bakın: komut - basit bir komut yürütme
Not: type
POSIX uyumludur, ancak type -P
değildir.
exit 1;
eğer oradan çağrılırsa bir xterm öldürür.
&>/dev/null
. Ancak, size katılıyorum, gerçekten önemli olan şey taşınabilirlik, cevabımı buna göre düzenledim, şimdi standart sh yönlendirmesini kullanarak >/dev/null 2>&1
.
Bunu kolaylaştıran .bashrc dosyamda tanımlanan bir fonksiyonum var.
command_exists () {
type "$1" &> /dev/null ;
}
İşte nasıl kullanıldığına dair bir örnek (benim .bash_profile
.)
if command_exists mvim ; then
export VISUAL="mvim --nofork"
fi
&>
?
&>
Stderr stdout ve hem yönlendirir birlikte.
&>
Bash sürümünüzde mevcut olmayabilir. Marcello'nun kodu iyi çalışmalıdır; aynı şeyi yapar.
$PATH
Değişken içindeki dizinlerden birinde var olup olmadığını bilmek veya değişkenin mutlak yerini bilmek isteyip istemediğinize bağlıdır . $PATH
Değişkende olup olmadığını bilmek istiyorsanız ,
if which programname >/dev/null; then
echo exists
else
echo does not exist
fi
aksi takdirde kullanın
if [ -x /path/to/programname ]; then
echo exists
else
echo does not exist
fi
/dev/null/
İlk örnekte yeniden yönlendirme , which
programın çıktısını bastırır .
@ Lhunath ve @ GregV'nin cevaplarını genişleterek, bu kontrolü bir if
ifadeye kolayca koymak isteyenlerin kodu :
exists()
{
command -v "$1" >/dev/null 2>&1
}
Bunu nasıl kullanacağınız aşağıda açıklanmıştır:
if exists bash; then
echo 'Bash exists!'
else
echo 'Your system does not have Bash'
fi
command
, biraz mantıksız olabilecek takma adlar için bile başarılı olmasıdır. Etkileşimli bir kabukta varlığını kontrol etmek, onu bir komut dosyasına taşıdığınızdan farklı sonuçlar verir.
shopt -u expand_aliases
takma adlar gizler kullanarak / gizler ( alias ls='ls -F'
başka bir cevap yukarıda belirtildiği gibi ) ve shopt -s expand_aliases
onları giderir command -v
. Bu nedenle, belki de kontrol öncesinde ve sonra ayarlanmadan önce ayarlanmalıdır, ancak komut çağrısının çıktısını açıkça yakalamaz ve döndürmezseniz, işlev dönüş değerini etkileyebilir.
Kullanmayı deneyin:
test -x filename
veya
[ -x filename ]
Koşullu İfadeler altındaki Bash kılavuzundan :
-x file True if file exists and is executable.
Kullanmak için hash
, @lhunath anlaşılacağı gibi bir Bash komut:
hash foo &> /dev/null
if [ $? -eq 1 ]; then
echo >&2 "foo not found."
fi
Bu komut dosyası çalışır hash
ve en son kaydedilen komutun çıkış kodunun $?
eşit olup olmadığını denetler 1
. Eğer hash
bulamazsa foo
, çıkış kodu olacaktır 1
. Varsa foo
, çıkış kodu0
.
&> /dev/null
yönlendirmeleri standart hatasını ve standart çıktıyı gelen hash
bu ekranda görünmez şekilde ve echo >&2
standart hata mesajı yazar.
if hash foo &> /dev/null; then ...
?
Erişebileceğim kutuda çalışmak için önceki cevapları hiç almadım. Birincisi, type
kuruldu (ne more
yapıyor). Yani yerleşik yönerge gereklidir. Bu komut benim için çalışıyor:
if [ `builtin type -p vim` ]; then echo "TRUE"; else echo "FALSE"; fi
if
sözdiziminin bir parçası değildir , sadece kullanın if builtin type -p vim; then ...
. Ve backticks gerçekten eski ve onaylanmamış sözdizimi, tüm modern sistemlerde $()
bile desteklenmektedir sh
.
Birden fazla bağımlılığı kontrol edin ve durumu son kullanıcılara bildirin
for cmd in latex pandoc; do
printf '%-10s' "$cmd"
if hash "$cmd" 2>/dev/null; then
echo OK
else
echo missing
fi
done
Örnek çıktı:
latex OK
pandoc missing
10
Maksimum komut uzunluğunu ayarlayın . Otomatik değil, çünkü bunu yapmak için ayrıntılı olmayan bir POSIX yolu göremiyorum:
Bash'ta boşlukla ayrılmış bir tablonun sütunlarını nasıl hizalayabilirim?
Bazı apt
paketlerin kurulu olup olmadığını kontrol edin dpkg -s
ve aksi halde kurun .
Bkz: apt-get paketinin kurulu olup olmadığını kontrol edin ve Linux'ta değilse kurun
Daha önce şu adreste bahsedildi: Bir programın Bash betiğinden olup olmadığını nasıl kontrol edebilirim?
column -t
(util-linux'un bir parçası).
Programın varlığını kontrol ederseniz, muhtemelen daha sonra yine de çalıştıracaksınız. Neden ilk etapta çalıştırmaya çalışmıyorsunuz?
if foo --version >/dev/null 2>&1; then
echo Found
else
echo Not found
fi
Programın çalışıp çalışmadığını yalnızca PATH dizinlerine ve dosya izinlerine bakmaktan daha güvenilir bir şekilde kontrol edin.
Ayrıca, sürümü gibi programınızdan bazı yararlı sonuçlar alabilirsiniz.
Tabii ki dezavantajları bazı programların başlatılması için ağır olabileceği ve bazılarının --version
hemen (ve başarılı bir şekilde) çıkma seçeneğinin olmamasıdır.
hash foo 2>/dev/null
: Z kabuğu (Zsh), Bash, Dash ve ash ile çalışır .
type -p foo
: Z kabuğu, Bash ve ash ( BusyBox ) ile çalışıyor gibi görünüyor , ancak Dash ile değil ( -p
argüman olarak yorumlanıyor ).
command -v foo
: Z kabuğu, Bash, Dash ile çalışır, ancak ash (BusyBox) ( -ash: command: not found
) ile çalışmaz .
Ayrıca builtin
kül ve Dash ile mevcut olmadığını da unutmayın .
Aşağıdakileri yapabiliyorsanız Bash yerleşiklerini kullanın:
which programname
...
type -P programname
which
Bash yerleşkesi değil.
-P
POSIX değil. Neden type -P
tercih edilir?
-v
POSIX_BUILTINS seçeneği sınanacak şekilde ayarlanmışsa komut iyi çalışır <command>
, ancak değilse başarısız olabilir. (Benim için yıllarca çalıştı, ama son zamanlarda işe yaramadığı bir yerde karşılaştım.)
Aşağıdakilerin daha başarısız olduğunu düşünüyorum:
test -x $(which <command>)
Üç şeyi test ettiğinden: yol, varlık ve yürütme izni.
test -x $(which ls)
0 döndürür .test -x $(which sudo)
ls
sudo
test -x "$(which <command>)"
ls
de takma addır ? Komutun parametresi varsa işe yarayacağını sanmıyorum.
İlgilenenler için, yüklü bir kitaplığı algılamak istiyorsanız önceki yanıtlardaki yöntemlerden hiçbiri çalışmaz. Ya (fiziksel olarak üstbilgi dosyaları ve benzeri için) yolu veya böyle bir şey (Debian tabanlı bir dağıtımda iseniz) fiziksel olarak kontrol ile bırakıldığını hayal:
dpkg --status libdb-dev | grep -q not-installed
if [ $? -eq 0 ]; then
apt-get install libdb-dev
fi
Yukarıdan görebileceğiniz gibi, sorgudan bir "0" cevabı paketin kurulu olmadığı anlamına gelir. Bu "grep" işlevidir - "0" bir eşleşme bulunduğunu, "1" eşleşmenin bulunmadığını gösterir.
cmd; if [ $? -eq 0 ]; then
yeniden düzenlenmesi gerekirif cmd; then
dpkg
veya aracılığıyla yüklenen kütüphaneler için geçerlidirapt
Burada bir ton seçenek var, ama hızlı bir gömlek olmamasına şaşırdım. Senaryolarımın başında kullandığım şey bu:
[[ "$(command -v mvn)" ]] || { echo "mvn is not installed" 1>&2 ; exit 1; }
[[ "$(command -v java)" ]] || { echo "java is not installed" 1>&2 ; exit 1; }
Bu, burada seçilen cevaba ve başka bir kaynağa dayanmaktadır.
Sarkan alias
es nedeniyle taşınabilir ve% 100 güvenilir bir yol olmadığını söyleyebilirim . Örneğin:
alias john='ls --color'
alias paul='george -F'
alias george='ls -h'
alias ringo=/
Tabii ki, sadece sonuncusu sorunlu (Ringo'ya suç yok!). Ancak hepsi alias
, bakış açısından geçerli eslerdir command -v
.
Böyle sarkan olanları reddetmek ringo
için, kabuk yerleşik alias
komutunun çıktısını ayrıştırıp bunlara geri dönmeliyiz ( burada command -v
daha üstün değil alias
.) Bunun için taşınabilir bir çözüm ve hatta bir Bash- özel çözüm oldukça sıkıcıdır.
Böyle bir çözümün koşulsuz olarak reddedileceğini unutmayın alias ls='ls -F'
:
test() { command -v $1 | grep -qv alias }
shopt -u expand_aliases
bu takma adları yok sayar / gizler ve shopt -s expand_aliases
aracılığıyla gösterir command -v
.
Bu, programın var olup olmadığını konuma göre söyleyecektir:
if [ -x /usr/bin/yum ]; then
echo "This is Centos"
fi
which
Komut yararlı olabilir. hangi adam
Yürütülebilir dosya bulunursa 0, yürütülebilir ya da yürütülebilir değilse 1 döndürür:
NAME
which - locate a command
SYNOPSIS
which [-a] filename ...
DESCRIPTION
which returns the pathnames of the files which would
be executed in the current environment, had its
arguments been given as commands in a strictly
POSIX-conformant shell. It does this by searching
the PATH for executable files matching the names
of the arguments.
OPTIONS
-a print all matching pathnames of each argument
EXIT STATUS
0 if all specified commands are
found and executable
1 if one or more specified commands is nonexistent
or not executable
2 if an invalid option is specified
Güzel bir şey which
, çalıştırılabilir ortamda which
çalıştırılabilir ortamda kullanılabilir olup olmadığını anlamasıdır - birkaç sorundan tasarruf sağlar ...
Debian kurulumum sunucusu :
Birden fazla paket aynı adı içerdiğinde sorun yaşadım.
Örneğin apache2
. Bu benim çözümümdü:
function _apt_install() {
apt-get install -y $1 > /dev/null
}
function _apt_install_norecommends() {
apt-get install -y --no-install-recommends $1 > /dev/null
}
function _apt_available() {
if [ `apt-cache search $1 | grep -o "$1" | uniq | wc -l` = "1" ]; then
echo "Package is available : $1"
PACKAGE_INSTALL="1"
else
echo "Package $1 is NOT available for install"
echo "We can not continue without this package..."
echo "Exitting now.."
exit 0
fi
}
function _package_install {
_apt_available $1
if [ "${PACKAGE_INSTALL}" = "1" ]; then
if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
echo "package is already_installed: $1"
else
echo "installing package : $1, please wait.."
_apt_install $1
sleep 0.5
fi
fi
}
function _package_install_no_recommends {
_apt_available $1
if [ "${PACKAGE_INSTALL}" = "1" ]; then
if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
echo "package is already_installed: $1"
else
echo "installing package : $1, please wait.."
_apt_install_norecommends $1
sleep 0.5
fi
fi
}
Sizler / kızlar sizin cevaplarınızdaki şeyleri işe yaramıyorsa ve saçınızı sırtınızdan çekiyorsanız, aynı komutu kullanarak bash -c
. Sadece bu somnambular deliryuma bakın. $ (Alt-komut) çalıştırdığınızda gerçekten olan budur:
İlk. Size tamamen farklı çıktılar verebilir.
$ command -v ls
alias ls='ls --color=auto'
$ bash -c "command -v ls"
/bin/ls
İkinci. Size hiç çıktı veremez.
$ command -v nvm
nvm
$ bash -c "command -v nvm"
$ bash -c "nvm --help"
bash: nvm: command not found
.bashrc
bir [ -z "$PS1" ] && return
prepended var, # If not running interactively, don't do anything
bu yüzden sanırım neden interaktif olmayan modda bashrc açık kaynak bile yardımcı olmaz. Sorun, bir ss64.com/bash/source.html nokta işleci ile bir komut dosyası çağırarak çözülebilir. ./script.sh
, ancak bu her seferinde yazmak hatırlamak istediğiniz bir şey değildir.
Hash-variant'ın bir tuzağı vardır: Komut satırına örneğin şunu yazabilirsiniz:
one_folder/process
işlemin yürütülmesi. Bunun için one_folder öğesinin üst klasörü $ PATH olmalıdır . Ancak bu komutu hash etmeye çalıştığınızda, her zaman başarılı olacaktır:
hash one_folder/process; echo $? # will always output '0'
$PATH
" —Bu tamamen yanlış. Dene. Bunun çalışması için, geçerli klasörde one_folder olmalıdır .
İkincisi "komut -v" kullanımını. Örneğin şöyle:
md=$(command -v mkdirhier) ; alias md=${md:=mkdir} # bash
emacs="$(command -v emacs) -nw" || emacs=nano
alias e=$emacs
[[ -z $(command -v jed) ]] && alias jed=$emacs
Git'in CI sunucumuzu dağıtmanın bir parçası olarak kurulduğunu kontrol etmek zorunda kaldım . Son Bash betiğim şöyleydi (Ubuntu sunucusu):
if ! builtin type -p git &>/dev/null; then
sudo apt-get -y install git-core
fi
sudo
: şartlı olmadan, her zaman durur ve şifre ister (son zamanlarda bir sudo yapmadıysanız). BTW, sudo -p "Type your password to install missing git-core: "
istemin maviden çıkmaması yararlı olabilir .
Bash'ları taklit etmek type -P cmd
için POSIX uyumlu kullanabiliriz env -i type cmd 1>/dev/null 2>&1
.
man env
# "The option '-i' causes env to completely ignore the environment it inherits."
# In other words, there are no aliases or functions to be looked up by the type command.
ls() { echo 'Hello, world!'; }
ls
type ls
env -i type ls
cmd=ls
cmd=lsx
env -i type $cmd 1>/dev/null 2>&1 || { echo "$cmd not found"; exit 1; }
type
Bir gibi görünüyor builtin
bu çünkü çalışamaz böylece en kabuklarda env
kullanır execvp
çalıştırmak command
böylece command
bir olamaz builtin
(ve builtin
her zaman aynı ortamı içinde idare edilecek). Bu benim için başarısız bash
, ksh93
, zsh
, busybox [a]sh
ve dash
hepsini sağlayan type
bir kabuk yerleşiği olarak.
Kullanılabilir herhangi bir harici type
komut yoksa ( burada verildiği gibi ) POSIX uyumlu kullanabiliriz env -i sh -c 'type cmd 1>/dev/null 2>&1'
:
# Portable version of Bash's type -P cmd (without output on stdout)
typep() {
command -p env -i PATH="$PATH" sh -c '
export LC_ALL=C LANG=C
cmd="$1"
cmd="`type "$cmd" 2>/dev/null || { echo "error: command $cmd not found; exiting ..." 1>&2; exit 1; }`"
[ $? != 0 ] && exit 1
case "$cmd" in
*\ /*) exit 0;;
*) printf "%s\n" "error: $cmd" 1>&2; exit 1;;
esac
' _ "$1" || exit 1
}
# Get your standard $PATH value
#PATH="$(command -p getconf PATH)"
typep ls
typep builtin
typep ls-temp
En azından Bash 4.2.24 kullanan Mac OS Xv10.6.8'de (Snow Leopard) (2)command -v ls
eşleşmiyor /bin/ls-temp
.
Bir program varsa durumunda denetlemek istediğiniz bir programı ve gerçekten bir Bash yerleşik komutu , daha sonra command
, type
vehash
olmayan komutlar yerleşik için onlar gibi tüm return 0 çıkış durumu test etmek için benimsedikleri görülmüştür.
Örneğin, yerleşik zaman komutundan daha fazla özellik sunan bir zaman programı vardır . Programın var olup olmadığını kontrol etmek için aşağıdaki örnekte olduğu gibi kullanılmasını öneririm :which
# First check if the time program exists
timeProg=`which time`
if [ "$timeProg" = "" ]
then
echo "The time program does not exist on this system."
exit 1
fi
# Invoke the time program
$timeProg --quiet -o result.txt -f "%S %U + p" du -sk ~
echo "Total CPU time: `dc -f result.txt` seconds"
rm result.txt
Aynı sorunun bir Makefile içinde cevaplanmasını istedim.
install:
@if [[ ! -x "$(shell command -v ghead)" ]]; then \
echo 'ghead does not exist. Please install it.'; \
exit -1; \
fi
Senaryo
#!/bin/bash
# Commands found in the hash table are checked for existence before being
# executed and non-existence forces a normal PATH search.
shopt -s checkhash
function exists() {
local mycomm=$1; shift || return 1
hash $mycomm 2>/dev/null || \
printf "\xe2\x9c\x98 [ABRT]: $mycomm: command does not exist\n"; return 1;
}
readonly -f exists
exists notacmd
exists bash
hash
bash -c 'printf "Fin.\n"'
Sonuç
✘ [ABRT]: notacmd: command does not exist
hits command
0 /usr/bin/bash
Fin.
Bunu kullanıyorum, çünkü çok kolay:
if [ `LANG=C type example 2>/dev/null|wc -l` = 1 ];then echo exists;else echo "not exists";fi
veya
if [ `LANG=C type example 2>/dev/null|wc -l` = 1 ];then
echo exists
else echo "not exists"
fi
Standart çıktıya kabuk yerleşiklerini ve programların yankı durumunu kullanır ve standart hataya hiçbir şey kullanmaz. Diğer yandan, bir komut bulunmazsa, durumu yalnızca standart hataya yansıtır.
which
bunlar için true değerini döndürür.type
bağımsız değişkenler ek olarak ayrılmış sözcükler ve kabuk yerleşikleri için true değerini döndürür. "Program" "içinde excutable" anlamına geliyorsa$PATH
, bu cevaba bakınız .