/ atom.sh
atom.sh
1 #!/bin/bash 2 3 if [ "$(uname)" == 'Darwin' ]; then 4 OS='Mac' 5 elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then 6 OS='Linux' 7 else 8 echo "Your platform ($(uname -a)) is not supported." 9 exit 1 10 fi 11 12 case $(basename $0) in 13 atom-beta) 14 CHANNEL=beta 15 ;; 16 atom-nightly) 17 CHANNEL=nightly 18 ;; 19 atom-dev) 20 CHANNEL=dev 21 ;; 22 *) 23 CHANNEL=stable 24 ;; 25 esac 26 27 # Only set the ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT env var if it hasn't been set. 28 if [ -z "$ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT" ] 29 then 30 export ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT=true 31 fi 32 33 ATOM_ADD=false 34 ATOM_NEW_WINDOW=false 35 EXIT_CODE_OVERRIDE= 36 37 while getopts ":anwtfvh-:" opt; do 38 case "$opt" in 39 -) 40 case "${OPTARG}" in 41 add) 42 ATOM_ADD=true 43 ;; 44 new-window) 45 ATOM_NEW_WINDOW=true 46 ;; 47 wait) 48 WAIT=1 49 ;; 50 help|version) 51 REDIRECT_STDERR=1 52 EXPECT_OUTPUT=1 53 ;; 54 foreground|benchmark|benchmark-test|test) 55 EXPECT_OUTPUT=1 56 ;; 57 enable-electron-logging) 58 export ELECTRON_ENABLE_LOGGING=1 59 ;; 60 esac 61 ;; 62 a) 63 ATOM_ADD=true 64 ;; 65 n) 66 ATOM_NEW_WINDOW=true 67 ;; 68 w) 69 WAIT=1 70 ;; 71 h|v) 72 REDIRECT_STDERR=1 73 EXPECT_OUTPUT=1 74 ;; 75 f|t) 76 EXPECT_OUTPUT=1 77 ;; 78 esac 79 done 80 81 if [ "${ATOM_ADD}" = "true" ] && [ "${ATOM_NEW_WINDOW}" = "true" ]; then 82 EXPECT_OUTPUT=1 83 EXIT_CODE_OVERRIDE=1 84 fi 85 86 if [ $REDIRECT_STDERR ]; then 87 exec 2> /dev/null 88 fi 89 90 ATOM_HOME="${ATOM_HOME:-$HOME/.atom}" 91 mkdir -p "$ATOM_HOME" 92 93 if [ $OS == 'Mac' ]; then 94 if [ -L "$0" ]; then 95 SCRIPT="$(readlink "$0")" 96 else 97 SCRIPT="$0" 98 fi 99 ATOM_APP="$(dirname "$(dirname "$(dirname "$(dirname "$SCRIPT")")")")" 100 if [ "$ATOM_APP" == . ]; then 101 unset ATOM_APP 102 else 103 ATOM_PATH="$(dirname "$ATOM_APP")" 104 ATOM_APP_NAME="$(basename "$ATOM_APP")" 105 fi 106 107 if [ ! -z "${ATOM_APP_NAME}" ]; then 108 # If ATOM_APP_NAME is known, use it as the executable name 109 ATOM_EXECUTABLE_NAME="${ATOM_APP_NAME%.*}" 110 else 111 # Else choose it from the inferred channel name 112 if [ "$CHANNEL" == 'beta' ]; then 113 ATOM_EXECUTABLE_NAME="Atom Beta" 114 elif [ "$CHANNEL" == 'nightly' ]; then 115 ATOM_EXECUTABLE_NAME="Atom Nightly" 116 elif [ "$CHANNEL" == 'dev' ]; then 117 ATOM_EXECUTABLE_NAME="Atom Dev" 118 else 119 ATOM_EXECUTABLE_NAME="Atom" 120 fi 121 fi 122 123 if [ -z "${ATOM_PATH}" ]; then 124 # If ATOM_PATH isn't set, check /Applications and then ~/Applications for Atom.app 125 if [ -x "/Applications/$ATOM_APP_NAME" ]; then 126 ATOM_PATH="/Applications" 127 elif [ -x "$HOME/Applications/$ATOM_APP_NAME" ]; then 128 ATOM_PATH="$HOME/Applications" 129 else 130 # We haven't found an Atom.app, use spotlight to search for Atom 131 ATOM_PATH="$(mdfind "kMDItemCFBundleIdentifier == 'com.github.atom'" | grep -v ShipIt | head -1 | xargs -0 dirname)" 132 133 # Exit if Atom can't be found 134 if [ ! -x "$ATOM_PATH/$ATOM_APP_NAME" ]; then 135 echo "Cannot locate ${ATOM_APP_NAME}, it is usually located in /Applications. Set the ATOM_PATH environment variable to the directory containing ${ATOM_APP_NAME}." 136 exit 1 137 fi 138 fi 139 fi 140 141 if [ $EXPECT_OUTPUT ]; then 142 "$ATOM_PATH/$ATOM_APP_NAME/Contents/MacOS/$ATOM_EXECUTABLE_NAME" --executed-from="$(pwd)" --pid=$$ "$@" 143 ATOM_EXIT=$? 144 if [ ${ATOM_EXIT} -eq 0 ] && [ -n "${EXIT_CODE_OVERRIDE}" ]; then 145 exit "${EXIT_CODE_OVERRIDE}" 146 else 147 exit ${ATOM_EXIT} 148 fi 149 else 150 open -a "$ATOM_PATH/$ATOM_APP_NAME" -n --args --executed-from="$(pwd)" --pid=$$ --path-environment="$PATH" "$@" 151 fi 152 elif [ $OS == 'Linux' ]; then 153 SCRIPT=$(readlink -f "$0") 154 USR_DIRECTORY=$(readlink -f $(dirname $SCRIPT)/..) 155 156 case $CHANNEL in 157 beta) 158 ATOM_PATH="$USR_DIRECTORY/share/atom-beta/atom" 159 ;; 160 nightly) 161 ATOM_PATH="$USR_DIRECTORY/share/atom-nightly/atom" 162 ;; 163 dev) 164 ATOM_PATH="$USR_DIRECTORY/share/atom-dev/atom" 165 ;; 166 *) 167 ATOM_PATH="$USR_DIRECTORY/share/atom/atom" 168 ;; 169 esac 170 171 : ${TMPDIR:=/tmp} 172 173 [ -x "$ATOM_PATH" ] || ATOM_PATH="$TMPDIR/atom-build/Atom/atom" 174 175 if [ $EXPECT_OUTPUT ]; then 176 "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" 177 ATOM_EXIT=$? 178 if [ ${ATOM_EXIT} -eq 0 ] && [ -n "${EXIT_CODE_OVERRIDE}" ]; then 179 exit "${EXIT_CODE_OVERRIDE}" 180 else 181 exit ${ATOM_EXIT} 182 fi 183 else 184 ( 185 nohup "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" > "$ATOM_HOME/nohup.out" 2>&1 186 if [ $? -ne 0 ]; then 187 cat "$ATOM_HOME/nohup.out" 188 exit $? 189 fi 190 ) & 191 fi 192 fi 193 194 # Exits this process when Atom is used as $EDITOR 195 on_die() { 196 exit 0 197 } 198 trap 'on_die' SIGQUIT SIGTERM 199 200 # If the wait flag is set, don't exit this process until Atom kills it. 201 if [ $WAIT ]; then 202 WAIT_FIFO="$ATOM_HOME/.wait_fifo" 203 204 if [ ! -p "$WAIT_FIFO" ]; then 205 rm -f "$WAIT_FIFO" 206 mkfifo "$WAIT_FIFO" 207 fi 208 209 # Block endlessly by reading from a named pipe. 210 exec 2>/dev/null 211 read < "$WAIT_FIFO" 212 213 # If the read completes for some reason, fall back to sleeping in a loop. 214 while true; do 215 sleep 1 216 done 217 fi